3 # init fragment for O2CB.
5 # chkconfig: 2345 24 20
6 # description: Load O2CB cluster services at system boot.
9 # Source function library
10 . /etc/rc.d/init.d/functions
13 [ -f /etc/sysconfig/o2cb ] && . /etc/sysconfig/o2cb
15 CLUSTERCONF=/etc/ocfs2/cluster.conf
18 # This is a tricky bit of eval work. There are many steps involved in
19 # O2CB startup/shutdown, so we collect them here. Each line is a line
20 # of shell code that needs to be run. The code is run via eval as
24 # Eval of the exact lines, in order. So, the first call is
25 # "eval load_module configfs".
28 # Eval of the lines with "check_" prepended, in order. So the first
29 # call is "eval check_load_module configfs".
32 # Eval of the lines with "un" prepened, in reverse order. So the
33 # *last* call is "eval unload_module configfs".
35 # To provide an action, create a set of shell functions or commands
36 # "foo", "check_foo", and "unfoo". Then add "foo arguments" to the
37 # appropriate place. Be careful, eval requires quoting to be right.
39 LOAD_ACTIONS=("load_module configfs"
40 "mount_fs configfs /sys/kernel/config"
41 "load_module ocfs2_nodemanager"
42 "load_module ocfs2_dlm"
43 "load_module ocfs2_dlmfs"
44 "mount_fs ocfs2_dlmfs /dlm")
50 # Evaluates return codes. If 0, prints "OK", if 1, prints "Failed"
51 # and exits. If 2, status is "already done" and nothing is printed.
52 # The rest of the functions in here all honor this convention.
86 # 0 is hb not active, 1 is error, 2 is hb active
90 if [ "$#" -lt "1" -o -z "$1" ]; then
91 echo "check_heartbeat(): Requires an argument" >&2
97 if [ -d "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/" ]
99 ls -1 "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
101 if [ -d "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
117 # Removes the inactive heartbeat regions
120 if [ "$#" -lt "1" -o -z "$1" ]; then
121 echo "clean_heartbeat(): Requires an argument" >&2
126 echo -n "Cleaning heartbeat on ${CLUSTER}: "
128 if [ ! -d "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/" ]
134 ls -1 "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
136 if [ ! -d "/sys/kernel/config/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
141 OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
149 REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
153 echo "At least one heartbeat region still active" >&2
156 OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
170 # 0 is success, 1 is error, 2 is not loaded
173 if [ "$#" -lt "1" -o -z "$1" ]; then
174 echo "unload_module(): Requires an argument" >&2
179 MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
191 echo -n "Invalid module parsing! "
196 echo "Unloading module \"$MODNAME\": "
197 modprobe -rs "$MODNAME"
198 if [ "$?" != 0 ]; then
199 echo "Unable to unload module \"$MODNAME\"" >&2
207 # check_load_module()
209 # 0 is not loaded, 1 is error, 2 is already loaded
211 check_load_module() {
212 if [ "$#" -lt "1" -o -z "$1" ]
214 echo "check_load_module(): Requires an argument" >&2
219 echo -n "Module \"$MODNAME\": "
220 MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
233 # Mount a filesystem.
235 # 0 is success, 1 is error, 2 is already mounted
240 FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
241 MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
243 if [ -n "$MOUNTOUT" ]
248 run_cmd "Mounting ${TYPE} filesystems" mount -t ${TYPE} ${TYPE} $FULL_MOUNT
255 # 0 is not mounted, 1 is error, 2 is already mounted
260 FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
261 MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
263 echo -n "Filesystem \"$TYPE\": "
264 if [ -n "$MOUNTOUT" ]
275 # Unmount a filesystem
277 # 0 is success, 1 is error, 2 is not mounted
282 FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
283 MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
285 if [ -z "$MOUNTOUT" ]
290 run_cmd "Unmounting ${TYPE} filesystem" umount $FULL_MOUNT
294 for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
295 eval ${LOAD_ACTIONS[i]}
300 for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
301 eval "check_${LOAD_ACTIONS[i]}"
307 CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
310 echo "Cluster not known"
314 check_online $CLUSTER
317 echo "Cluster ${CLUSTER} already online"
321 if ! [ -f ${CLUSTERCONF} ]
323 echo -n "Checking cluster configuration : "
327 echo -n "Starting cluster ${CLUSTER}: "
328 OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`"
331 O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
332 O2CB_HEARTBEAT_THRESHOLD_FILE=/sys/kernel/config/cluster/${CLUSTER}/heartbeat/dead_threshold
333 if [ -n "$O2CB_HEARTBEAT_THRESHOLD" ]; then
334 if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
335 echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE"
336 elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then
337 echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"
339 echo "WARNING: Unable to set heartbeat dead threshold" >&2
350 echo -n "Stopping cluster ${CLUSTER}: "
351 OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
352 if_fail "$?" "$OUTPUT"
358 # 0 is not online, 1 is error, 2 is online
361 if [ "$#" -lt "1" -o -z "$1" ]
363 echo "check_online(): Requires an argument" >&2
369 if [ -d "/sys/kernel/config/cluster/${CLUSTER}/node/" ]
371 ls -1 "/sys/kernel/config/cluster/${CLUSTER}/node/" | while read NODE
373 LOCAL="`cat \"/sys/kernel/config/cluster/${CLUSTER}/node/${NODE}/local\"`"
388 CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
394 if [ ! -e "/sys/kernel/config/cluster/${CLUSTER}" ]
399 clean_heartbeat $CLUSTER
401 echo -n "Stopping cluster ${CLUSTER}: "
402 check_heartbeat $CLUSTER
406 echo "Unable to stop cluster as heartbeat region still active" >&2
409 OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
410 if_fail "$?" "$OUTPUT"
417 if [ "$O2CB_ENABLED" != "true" ]
427 if [ -d /sys/kernel/config/cluster/ ]; then
428 ls -1 /sys/kernel/config/cluster/ | while read CLUSTER
430 echo "Unable to unload modules as Cluster ${CLUSTER} is still online" >&2
439 for i in $(seq $((${#LOAD_ACTIONS[*]} - 1)) -1 0); do
440 eval "un${LOAD_ACTIONS[i]}"
456 CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
462 echo -n "Checking cluster $CLUSTER: "
463 check_online $CLUSTER
472 echo -n "Checking heartbeat: "
473 check_heartbeat $CLUSTER
484 echo -n "Checking if O2CB is loaded: "
486 for MODSPEC in $MODULE_LIST
488 MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
489 FSTYPE="`echo $MODSPEC | cut -d: -f2`"
490 MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
492 if grep "^${MODULE_NAME} " /proc/modules >/dev/null 2>&1
494 echo -n "${MODULE_NAME} "
502 echo -n "Checking O2CB mount points: "
503 for MODSPEC in $MODULE_LIST
505 MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
506 FSTYPE="`echo $MODSPEC | cut -d: -f2`"
507 MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
509 if [ -z "$FSTYPE" -o -z "$MOUNT_POINT" ]
514 FULL_MOUNT="${O2CB_MANAGER}/${MOUNT_POINT}"
515 FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
516 if grep "^${FSTYPE} ${FULL_MOUNTSEARCH} ${FSTYPE}" /proc/mounts >/dev/null 2>&1
518 echo -n "${MOUNT_POINT} "
571 msg_usage "$0 {start|stop|restart|force-reload|load|unload|online|offline|status}"