[SCM] CTDB repository - branch master updated - ctdb-2.1-22-g00db5fa

Amitay Isaacs amitay at samba.org
Sun Feb 10 17:15:20 MST 2013


The branch, master has been updated
       via  00db5fa00474f8a83f1aa3b603fd756cc9b49ff4 (commit)
      from  b940e3a24daa73ca9b2896b7a449240136442b53 (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 00db5fa00474f8a83f1aa3b603fd756cc9b49ff4
Author: Martin Schwenke <martin at meltin.net>
Date:   Wed Feb 6 14:15:11 2013 +1100

    Logging: Fix breakage when freeing the log ringbuffer
    
    Commit a82d3ec12f0fda16d6bfa8442a07595de897c10e broke fetching from
    the log ringbuffer.  The solution there is still generally good: there
    is no need to keep the ringbuffer in children created by
    ctdb_fork()... except for those special children that are created to
    fetch data from the ringbuffer!
    
    Introduce a new function ctdb_fork_no_free_ringbuffer() that does
    everything ctdb_fork() needs to do except free the ringbuffer (i.e. it
    is the old ctdb_fork() function).  The new ctdb_fork() function just
    calls that function and then frees the ringbuffer in the child.
    
    This means all callers of ctdb_fork() have the convenience of having
    the ringbuffer freed.  There are 3 special cases:
    
    * Forking the recovery daemon.  We want to be able to fetch from the
      ringbuffer there.
    
    * The ringbuffer fetching code.  Change the 2 calls in this code (main
      daemon, recovery daemon) to call ctdb_fork_no_free_ringbuffer()
      instead.
    
    While we're here, clear the log ringbuffer when the recovery deamon is
    forked, since it will contain a copy of the messages from the main
    daemon.
    
    Note to self: always test... even the most obvious patches...  ;-)
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>

-----------------------------------------------------------------------

Summary of changes:
 common/ctdb_fork.c     |   15 ++++++++++++---
 common/ctdb_logging.c  |    2 +-
 include/ctdb_private.h |    1 +
 server/ctdb_recoverd.c |    7 +++++--
 4 files changed, 19 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/common/ctdb_fork.c b/common/ctdb_fork.c
index a11f75a..9e3a06d 100644
--- a/common/ctdb_fork.c
+++ b/common/ctdb_fork.c
@@ -27,7 +27,7 @@
  * This function forks a child process and drops the realtime 
  * scheduler for the child process.
  */
-pid_t ctdb_fork(struct ctdb_context *ctdb)
+pid_t ctdb_fork_no_free_ringbuffer(struct ctdb_context *ctdb)
 {
 	pid_t pid;
 	char *process;
@@ -60,8 +60,6 @@ pid_t ctdb_fork(struct ctdb_context *ctdb)
 		}
 		ctdb->can_send_controls = false;
 
-		ctdb_log_ringbuffer_free();
-
 		return 0;
 	}
 
@@ -75,6 +73,17 @@ pid_t ctdb_fork(struct ctdb_context *ctdb)
 	return pid;
 }
 
+pid_t ctdb_fork(struct ctdb_context *ctdb)
+{
+	pid_t pid;
+
+	pid = ctdb_fork_no_free_ringbuffer(ctdb);
+	if (pid == 0) {
+		ctdb_log_ringbuffer_free();
+	}
+
+	return pid;
+}
 
 
 static void ctdb_sigchld_handler(struct tevent_context *ev,
diff --git a/common/ctdb_logging.c b/common/ctdb_logging.c
index 105b4df..de5ca6e 100644
--- a/common/ctdb_logging.c
+++ b/common/ctdb_logging.c
@@ -163,7 +163,7 @@ int32_t ctdb_control_get_log(struct ctdb_context *ctdb, TDB_DATA addr)
 	/* spawn a child process to marshall the huge log blob and send it back
 	   to the ctdb tool using a MESSAGE
 	*/
-	child = ctdb_fork(ctdb);
+	child = ctdb_fork_no_free_ringbuffer(ctdb);
 	if (child == (pid_t)-1) {
 		DEBUG(DEBUG_ERR,("Failed to fork a log collector child\n"));
 		return -1;
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index cf850aa..7794c4c 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -1072,6 +1072,7 @@ void ctdb_restore_scheduler(struct ctdb_context *ctdb);
 
 struct tevent_signal *ctdb_init_sigchld(struct ctdb_context *ctdb);
 pid_t ctdb_fork(struct ctdb_context *ctdb);
+pid_t ctdb_fork_no_free_ringbuffer(struct ctdb_context *ctdb);
 int ctdb_kill(struct ctdb_context *ctdb, pid_t pid, int signum);
 
 int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb, 
diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c
index bffe2be..95172a1 100644
--- a/server/ctdb_recoverd.c
+++ b/server/ctdb_recoverd.c
@@ -2126,7 +2126,7 @@ static void getlog_handler(struct ctdb_context *ctdb, uint64_t srvid,
 	}
 	log_addr = (struct ctdb_get_log_addr *)data.dptr;
 
-	child = ctdb_fork(ctdb);
+	child = ctdb_fork_no_free_ringbuffer(ctdb);
 	if (child == (pid_t)-1) {
 		DEBUG(DEBUG_ERR,("Failed to fork a log collector child\n"));
 		return;
@@ -4014,7 +4014,7 @@ int ctdb_start_recoverd(struct ctdb_context *ctdb)
 
 	ctdb->ctdbd_pid = getpid();
 
-	ctdb->recoverd_pid = ctdb_fork(ctdb);
+	ctdb->recoverd_pid = ctdb_fork_no_free_ringbuffer(ctdb);
 	if (ctdb->recoverd_pid == -1) {
 		return -1;
 	}
@@ -4035,6 +4035,9 @@ int ctdb_start_recoverd(struct ctdb_context *ctdb)
 
 	srandom(getpid() ^ time(NULL));
 
+	/* Clear the log ringbuffer */
+	ctdb_clear_log(ctdb);
+
 	if (switch_from_server_to_client(ctdb, "recoverd") != 0) {
 		DEBUG(DEBUG_CRIT, (__location__ "ERROR: failed to switch recovery daemon into client mode. shutting down.\n"));
 		exit(1);


-- 
CTDB repository


More information about the samba-cvs mailing list