[Pacemaker] [PATCH 8/8 ] ha_logd: Add a SIGHUP signal handler to close/open log files

Bernd Schubert bs_lists at aakef.fastmail.fm
Wed Sep 15 18:20:49 EDT 2010


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 <bschubert at 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,7 +59,9 @@ 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);
+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);
 
 #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;
@@ -557,6 +563,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
@@ -591,23 +621,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
@@ -728,6 +728,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)
@@ -767,6 +777,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;
@@ -876,6 +890,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);
 	




More information about the Pacemaker mailing list