On Thu, Mar 03, 2011 at 11:41:51AM +0000, Daniel P. Berrange wrote:
On Thu, Mar 03, 2011 at 06:22:17PM +0800, Daniel Veillard wrote:
>
> In case of imminent crash or upon request (signal USR2),
> dump the logging buffer to the libvirtd.log file for
> post-mortem analysis
> * daemon/libvirtd.c: create a sig_fatal() handler connected to
> SIGFPE SIGSEGV SIGILL SIGABRT SIGBUS and SIGUSR2, just dumping
> the log buffer to the libvirtd.log open file descriptor
[...]
> + /*
> + * If the signal is fatal, avoid looping over this handler
> + * by desactivating it
> + */
> + if (sig != SIGUSR2) {
> + sig_action.sa_flags = SA_SIGINFO;
> + sig_action.sa_handler = SIG_IGN;
> + sigaction(sig, &sig_action, NULL);
> + }
> + errno = origerrno;
> +}
I think this code should really be part of the logging.c file. eg create
an API like:
void virLogEmergencyDumpAll(int signum)
And have that dump the cached log buffer to all registered log outputs.
We'd have to excluding any syslog one which isn't async signal safe, but
the 'stderr' or 'file' log outputs can be made async signal safe.
yeah, I just need to double check that we just use file descriptor and
not FILE *, but it's trivial to check or convert.
Then, the libvirtd signal handler would just be
static void sig_fatal(int sig, siginfo_t * siginfo ATTRIBUTE_UNUSED,
void* context ATTRIBUTE_UNUSED) {
virLogEmergencyDumpAll(sig);
well we will still need the above bit of sigaction, but yes,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/