[SCM] CTDB repository - branch master updated - b1fed105ad780e89a128a611ef0bd659818eeebf

Ronnie Sahlberg sahlberg at samba.org
Wed Jul 23 22:54:48 GMT 2008


The branch, master has been updated
       via  b1fed105ad780e89a128a611ef0bd659818eeebf (commit)
       via  8fed021d11160b137f4140ea02947347250e2959 (commit)
       via  e8ef9891aa31c374921b23cc74e1eda1f8218bf0 (commit)
      from  0de79352c9b36c118e36905f08ebbe38ecbb957e (commit)

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


- Log -----------------------------------------------------------------
commit b1fed105ad780e89a128a611ef0bd659818eeebf
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Jul 23 15:36:23 2008 +1000

    run the testparm commands in 50.samba in the background, only running
    in the foreground if something fails

commit 8fed021d11160b137f4140ea02947347250e2959
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Jul 23 15:35:46 2008 +1000

    allow for probing of directories without raising an error

commit e8ef9891aa31c374921b23cc74e1eda1f8218bf0
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Jul 23 15:25:52 2008 +1000

    fixed buffering in ctdb logging code to handle multiple lines
    correctly

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

Summary of changes:
 config/events.d/50.samba |   96 +++++++++++++++++++++++++++++++++++++++++-----
 config/functions         |   25 +++++++++---
 server/ctdb_logging.c    |   39 ++++++++++---------
 3 files changed, 125 insertions(+), 35 deletions(-)


Changeset truncated at 500 lines:

diff --git a/config/events.d/50.samba b/config/events.d/50.samba
index 9aa21e2..498aa17 100755
--- a/config/events.d/50.samba
+++ b/config/events.d/50.samba
@@ -17,10 +17,81 @@ shift
     SAMBA_CLEANUP_PERIOD=10
 }
 
+# we keep a cached copy of smb.conf here
+smbconf_cache="$CTDB_BASE/state/samba/smb.conf.cache"
+
+
+#############################################
+# update the smb.conf cache in the foreground
+testparm_foreground_update() {
+    mkdir -p "$CTDB_BASE/state/samba" || exit 1
+    testparm -s 2> /dev/null | egrep -v 'registry.shares.=|include.=' > "$smbconf_cache"
+}
+
+#############################################
+# update the smb.conf cache in the background
+testparm_background_update() {
+    # if the cache doesn't exist, then update in the foreground
+    [ -f $smbconf_cache ] || {
+	testparm_foreground_update
+    }
+    # otherwise do a background update
+    (
+	tmpfile="${smbconf_cache}.$$"
+	testparm -s > $tmpfile 2> /dev/null &
+	# remember the pid of the teamparm process
+	pid="$!"
+	# give it 10 seconds to run
+	timeleft=10
+	while [ $timeleft -gt 0 ]; do
+	    timeleft=$(($timeleft - 1))
+	    # see if the process still exists
+	    kill -0 $pid > /dev/null 2>&1 || {
+		# it doesn't exist, grab its exit status
+		wait $pid
+		[ $? = 0 ] || {
+		    echo "50.samba: smb.conf background update exited with status $?"
+		    rm -f "${tmpfile}"
+		    exit 1
+		}		
+		# put the new smb.conf contents in the cache (atomic rename)
+		# make sure we remove references to the registry while doing 
+		# this to ensure that running testparm on the cache does
+		# not use the registry
+		egrep -v 'registry.shares.=|include.=' < "$tmpfile" > "${tmpfile}.2"
+		rm -f "$tmpfile"
+		mv -f "${tmpfile}.2" "$smbconf_cache" || {
+		    echo "50.samba: failed to update background cache"
+		    rm -f "${tmpfile}.2"
+		    exit 1
+		}
+		exit 0
+	    }
+	    # keep waiting for testparm to finish
+	    sleep 1
+	done
+	# it took more than 10 seconds - kill it off
+	rm -f "${tmpfile}"
+	kill -9 "$pid" > /dev/null 2>&1
+	echo "50.samba: timed out updating smbconf cache in background"
+	exit 1
+    ) &
+}
+
+##################################################
+# show the testparm output using a cached smb.conf 
+# to avoid registry access
+testparm_cat() {
+    [ -f $smbconf_cache ] || {
+	testparm_foreground_update
+    }
+    testparm -s "$smbconf_cache" "$@" 2>/dev/null
+}
+
 # function to see if ctdb manages winbind
 check_ctdb_manages_winbind() {
   [ -z "$CTDB_MANAGES_WINBIND" ] && {
-    secmode=`testparm -s --parameter-name=security 2> /dev/null`
+    secmode=`testparm_cat --parameter-name=security`
     case $secmode in
 	ADS|DOMAIN)
 	    CTDB_MANAGES_WINBIND="yes";
@@ -108,21 +179,26 @@ case $cmd in
 		touch $CTDB_BASE/state/samba/periodic_cleanup
 	}
 
