[Sheepdog] [PATCH v2] sheep: stop logger process before terminating

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Sun Aug 14 09:42:23 CEST 2011


Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---

This approach looks better.  We can also handle the crash of sheep.


 lib/logger.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/lib/logger.c b/lib/logger.c
index 15699f0..5d0cc8d 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -27,6 +27,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <sys/prctl.h>
 
 #include "logger.h"
 
@@ -361,6 +362,15 @@ static void log_flush(void)
 	}
 }
 
+static void log_sigsegv(void)
+{
+	vprintf(SDOG_ERR "sheep logger exits abnormally, pid:%d\n", getpid());
+	log_flush();
+	closelog();
+	free_logarea();
+	exit(1);
+}
+
 int log_init(char *program_name, int size, int is_daemon, int level, char *outfile)
 {
 	log_level = level;
@@ -420,11 +430,13 @@ int log_init(char *program_name, int size, int is_daemon, int level, char *outfi
 		}
 
 		/* flush on daemon's crash */
-		sa_new.sa_handler = (void*)log_flush;
+		sa_new.sa_handler = (void*)log_sigsegv;
 		sigemptyset(&sa_new.sa_mask);
 		sa_new.sa_flags = 0;
 		sigaction(SIGSEGV, &sa_new, &sa_old );
 
+		prctl(PR_SET_PDEATHSIG, SIGSEGV);
+
 		while (la->active) {
 			log_flush();
 			sleep(1);
-- 
1.7.2.5




More information about the sheepdog mailing list