[Sheepdog] [PATCH] logger: fix pid confusion

Christoph Hellwig hch at infradead.org
Sun Apr 29 15:32:30 CEST 2012


We need to store the logger (child) pid in a variable as getppid() fails
inside the death handler.  Instead of going back to using the pid variable
like it was done before "logger: improve death messages" use two different
variable for the sheep and logger, and comment on why we perform this
confusing dance, so that it doesn't get accidentally removed again.

Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/lib/logger.c b/lib/logger.c
index 05e62a0..5bce85c 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -50,7 +50,8 @@ static struct logarea *la;
 static char *log_name;
 static char *log_nowname;
 static int log_level = SDOG_INFO;
-static pid_t pid;
+static pid_t sheep_pid;
+static pid_t logger_pid;
 static key_t semkey;
 
 static int64_t max_logsize = 500 * 1024 * 1024;  /*500MB*/
@@ -385,10 +386,11 @@ static notrace void crash_handler(int signo)
 		vprintf(SDOG_ERR, "logger pid %d segfaulted.\n",
 			getpid());
 	} else if (signo == SIGHUP) {
-		vprintf(SDOG_ERR, "sheep pid %d exited unexpectedly.\n", pid);
+		vprintf(SDOG_ERR, "sheep pid %d exited unexpectedly.\n",
+			sheep_pid);
 	} else {
 		vprintf(SDOG_ERR, "logger pid %d got unexpected signal %d.\n",
-			pid, signo);
+			getpid(), signo);
 	}
 
 	log_flush();
@@ -435,12 +437,21 @@ notrace int log_init(char *program_name, int size, int to_stdout, int level,
 
 		la->active = 1;
 		la->fd = fd;
-		pid = fork();
-		if (pid < 0) {
+
+		/*
+		 * Store the pid of the sheep process for use by the death
+		 * signal handler.  By the time the child is notified of
+		 * the parents death the parent has been reparanted to init
+		 * and getppid() will always return 1.
+		 */
+		sheep_pid = getpid();
+
+		logger_pid = fork();
+		if (logger_pid < 0) {
 			syslog(LOG_ERR, "failed to fork the logger process: %m\n");
 			return 1;
-		} else if (pid) {
-			syslog(LOG_WARNING, "logger pid %d starting\n", pid);
+		} else if (logger_pid) {
+			syslog(LOG_WARNING, "logger pid %d starting\n", logger_pid);
 			return 0;
 		}
 
@@ -498,9 +509,9 @@ notrace void log_close(void)
 {
 	if (la) {
 		la->active = 0;
-		waitpid(pid, NULL, 0);
+		waitpid(logger_pid, NULL, 0);
 
-		vprintf(SDOG_WARNING, "logger pid %d stopped\n", pid);
+		vprintf(SDOG_WARNING, "logger pid %d stopped\n", logger_pid);
 		log_flush();
 		closelog();
 		free_logarea();



More information about the sheepdog mailing list