summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xctdb/config/ctdb.init156
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