[CRIU] [PATCH] zdtm: don't call mount_cgroups a few times concurrently

Andrey Vagin avagin at openvz.org
Thu Sep 11 06:29:48 PDT 2014


Here is a race now:
./zdtm.sh --ct -d -C -x static/cgroup02 ns/static/pipe02 &> ns_static_pipe02.log || \
{ flock Makefile cat ns_static_pipe02.log; exit 1; }
./zdtm.sh --ct -d -C -x static/cgroup02 ns/static/busyloop00 &> ns_static_busyloop00.log || \
{ flock Makefile cat ns_static_busyloop00.log; exit 1; }
make[3]: `zdtm_ct' is up to date.
mkdir: cannot create directory ‘zdtm.GgIjUS/holder’: File exists

Reported-by: Mr Jenkins
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 test/Makefile           |  5 ++++-
 test/zdtm.sh            | 18 ------------------
 test/zdtm_mount_cgroups | 16 ++++++++++++++++
 3 files changed, 20 insertions(+), 19 deletions(-)
 create mode 100755 test/zdtm_mount_cgroups

diff --git a/test/Makefile b/test/Makefile
index 2c15039..3687692 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -42,7 +42,10 @@ clean:
 	$(Q) $(MAKE) -C libcriu clean
 	$(Q) $(MAKE) -C rpc clean
 
-$(TST): zdtm_ct
+mount_cgroups: .FORCE
+	flock zdtm_mount_cgroups ./zdtm_mount_cgroups
+
+$(TST): zdtm_ct mount_cgroups .FORCE
 	./zdtm.sh --ct ${ZDTM_ARGS} $(@) &> $(subst /,_,$@).log || \
 	{ flock Makefile cat $(subst /,_,$@).log; exit 1; }
 .PHONY: zdtm_ns
diff --git a/test/zdtm.sh b/test/zdtm.sh
index 3eca5b7..b650fe3 100755
--- a/test/zdtm.sh
+++ b/test/zdtm.sh
@@ -315,23 +315,6 @@ exit_callback()
 }
 trap exit_callback EXIT
 
-# If a controller is mounted during dumping processes, criu may fail with error:
-# Error (cgroup.c:768): cg: Set 3 is not subset of 2
-# so lets mount all test controllers before executing tests.
-mount_cgroups()
-{
-	cat /proc/self/cgroup | grep zdtmtst.defaultroot && return
-	local tdir
-	tdir=`mktemp -d zdtm.XXXXXX`
-	for i in "zdtmtst" "zdtmtst.defaultroot"; do
-		mount -t cgroup -o none,name=$i zdtm $tdir &&
-		# a fake group prevents destroying of a controller
-		mkdir $tdir/holder &&
-		umount $tdir || return 1
-	done
-	rmdir $tdir
-}
-
 construct_root()
 {
 	local root=$1
@@ -925,7 +908,6 @@ while :; do
 			# mntns is used to mount /proc
 			# net is used to avoid conflicts of parasite sockets
 			make zdtm_ct &&
-			flock `basename $0` -c mount_cgroups &&
 			./zdtm_ct ./zdtm.sh "$@"
 			exit
 		}
diff --git a/test/zdtm_mount_cgroups b/test/zdtm_mount_cgroups
new file mode 100755
index 0000000..6a1982f
--- /dev/null
+++ b/test/zdtm_mount_cgroups
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# If a controller is created during dumping processes, criu may fail with error:
+# Error (cgroup.c:768): cg: Set 3 is not subset of 2
+# so lets create all test controllers before executing tests.
+
+cat /proc/self/cgroup | grep zdtmtst.defaultroot && exit
+
+tdir=`mktemp -d zdtm.XXXXXX`
+for i in "zdtmtst" "zdtmtst.defaultroot"; do
+	mount -t cgroup -o none,name=$i zdtm $tdir &&
+	# a fake group prevents destroying of a controller
+	mkdir $tdir/holder &&
+	umount $tdir || exit 1
+done
+rmdir $tdir
-- 
1.9.3



More information about the CRIU mailing list