[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