[CRIU] [PATCH] test: check, that parasite can rollback itself (v2)

Andrey Vagin avagin at openvz.org
Tue Aug 6 05:34:21 EDT 2013


This test uses systemtap to replace random parasite command on
invalide command. The parasite code received this command and should
rollback itself. CRIU didn't recived ack, should understand that
something wrong and exits. The systemtap inverts exit code of criu.

"zdtm.sh -d" is used for executing tests and testing that the state of
processes don't corrupted.

criu should be compiled without optimizations (make DEBUG=1)

v2: randomize a command, which will be replaced
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 test/Makefile                     |  9 +++++++-
 test/fault-injection/Makefile     |  2 ++
 test/fault-injection/parasite.stp | 44 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 test/fault-injection/Makefile
 create mode 100644 test/fault-injection/parasite.stp

diff --git a/test/Makefile b/test/Makefile
index df46688..3e6e656 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -3,12 +3,19 @@ EXP = '^ns/(?!.*(tty|pty))'
 
 .FORCE:
 
+all: .FORCE
+	$(MAKE) zdtm
+	$(MAKE) -C fault-injection
+
 zdtm: .FORCE
 	$(MAKE) zdtm_ns
 	for t in $(shell echo "$(TST)" | tr ' ' '\n' | grep -Pv $(EXP)); do \
 		$(MAKE) $$t || break;	\
 	done
-	
+
+fault-injection: .FORCE
+	$(MAKE) -C fault-injection
+
 zdtm_ns: $(shell echo "$(TST)" | tr ' ' '\n' | grep -P $(EXP))
 $(TST):
 	./zdtm.sh $(@) &> $(subst /,_,$@).log
diff --git a/test/fault-injection/Makefile b/test/fault-injection/Makefile
new file mode 100644
index 0000000..4a2627e
--- /dev/null
+++ b/test/fault-injection/Makefile
@@ -0,0 +1,2 @@
+all:
+	stap -g -d ../../criu parasite.stp $$RANDOM -c 'bash -x ../zdtm.sh -d -x socket-tcp'
diff --git a/test/fault-injection/parasite.stp b/test/fault-injection/parasite.stp
new file mode 100644
index 0000000..b71d364
--- /dev/null
+++ b/test/fault-injection/parasite.stp
@@ -0,0 +1,44 @@
+global i, n, fini_cmd = -1, last_cmd
+
+probe process("../../criu").begin
+{
+	i = 0;
+	/* randint() returns numbers multiple of 5 */
+	n = randint(20 * 5) / 5
+	printf("The %d command will be replaced on -1\n", n);
+}
+
+probe process("../../criu").function("__parasite_execute_daemon")
+{
+	printf("%s\n", $$parms);
+	last_cmd = $cmd;
+	if (++i > n) {
+		printf("Send invalid command to parasite\n");
+		$cmd = -1;
+	}
+}
+
+probe process("../../criu").function("__parasite_execute_daemon").return
+{
+	printf("%d\n", $return);
+}
+
+probe process("../../criu").function("main").return
+{
+	printf("CRIU exits with code %d\n", $return);
+	if  ( i > n) {
+		if ($return)
+			$return = 0;
+		else {
+			printf("CRIU exited with zero code\n");
+			if (fini_cmd < 0 || fini_cmd == last_cmd) {
+				printf("%d looks like FINI command\n", n);
+				fini_cmd = last_cmd
+			} else {
+				printf("This is the second FINI command %d (%d)",
+								n, fini_cmd);
+				$return = 1;
+			}
+		}
+	}
+}
-- 
1.8.3.1



More information about the CRIU mailing list