diff options
-rwxr-xr-x | ctdb/config/ctdb.init | 156 |
1 files changed, 93 insertions, 63 deletions
diff --git a/ctdb/config/ctdb.init b/ctdb/config/ctdb.init index 0b863447b5..0a4d29b234 100755 --- a/ctdb/config/ctdb.init +++ b/ctdb/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 |