ctdb-scripts: Dump stack traces of smbd processes after shutdown
[samba.git] / ctdb / tests / eventscripts / scripts / local.sh
index 51f38580f7e07332152645c1d89475afc18a334e..ea900ebcd0d8c99e32ef48af9915c9c46b843bb6 100644 (file)
@@ -20,6 +20,8 @@ export EVENTSCRIPTS_PATH
 
 PATH="${EVENTSCRIPTS_PATH}:${PATH}"
 
+export CTDB="ctdb"
+
 export EVENTSCRIPTS_TESTS_VAR_DIR="${TEST_VAR_DIR}/unit_eventscripts"
 if [ -d "$EVENTSCRIPTS_TESTS_VAR_DIR" -a \
     "$EVENTSCRIPTS_TESTS_VAR_DIR" != "/unit_eventscripts" ] ; then
@@ -837,6 +839,23 @@ setup_samba ()
     fi
 }
 
+samba_setup_fake_threads ()
+{
+       export FAKE_SMBD_THREAD_PIDS="$*"
+
+       _nl="
+"
+       _out=""
+       _count=0
+       for _pid ; do
+               [ "$_count" -lt 5 ] || break
+               _t=$(program_stack_trace "smbd" $_pid)
+               _out="${_out:+${_out}${_nl}}${_t}"
+               _count=$((_count + 1))
+       done
+       SAMBA_STACK_TRACES="$_out"
+}
+
 setup_winbind ()
 {
     setup_ctdb
@@ -997,6 +1016,17 @@ nfs_setup_fake_threads ()
     esac
 }
 
+program_stack_trace ()
+{
+       _prog="$1"
+       _pid="$2"
+
+       cat <<EOF
+Stack trace for ${_prog}[${_pid}]:
+[<ffffffff87654321>] fake_stack_trace_for_pid_${_pid}/stack+0x0/0xff
+EOF
+}
+
 program_stack_traces ()
 {
     _prog="$1"
@@ -1006,10 +1036,7 @@ program_stack_traces ()
     for _pid in ${FAKE_NFSD_THREAD_PIDS:-$FAKE_RPC_THREAD_PIDS} ; do
        [ $_count -le $_max ] || break
 
-       cat <<EOF
-Stack trace for ${_prog}[${_pid}]:
-[<ffffffff87654321>] fake_stack_trace_for_pid_${_pid}/stack+0x0/0xff
-EOF
+       program_stack_trace "$_prog" "$_pid"
        _count=$(($_count + 1))
     done
 }
@@ -1104,7 +1131,8 @@ program $_rpc_service${_ver:+ version }${_ver} is not available"
            echo 0 >"$_rc_file"
        fi
 
-       if [ $restart_every -gt 0 -a $(($_numfails % $restart_every)) -eq 0 ] ; then
+       if [ $restart_every -gt 0 ] && \
+                  [ $(($_numfails % $restart_every)) -eq 0 ] ; then
            if ! $_unhealthy ; then
                echo "WARNING: ${_rpc_check_out}" >>"$_out"
            fi
@@ -1127,6 +1155,27 @@ program $_rpc_service${_ver:+ version }${_ver} is not available"
 
 ######################################################################
 
+# Recovery lock fakery
+
+cleanup_reclock ()
+{
+       _pattern="${script_dir}/${script}"
+       while pgrep -f "$_pattern" >/dev/null ; do
+               echo "Waiting for backgrounded ${script} to exit..."
+               (FAKE_SLEEP_REALLY=yes sleep 1)
+       done
+}
+
+setup_reclock ()
+{
+       CTDB_RECOVERY_LOCK=$(mktemp --tmpdir="$EVENTSCRIPTS_TESTS_VAR_DIR")
+       export CTDB_RECOVERY_LOCK
+
+       test_cleanup cleanup_reclock
+}
+
+######################################################################
+
 # VSFTPD fakery
 
 setup_vsftpd ()