This makes the process dump a core file.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 collie/collie.c | 12 ++++++++++++
 lib/logger.c    |  8 ++++++++
 lib/util.c      |  2 +-
 sheep/sheep.c   |  6 ++++++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/collie/collie.c b/collie/collie.c
index 2394350..c15071a 100644
--- a/collie/collie.c
+++ b/collie/collie.c
@@ -320,6 +320,18 @@ static void crash_handler(int signo)
 
        sd_backtrace();
 
+       /*
+        * OOM raises SIGABRT in xmalloc but the administrator expects
+        * that collie exits with EXIT_SYSFAIL.  We have to give up
+        * dumping a core file in this case.
+        */
+       if (signo != SIGABRT) {
+               raise(signo);
+
+               fprintf(stderr, "signal (%s) didn't terminate the process.",
+                       strsignal(signo));
+       }
+
        exit(EXIT_SYSFAIL);
 }
 
diff --git a/lib/logger.c b/lib/logger.c
index a31cb1f..d435a74 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -489,6 +489,14 @@ static notrace void crash_handler(int signo)
        log_flush();
        closelog();
        free_logarea();
+
+       if (signo != SIGHUP) {
+               raise(signo);
+
+               sd_printf(SDOG_EMERG,
+                         "signal (%s) didn't terminate the process.",
+                         strsignal(signo));
+       }
        exit(1);
 }
 
diff --git a/lib/util.c b/lib/util.c
index 39779a5..b5f005f 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -380,7 +380,7 @@ int install_sighandler(int signum, void (*handler)(int), 
bool once)
 
        sa.sa_handler = handler;
        if (once)
-               sa.sa_flags = SA_RESETHAND;
+               sa.sa_flags = SA_RESETHAND | SA_NODEFER;
        sigemptyset(&sa.sa_mask);
 
        return sigaction(signum, &sa, NULL);
diff --git a/sheep/sheep.c b/sheep/sheep.c
index cda8493..6520a2c 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -182,6 +182,12 @@ static void crash_handler(int signo)
 
        sd_backtrace();
        sd_dump_variable(__sys);
+
+       raise(signo);
+
+       sd_printf(SDOG_EMERG, "signal (%s) didn't terminate the process.",
+                 strsignal(signo));
+       exit(1);
 }
 
 static struct cluster_info __sys;
-- 
1.8.1.3.566.gaa39828

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to