[SCM] CTDB repository - branch 1.13 updated - ctdb-1.13-68-gaaec462

Ronnie Sahlberg sahlberg at samba.org
Wed Mar 28 17:42:26 MDT 2012


The branch, 1.13 has been updated
       via  aaec46211b72f7d6886832301eee169d4b6a5f80 (commit)
      from  c4aa79c2a89d362fe54c6bd86dc1831236047cfc (commit)

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


- Log -----------------------------------------------------------------
commit aaec46211b72f7d6886832301eee169d4b6a5f80
Author: Martin Schwenke <martin at meltin.net>
Date:   Wed Mar 28 14:50:36 2012 +1100

    Initscript - add backup of corrupt non-persistent databases
    
    Corrupt non-persistent databases never get analysed because ctdbd
    zeroes them at startup.
    
    Modify the initscript so that corrupt non-persistent databases are
    moved aside to a backup.  If the number of backups for a particular
    database exceeds $CTDB_MAX_CORRUPT_DB_BACKUPS (default 10) then the
    oldest excess backups are garbage collected.
    
    Abstracts from and cleans up the code for checking persistent
    databases.
    
    Logging of related messages is done to syslog or a log file as
    specified.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>

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

Summary of changes:
 config/ctdb.init |  156 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 93 insertions(+), 63 deletions(-)


Changeset truncated at 500 lines:

diff --git a/config/ctdb.init b/config/ctdb.init
index 0b86344..0a4d29b 100755
--- a/config/ctdb.init
+++ b/config/ctdb.init
@@ -107,85 +107,112 @@ build_ctdb_options () {
     maybe_set "--max-persistent-check-errors" "$CTDB_MAX_PERSISTENT_CHECK_ERRORS"
 }
 
