ctdb-tests: Make the debug hung script test cope with unreadable stacks
authorMartin Schwenke <martin@meltin.net>
Wed, 14 Nov 2018 03:09:42 +0000 (14:09 +1100)
committerTim Beale <timbeale@samba.org>
Thu, 15 Nov 2018 07:15:32 +0000 (08:15 +0100)
Ideally this would just involve using "test -r".  However, operating
system security features may mean that kernel stacks are not readable
even though they appear to be.

Instead, try reading that stack of a process on the test node.  If
that succeeds then so should reading the stack of the "stuck" sleep
process in the test.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13684

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Tim Beale <timbeale@catalyst.net.nz>
Autobuild-User(master): Tim Beale <timbeale@samba.org>
Autobuild-Date(master): Thu Nov 15 08:15:32 CET 2018 on sn-devel-144

ctdb/tests/simple/90_debug_hung_script.sh

index 40f3f47480d4dcceda37c2faab7870d5f1e62372..9e2072c98b62839c96560aa982099741cfa28e07 100755 (executable)
@@ -58,9 +58,21 @@ wait_until 60 onnode $test_node test -s "$debug_output"
 
 echo "Checking output of hung script debugging..."
 try_command_on_node -v $test_node cat "$debug_output"
 
 echo "Checking output of hung script debugging..."
 try_command_on_node -v $test_node cat "$debug_output"
+hung_script_output="$out"
+
+# Can we actually read kernel stacks
+if try_command_on_node $test_node "cat /proc/$$/stack >/dev/null 2>&1" ; then
+       stackpat='
+---- Stack trace of interesting process [0-9]*\\[sleep\\] ----
+[<[0-9a-f]*>] .*sleep+.*
+'
+else
+       stackpat=''
+fi
 
 while IFS="" read pattern ; do
 
 while IFS="" read pattern ; do
-    if grep -- "^${pattern}\$" <<<"$out" >/dev/null ; then
+    [ -n "$pattern" ] || continue
+    if grep -- "^${pattern}\$" <<<"$hung_script_output" >/dev/null ; then
        printf 'GOOD: output contains "%s"\n' "$pattern"
     else
        printf 'BAD: output does not contain "%s"\n' "$pattern"
        printf 'GOOD: output contains "%s"\n' "$pattern"
     else
        printf 'BAD: output does not contain "%s"\n' "$pattern"
@@ -72,8 +84,7 @@ done <<EOF
 pstree -p -a .*:
 00\\\\.test\\\\.script,.*
  *\`-sleep,.*
 pstree -p -a .*:
 00\\\\.test\\\\.script,.*
  *\`-sleep,.*
----- Stack trace of interesting process [0-9]*\\\\[sleep\\\\] ----
-[<[0-9a-f]*>] .*sleep+.*
+${stackpat}
 ---- ctdb scriptstatus monitor: ----
 00\\.test *TIMEDOUT.*
  *OUTPUT: Sleeping for [0-9]* seconds\\\\.\\\\.\\\\.
 ---- ctdb scriptstatus monitor: ----
 00\\.test *TIMEDOUT.*
  *OUTPUT: Sleeping for [0-9]* seconds\\\\.\\\\.\\\\.