# HG changeset patch # User Bernd Schubert <bernd.schub...@fastmail.fm> # Date 1289577717 -3600 # Node ID 8b4e11cab67165eb44bd89b9cbb0319078fc8fbc # Parent 112b6e5408892b791dbd46b66ce75fe98dd06c26 ha_logd: Add a SIGHUP signal handler to close/open log files
Without the signal handler cl_log uses inefficient IO, as it has to open/seek/flush/close the log files in order to allow cron log file rotation. Signed-off-by: Bernd Schubert <bschub...@ddn.com> diff --git a/include/clplumbing/cl_log.h b/include/clplumbing/cl_log.h --- a/include/clplumbing/cl_log.h +++ b/include/clplumbing/cl_log.h @@ -59,8 +59,10 @@ void cl_glib_msg_handler(const gchar *l , gpointer user_data); void cl_flush_logs(void); -void cl_log_args(int argc, char **argv); -int cl_log_is_logd_fd(int fd); -const char * prio2str(int priority); +void cl_log_args(int argc, char **argv); +int cl_log_is_logd_fd(int fd); +void cl_closeopen_log_files(void); +void cl_log_enable_signal_handler(void); +const char * prio2str(int priority); #endif diff --git a/lib/clplumbing/cl_log.c b/lib/clplumbing/cl_log.c --- a/lib/clplumbing/cl_log.c +++ b/lib/clplumbing/cl_log.c @@ -122,6 +122,12 @@ cl_log_is_logd_fd(int fd) } void +cl_log_enable_signal_handler(void) +{ + have_signal_handler = TRUE; +} + +void cl_log_enable_stderr(int truefalse) { stderr_enabled = truefalse; @@ -546,6 +552,30 @@ open_log_file(const char * fname) return fd; } +/* open/re-open log file files + * Also used by the signal handler to allow to logrotate log files + */ +void cl_closeopen_log_files(void) +{ + if (debugfile_name) { + if (debug_fd != -1) { + close(debug_fd); /* ignore errors */ + debug_fd = -1; + } + if (debugfile_name) + debug_fd = open_log_file(debugfile_name); + } + + if (logfile_name) { + if (log_fd != -1) { + close(log_fd); /* ignore errors */ + log_fd = -1; + } + if (logfile_name) + log_fd = open_log_file(logfile_name); + } +} + /* * This function can cost us realtime unless use_logging_daemon * is enabled. Then we log everything through a child process using @@ -580,23 +610,15 @@ cl_direct_log(int priority, const char* entity_pid, pristr, buf, 0); } - if (debugfile_name != NULL) { - if (debug_fd != -1) { - debug_fd = open_log_file(debugfile_name); - } - if (debug_fd != -1) - append_log(debug_fd ,entity, entity_pid, ts, pristr, - buf); + if (debug_fd == -1 || log_fd == -1) { + cl_closeopen_log_files(); } + + if (log_fd != -1) + append_log(debug_fd ,entity, entity_pid, ts, pristr, buf); - if (priority != LOG_DEBUG && logfile_name != NULL) { - if (log_fd != -1) { - log_fd = open_log_file(logfile_name); - } - if (log_fd != -1) - append_log(log_fd ,entity, entity_pid, ts, pristr, - buf); - } + if (priority != LOG_DEBUG && log_fd != -1) + append_log(log_fd ,entity, entity_pid, ts, pristr, buf); if (needprivs) { return_to_dropped_privs(); diff --git a/logd/ha_logd.c b/logd/ha_logd.c --- a/logd/ha_logd.c +++ b/logd/ha_logd.c @@ -727,6 +727,16 @@ logd_term_action(int sig, gpointer userd return TRUE; } +/* + * Handle SIGHUP to re-open log files + */ +static gboolean +logd_hup_action(int sig, gpointer userdata) +{ + cl_closeopen_log_files(); + + return TRUE; +} static void read_msg_process(IPC_Channel* chan) @@ -766,6 +776,10 @@ read_msg_process(IPC_Channel* chan) G_main_add_IPC_Channel(G_PRIORITY_DEFAULT, chan, FALSE,NULL,NULL,NULL); + G_main_add_SignalHandler(G_PRIORITY_DEFAULT, SIGHUP, + logd_hup_action, mainloop, NULL); + cl_log_enable_signal_handler(); + g_main_run(mainloop); return; @@ -875,6 +889,11 @@ write_msg_process(IPC_Channel* readchan) G_main_add_SignalHandler(G_PRIORITY_HIGH, SIGTERM, logd_term_write_action, mainloop, NULL); + + G_main_add_SignalHandler(G_PRIORITY_DEFAULT, SIGHUP, + logd_hup_action, mainloop, NULL); + cl_log_enable_signal_handler(); + g_main_run(mainloop); _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/