Add a setting where CTDB will monitor and warn for low memory conditions.
[sahlberg/ctdb.git] / config / events.d / 00.ctdb
1 #!/bin/sh
2 ############################
3 # main event script for ctdb
4 #
5 # This script is called with one of the following sets of arguments
6 #     startup    : called when ctdb starts
7 #     shutdown   : called when ctdb shuts down
8 #     takeip     : called when an IP address is taken over
9 #     releaseip  : called when an IP address is released
10 #     recovered  : called when ctdb has finished a recovery event
11
12 . $CTDB_BASE/functions
13 loadconfig
14
15 case "$1" in 
16      init)
17         # make sure we have a blank state directory for the scripts to work with
18         /bin/rm -rf $CTDB_BASE/state
19         /bin/mkdir -p $CTDB_BASE/state || {
20             ret=$?
21             echo "/bin/mkdir -p $CTDB_BASE/state - failed - $ret"
22             exit $ret
23         }
24         ;;
25
26      setup)
27         # set any tunables from the config file
28         set | grep ^CTDB_SET_ | cut -d_ -f3- | 
29         while read v; do
30             varname=`echo $v | cut -d= -f1`
31             value=`echo $v | cut -d= -f2`
32             ctdb setvar $varname $value || exit 1
33             echo "Set $varname to $value"
34         done || exit 1
35         ;;
36
37     monitor)
38         # We should never enter swap, so SwapTotal == SwapFree.
39         [ "$CTDB_CHECK_SWAP_IS_NOT_USED" = "yes" ] && {
40             if [ -n "`grep '^Swap\(Total\|Free\)' /proc/meminfo | uniq -s 10 -u`" ]; then
41                 echo We are swapping:
42                 cat /proc/meminfo
43                 ps auxfww
44             fi
45         }
46
47         # warn when we get low on memory
48         [ -z "$CTDB_MONITOR_FREE_MEMORY_WARN" ] || {
49                 FREE_MEM=`free -m | grep "buffers/cache" | while read A B C D ;do /bin/echo -n $D ; done`
50                 [ `expr "$FREE_MEM" "<" "$CTDB_MONITOR_FREE_MEMORY_WARN"` != "0" ] && {
51                         echo "Running low on memory. Free:$FREE_MEM while CTDB treshold is $CTDB_MONITOR_FREE_MEMORY_WARN"
52                 }
53         }
54
55         # monitor that we are not running out of memory
56         [ -z "$CTDB_MONITOR_FREE_MEMORY" ] || {
57                 FREE_MEM=`free -m | grep "buffers/cache" | while read A B C D ;do /bin/echo -n $D ; done`
58                 [ `expr "$FREE_MEM" "<" "$CTDB_MONITOR_FREE_MEMORY"` != "0" ] && {
59                         echo "OOM. Free:$FREE_MEM while CTDB treshold is $CTDB_MONITOR_FREE_MEMORY"
60                         cat /proc/meminfo
61                         ps auxfww
62                         echo m > /proc/sysrq-trigger
63                         ctdb disable
64                         sleep 3
65                         ctdb shutdown
66                 }
67         }
68         ;;
69
70     *)
71         ctdb_standard_event_handler "$@"
72         ;;
73 esac
74
75 # all OK
76 exit 0