#!/bin/sh ############################ # main event script for ctdb # # This script is called with one of the following sets of arguments # startup : called when ctdb starts # shutdown : called when ctdb shuts down # takeip : called when an IP address is taken over # releaseip : called when an IP address is released # recovered : called when ctdb has finished a recovery event . $CTDB_BASE/functions loadconfig ctdb_setup_service_state_dir "ctdb" # update_config_from_tdb() { # Pull optional ctdb configuration data out of config.tdb _key="public_addresses:node#$(ctdb -t 1 xpnn|sed -e 's/.*://')" _t="$service_state_dir/public_addresses" rm -f "$_t" if ctdb pfetch config.tdb "$_key" "$_t" 2>/dev/null && \ [ -s "$_t" -a -n "$CTDB_PUBLIC_ADDRESSES"] && \ ! cmp -s "$_t" "$CTDB_PUBLIC_ADDRESSES" ; then echo "CTDB public address configuration has changed." echo "Extracting new configuration from database." diff "$_t" "$CTDB_PUBLIC_ADDRESSES" cp "$_t" "$CTDB_PUBLIC_ADDRESSES" echo "Restarting CTDB" service ctdb restart & fi } ctdb_check_args "$@" case "$1" in init) # make sure we have a blank state directory for the scripts to work with rm -rf $CTDB_VARDIR/state # Look at the pattern - this should not be -rf!!! rm -f $ctdb_managed_dir/* mkdir -p $CTDB_VARDIR/state || { ret=$? echo "mkdir -p $CTDB_VARDIR/state - failed - $ret" exit $ret } ;; setup) # set any tunables from the config file set | grep ^CTDB_SET_ | cut -d_ -f3- | while read v; do varname=`echo $v | cut -d= -f1` value=`echo $v | cut -d= -f2` ctdb setvar $varname $value || exit 1 echo "Set $varname to $value" done || exit 1 ;; startup) update_config_from_tdb & ;; monitor) # Inherit the debug level from ctdbd on each monitor run. If # there's a more urgent need then override CTDB_CURRENT_DEBUGLEVEL # using a file in $CTDB_BASE/rc.local.d/. ctdb_set_current_debuglevel create # We should never enter swap, so SwapTotal == SwapFree. [ "$CTDB_CHECK_SWAP_IS_NOT_USED" = "yes" ] && { if [ -n "`grep '^Swap\(Total\|Free\)' /proc/meminfo | uniq -s 10 -u`" ]; then echo We are swapping: cat /proc/meminfo ps auxfww fi } # warn when we get low on memory [ -z "$CTDB_MONITOR_FREE_MEMORY_WARN" ] || { FREE_MEM=`free -m | grep "buffers/cache" | while read A B C D ;do echo -n $D ; done` [ `expr "$FREE_MEM" "<" "$CTDB_MONITOR_FREE_MEMORY_WARN"` != "0" ] && { echo "Running low on memory. Free:$FREE_MEM while CTDB treshold is $CTDB_MONITOR_FREE_MEMORY_WARN" } } # monitor that we are not running out of memory [ -z "$CTDB_MONITOR_FREE_MEMORY" ] || { FREE_MEM=`free -m | grep "buffers/cache" | while read A B C D ;do echo -n $D ; done` [ `expr "$FREE_MEM" "<" "$CTDB_MONITOR_FREE_MEMORY"` != "0" ] && { echo "OOM. Free:$FREE_MEM while CTDB treshold is $CTDB_MONITOR_FREE_MEMORY" cat /proc/meminfo ps auxfww echo m > /proc/sysrq-trigger ctdb disable sleep 3 ctdb shutdown } } ;; *) ctdb_standard_event_handler "$@" ;; esac # all OK exit 0