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 <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
Date:   Wed Jul 23 15:35:46 2008 +1000

    allow for probing of directories without raising an error

commit e8ef9891aa31c374921b23cc74e1eda1f8218bf0
Author: Andrew Tridgell <[EMAIL PROTECTED]>
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

Reply via email to