[SCM] CTDB repository - branch master updated - ctdb-1.0.108-60-gea9e393

Ronnie Sahlberg sahlberg at samba.org
Mon Dec 14 17:03:26 MST 2009


The branch, master has been updated
       via  ea9e39369379939abf6a4076fa2014c10c1a9ad0 (commit)
       via  211ea7907e8e96041aa6f7d086551d64d065a8a3 (commit)
      from  5c8e56fc7a518e115bceac257867739283cf6a1e (commit)

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


- Log -----------------------------------------------------------------
commit ea9e39369379939abf6a4076fa2014c10c1a9ad0
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Dec 15 10:45:18 2009 +1100

    When setting up the logging, set the event to trigger a read of a log message from a child process as a child of the "log" structure and not the ctdb structure,
    or else we can crash if we receive log messages from a child but the log structure has been freed()

commit 211ea7907e8e96041aa6f7d086551d64d065a8a3
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Dec 15 10:23:58 2009 +1100

    From rusty:
    
    Subject: eventscript: fix spinning at 100% cpu when child exits.
    
    ctdbd was spinning reading 0 from a pipe, as soon as the first
    eventscript finishes.
    
    This was caused by the intersection between a78b8ea7168e "Run only one
    event for each epoll_wait/select call" and 32cfdc3aec34 "eventscript:
    ctdb_fork_with_logging()".  Unavoidable mid-air collision, since both
    worked fine and both were developed simultaneously.
    
    When the script exits, we have two pipes open to it: one for any
    stdout/stderr for logging (ctdb_log_handler), and one for the result
    (ctdb_event_script_handler).  The latter frees everything, including
    the log fd and event structure.
    
    We used to get one callback to ctdb_log_handler, which got a harmless
    0-length read, then one to ctdb_event_script_handler which cleaned up.
    Now we only do one callback per poll, we need the logging function to
    clean itself up so we can make process.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>

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

Summary of changes:
 server/ctdb_logging.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)


Changeset truncated at 500 lines:

diff --git a/server/ctdb_logging.c b/server/ctdb_logging.c
index 7dadbfd..770deb6 100644
--- a/server/ctdb_logging.c
+++ b/server/ctdb_logging.c
@@ -381,6 +381,9 @@ static void ctdb_log_handler(struct event_context *ev, struct fd_event *fde,
 		 sizeof(log->buf) - log->buf_used);
 	if (n > 0) {
 		log->buf_used += n;
+	} else if (n == 0) {
+		talloc_free(log);
+		return;
 	}
 
 	this_log_level = script_log_level;
@@ -506,7 +509,7 @@ int ctdb_set_child_logging(struct ctdb_context *ctdb)
 		return -1;
 	}
 
-	event_add_fd(ctdb->ev, ctdb, p[0], EVENT_FD_READ, 
+	event_add_fd(ctdb->ev, ctdb->log, p[0], EVENT_FD_READ, 
 		     ctdb_log_handler, ctdb->log);
 	set_close_on_exec(p[0]);
 	ctdb->log->pfd = p[0];


-- 
CTDB repository


More information about the samba-cvs mailing list