-	[ "$CTDB_SAMBA_SKIP_CONF_CHECK" != "yes" ] && {
-		testparm -s 2>&1 | egrep '^WARNING|^ERROR|^Unknown' && {
-			echo "ERROR: testparm shows smb.conf is not clean"
-			exit 1
-		}
+	testparm_background_update
+
+	testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && {
+	    testparm_foreground_update
+	    testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && {
+		echo "ERROR: testparm shows smb.conf is not clean"
+		exit 1
+	    }
 	}
 
-	[ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] && {
-		smb_dirs=`testparm -s 2> /dev/null | egrep '^[[:space:]]*path = '  | cut -d= -f2`
-		ctdb_check_directories "Samba" $smb_dirs	
+	smb_dirs=`testparm_cat | egrep '^[[:space:]]*path = ' | cut -d= -f2`
+	ctdb_check_directories_probe "Samba" $smb_dirs || {
+	    testparm_foreground_update
+	    smb_dirs=`testparm_cat | egrep '^[[:space:]]*path = ' | cut -d= -f2`
+	    ctdb_check_directories "Samba" $smb_dirs
 	}
 
 	smb_ports="$CTDB_SAMBA_CHECK_PORTS"
 	[ -z "$smb_ports" ] && {
-		smb_ports=`testparm -s --parameter-name="smb ports" 2> /dev/null`
+		smb_ports=`testparm_cat --parameter-name="smb ports"`
 	}
 	ctdb_check_tcp_ports "Samba" $smb_ports
 
diff --git a/config/functions b/config/functions
index d15c4b5..20325b1 100644
--- a/config/functions
+++ b/config/functions
@@ -145,19 +145,32 @@ ctdb_check_rpc() {
 
 ######################################################
 # check a set of directories is available
-# usage: ctdb_check_directories SERVICE_NAME <directories...>
+# return 0 on a missing directory
+# usage: ctdb_check_directories_probe SERVICE_NAME <directories...>
 ######################################################
-ctdb_check_directories() {
+ctdb_check_directories_probe() {
   service_name="$1"
   shift
   wait_dirs="$*"
   [ -z "$wait_dirs" ] && return;
   for d in $wait_dirs; do
-      [ -d $d ] || {
-	  echo "ERROR: $service_name directory $d not available"
-	  exit 1
-      }
+      [ -d $d ] || return 1
   done
+  return 0
+}
+
+######################################################
+# check a set of directories is available
+# usage: ctdb_check_directories SERVICE_NAME <directories...>
+######################################################
+ctdb_check_directories() {
+  service_name="$1"
+  shift
+  wait_dirs="$*"
+  ctdb_check_directories_probe "$service_name" $wait_dirs || {
+      echo "ERROR: $service_name directory $d not available"
+      exit 1
+  }
 }
 
 ######################################################
diff --git a/server/ctdb_logging.c b/server/ctdb_logging.c
index 6ebc8c1..f551088 100644
--- a/server/ctdb_logging.c
+++ b/server/ctdb_logging.c
@@ -138,38 +138,39 @@ static void ctdb_log_handler(struct event_context *ev, struct fd_event *fde,
 			     uint16_t flags, void *private)
 {
 	struct ctdb_context *ctdb = talloc_get_type(private, struct ctdb_context);
-	int n1, n2;
 	char *p;
+	int n;
 
 	if (!(flags & EVENT_FD_READ)) {
 		return;
 	}
 	
-	n1 = read(ctdb->log->pfd, &ctdb->log->buf[ctdb->log->buf_used],
+	n = read(ctdb->log->pfd, &ctdb->log->buf[ctdb->log->buf_used],
 		 sizeof(ctdb->log->buf) - ctdb->log->buf_used);
-	if (n1 > 0) {
-		ctdb->log->buf_used += n1;
+	if (n > 0) {
+		ctdb->log->buf_used += n;
 	}
 
-	p = memchr(ctdb->log->buf, '\n', ctdb->log->buf_used);
-	if (!p) {
-		if (ctdb->log->buf_used == sizeof(ctdb->log->buf)) {
-			do_debug("%*.*s\n", 
-				 (int)ctdb->log->buf_used, (int)ctdb->log->buf_used, ctdb->log->buf);
-			ctdb->log->buf_used = 0;
+	while (ctdb->log->buf_used > 0 &&
+	       (p = memchr(ctdb->log->buf, '\n', ctdb->log->buf_used)) != NULL) {
+		int n1 = (p - ctdb->log->buf)+1;
+		int n2 = n1 - 1;
+		/* swallow \r from child processes */
+		if (n2 > 0 && ctdb->log->buf[n2-1] == '\r') {
+			n2--;
 		}
-		return;
+		do_debug("%*.*s\n", n2, n2, ctdb->log->buf);
+		memmove(ctdb->log->buf, p+1, sizeof(ctdb->log->buf) - n1);
+		ctdb->log->buf_used -= n1;
 	}
 
-	n1 = (p - ctdb->log->buf)+1;
-	n2 = n1 - 1;
-	/* swallow \r from child processes */
-	if (n2 > 0 && ctdb->log->buf[n2-1] == '\r') {
-		n2--;
+	/* the buffer could have completely filled - unfortunately we have
+	   no choice but to dump it out straight away */
+	if (ctdb->log->buf_used == sizeof(ctdb->log->buf)) {
+		do_debug("%*.*s\n", 
+			 (int)ctdb->log->buf_used, (int)ctdb->log->buf_used, ctdb->log->buf);
+		ctdb->log->buf_used = 0;
 	}
-	do_debug("%*.*s\n", n2, n2, ctdb->log->buf);
-	memmove(ctdb->log->buf, p+1, sizeof(ctdb->log->buf) - n1);
-	ctdb->log->buf_used -= n1;
 }
 
 


-- 
CTDB repository


More information about the samba-cvs mailing list