-check_tdb () {
-	local PDBASE=$1
-
-	test x"$TDBTOOL_HAS_CHECK" = x"1" && {
-		#
-		# Note tdbtool always exits with 0
-		#
-		local OK=`tdbtool $PDBASE check | grep "Database integrity is OK" | wc -l`
-		test x"$OK" = x"1" || {
-			return 1;
-		}
-
-		return 0;
-	}
-
-	tdbdump $PDBASE >/dev/null 2>/dev/null || {
-		return $?;
-	}
-
-	return 0;
-}
-
-check_persistent_databases () {
-    PERSISTENT_DB_DIR="${CTDB_DBDIR:-/var/ctdb}/persistent"
-    mkdir -p $PERSISTENT_DB_DIR 2>/dev/null
-    local ERRCOUNT=$CTDB_MAX_PERSISTENT_CHECK_ERRORS
+# Log given message or stdin to either syslog or a CTDB log file
+do_log ()
+{
+    if [ "$CTDB_SYSLOG" = "yes" -o \
+	"${CTDB_OPTIONS#*--syslog}" != "$CTDB_OPTIONS" ] ; then
 
-    test -z "$ERRCOUNT" && {
-	ERRCOUNT="0"
-    }
-    test x"$ERRCOUNT" != x"0" && {
-	return 0;
-    }
-
-    if test -x /usr/bin/tdbtool ; then
-        HAVE_TDBTOOL=1
+	logger -t "ctdb.init" "$@"
     else
-        HAVE_TDBTOOL=0
+	_l="${CTDB_LOGFILE:-/var/log/log.ctdb}"
+	{
+	    date
+	    if [ -n "$*" ] ; then
+		echo "$*"
+	    else
+		cat
+	    fi
+	} >>"$_l"
     fi
+}
 
-    if test x"$HAVE_TDBTOOL" = x"1" ; then
-        TDBTOOL_HAS_CHECK=`echo "help" | /usr/bin/tdbtool | grep check | wc -l`
+select_tdb_checker ()
+{
+    # Find the best TDB consistency check available.
+    use_tdb_tool_check=false
+    if [ -x /usr/bin/tdbtool ] && \
+	echo "help" | /usr/bin/tdbtool | grep -q check ; then
+
+	use_tdb_tool_check=true
+    elif [ -x /usr/bin/tdbtool -a -x /usr/bin/tdbdump ] ; then
+	    do_log <<EOF
+WARNING: The installed 'tdbtool' does not offer the 'check' subcommand.
+ Using 'tdbdump' for database checks.
+ Consider updating 'tdbtool' for better checks!
+EOF
+    elif [ -x /usr/bin/tdbdump ] ; then
+	do_log <<EOF
+WARNING: 'tdbtool' is not available.
+ Using 'tdbdump' to check the databases.
+ Consider installing a recent 'tdbtool' for better checks!
+EOF
     else
-        TDBTOOL_HAS_CHECK=0
+	do_log <<EOF
+WARNING: Cannot check databases since neither
+ 'tdbdump' nor 'tdbtool check' is available.
+ Consider installing tdbtool or at least tdbdump!
+EOF
+        return 1
     fi
+}
+
+check_tdb ()
+{
+    _db="$1"
 
-    if test -x /usr/bin/tdbdump ; then
-        HAVE_TDBDUMP=1
+    if $use_tdb_tool_check ; then
+	# tdbtool always exits with 0  :-(
+	if tdbtool "$_db" check 2>/dev/null |
+	    grep -q "Database integrity is OK" ; then
+	    return 0
+	else
+	    return 1
+	fi
     else
-        HAVE_TDBDUMP=0
+	tdbdump "$_db" >/dev/null 2>/dev/null
+	return $?
     fi
+}
 
-    if test x"$HAVE_TDBDUMP" = x"0" -a x"$TDBTOOL_HAS_CHECK" = x"0" ; then
-        echo "WARNING: Cannot check persistent databases since"
-        echo "neither 'tdbdump' nor 'tdbtool check' is available."
-        echo "Consider installing tdbtool or at least tdbdump!"
-        return 0
-    fi
+check_persistent_databases ()
+{
+    _dir="${CTDB_DBDIR_PERSISTENT:-${CTDB_DBDIR:-/var/ctdb}/persistent}"
+    mkdir -p "$_dir" 2>/dev/null
 
-    if test x"$HAVE_TDBDUMP" = x"1" -a x"$TDBTOOL_HAS_CHECK" = x"0" ; then
-        if test x"$HAVE_TDBTOOL" = x"0"; then
-            echo "WARNING: 'tdbtool' is not available. Using 'tdbdump' to"
-            echo "check the persistent databases."
-            echo "Consider installing a recent 'tdbtool' for better checks!"
-        else
-            echo "WARNING: The installed 'tdbtool' does not offer the 'check'"
-            echo "subcommand. Using 'tdbdump' for persistent database checks."
-            echo "Consider updating 'tdbtool' for better checks!"
-        fi
-    fi
+    [ "${CTDB_MAX_PERSISTENT_CHECK_ERRORS:-0}" = "0" ] || return 0
 
-    for PDBASE in `ls $PERSISTENT_DB_DIR/*.tdb.[0-9] 2>/dev/null`; do
-	check_tdb $PDBASE || {
-	    echo "Persistent database $PDBASE is corrupted! CTDB will not start."
+    for _db in $(ls "$_dir/"*.tdb.*[0-9] 2>/dev/null) ; do
+	check_tdb $_db || {
+	    do_log "Persistent database $_db is corrupted! CTDB will not start."
 	    return 1
 	}
     done
 }
 
+check_non_persistent_databases ()
+{
+    _dir="${CTDB_DBDIR:-/var/ctdb}"
+    mkdir -p "$_dir" 2>/dev/null
+
+    for _db in $(ls "${_dir}/"*.tdb.*[0-9] 2>/dev/null) ; do
+	check_tdb $_db || {
+	    _backup="${_db}.$(date +'%Y%m%d.%H%M%S.%N').corrupt"
+	    do_log <<EOF
+WARNING: database ${_db} is corrupted.
+ Moving to backup ${_backup} for later analysis.
+EOF
+	    mv "$_db" "$_backup"
+
+	    # Now remove excess backups
+	    ls -td "${_db}."*".corrupt" |
+	    tail -n +$((${CTDB_MAX_CORRUPT_DB_BACKUPS:-10} + 1)) |
+	    xargs rm -f
+	    
+	}
+    done
+}
+
 set_ctdb_variables () {
     # set any tunables from the config file
     set | grep ^CTDB_SET_ | cut -d_ -f3- | 
@@ -239,7 +266,10 @@ start() {
     # instance of ctdb got killed with -9 or similar
     drop_all_public_ips
 
-    check_persistent_databases || return $?
+    if select_tdb_checker ; then
+	check_persistent_databases || return $?
+	check_non_persistent_databases
+    fi
 
     if [ "$CTDB_SUPPRESS_COREFILE" = "yes" ]; then
 	ulimit -c 0


-- 
CTDB repository


More information about the samba-cvs mailing list