Просмотр исходного кода

CTS: Test for confdb dispatch deadlock

Test is disabled by default because it depends on SMP and about 2GB RAM.
It's also testing race, so test is unreliable.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Steven Dake <sdake@redhat.com>
Jan Friesse 14 лет назад
Родитель
Сommit
ae2ac5945b
3 измененных файлов с 76 добавлено и 2 удалено
  1. 2 2
      cts/agents/Makefile.am
  2. 57 0
      cts/agents/confdb-dispatch-deadlock.sh
  3. 17 0
      cts/corotests.py

+ 2 - 2
cts/agents/Makefile.am

@@ -41,7 +41,7 @@ EXTRA_DIST		= syncv2.c
 if INSTALL_TESTAGENTS
 if INSTALL_TESTAGENTS
 agentdir = $(datadir)/$(PACKAGE)/tests
 agentdir = $(datadir)/$(PACKAGE)/tests
 bin_PROGRAMS = $(TEST_AGENTS)
 bin_PROGRAMS = $(TEST_AGENTS)
-dist_agent_SCRIPTS = mem_leak_test.sh net_breaker.sh
+dist_agent_SCRIPTS = mem_leak_test.sh net_breaker.sh confdb-dispatch-deadlock.sh
 
 
 AM_CFLAGS		= -fPIC
 AM_CFLAGS		= -fPIC
 SERVICE_LCRSO		= syncv2
 SERVICE_LCRSO		= syncv2
@@ -50,7 +50,7 @@ LCRSO			= $(SERVICE_LCRSO:%=service_%.lcrso)
 LCRSO_OBJS		= $(SOURCES:%.c=%.o)
 LCRSO_OBJS		= $(SOURCES:%.c=%.o)
 else
 else
 noinst_PROGRAMS = $(TEST_AGENTS)
 noinst_PROGRAMS = $(TEST_AGENTS)
-noinst_SCRIPTS = mem_leak_test.sh net_breaker.sh
+noinst_SCRIPTS = mem_leak_test.sh net_breaker.sh confdb-dispatch-deadlock.sh
 LCRSO =
 LCRSO =
 LCRSO_OBJS =
 LCRSO_OBJS =
 endif
 endif

+ 57 - 0
cts/agents/confdb-dispatch-deadlock.sh

@@ -0,0 +1,57 @@
+#!/bin/bash
+
+export TIMEOUT=600
+export PID=$$
+up_to=200
+
+rec_plist() {
+    if [ "$2" == "" ];then
+	pl="`ps ax -o pid= -o ppid= -o comm=`"
+    else
+	pl=$2
+    fi
+
+    list=`echo "$pl" | egrep "^ *[0-9]+ +$1" | awk '{ print $1 }'`
+    tmplist=$list
+    for i in $tmplist;do
+	[ "$i" != "$1" ] && [ "$i" != "$$" ] && list="$list "`rec_plist $i "$pl"`
+    done
+
+    echo $list
+}
+
+rec_pkill() {
+    kill -9 `rec_plist "$1"` 2> /dev/null
+}
+
+exit_timeout() {
+    echo "ERR: Timeout. Test failed $PID"
+    rec_pkill "$$"
+    exit 1
+}
+
+corosync-objctl -c test.abd || exit 2
+
+trap exit_timeout SIGUSR1
+(sleep $TIMEOUT ; kill -SIGUSR1 $PID) &
+
+wait_list=""
+
+for e in {1..40};do
+    (for a in `seq 1 $up_to`;do corosync-objctl -w test.abd=$a ; done) &
+    wait_list="$wait_list $!"
+done
+
+notify_list=""
+
+for i in {1..2};do
+    sleep 600000 | corosync-objctl -t test > /dev/null &
+    notify_list="$notify_list $!"
+done
+
+wait $wait_list
+
+rec_pkill "$$"
+
+echo "OK"
+exit 0

+ 17 - 0
cts/corotests.py

@@ -629,6 +629,22 @@ class ServiceLoadTest(CoroTest):
 
 
         return self.success()
         return self.success()
 
 
+class ConfdbDispatchDeadlock(CoroTest):
+    '''
+    run confdb-dispatch-deadlock.sh
+    '''
+    def __init__(self, cm):
+        CoroTest.__init__(self,cm)
+        self.name="ConfdbDispatchDeadlock"
+
+    def __call__(self, node):
+        self.incr("calls")
+
+        result = self.CM.rsh(node, "/usr/share/corosync/tests/confdb-dispatch-deadlock.sh")
+        if result is 0:
+            return self.success()
+        else:
+            return self.failure('Deadlock detected')
 
 
 ###################################################################
 ###################################################################
 class ConfdbReplaceTest(CoroTest):
 class ConfdbReplaceTest(CoroTest):
@@ -1544,6 +1560,7 @@ AllTestClasses.append(ResourcePollAdjust)
 AllTestClasses.append(ServiceLoadTest)
 AllTestClasses.append(ServiceLoadTest)
 AllTestClasses.append(MemLeakObject)
 AllTestClasses.append(MemLeakObject)
 AllTestClasses.append(MemLeakSession)
 AllTestClasses.append(MemLeakSession)
+#AllTestClasses.append(ConfdbDispatchDeadlock)
 AllTestClasses.append(FlipTest)
 AllTestClasses.append(FlipTest)
 AllTestClasses.append(RestartTest)
 AllTestClasses.append(RestartTest)
 AllTestClasses.append(StartOnebyOne)
 AllTestClasses.append(StartOnebyOne)