2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-09-04 00:05:26 +00:00

zdtm: fix a race condition during concurrent execution of tests

When tests are executed concurrently all of them use
the same root, so libraries must be copied atomically.

Without this patch we can get errors like this:
cp: cannot create regular file ‘/tmp/criu-root.m45u5Y/lib64/ld-linux-x86-64.so.2’: File exists

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Andrey Vagin
2013-08-30 15:36:52 +04:00
committed by Pavel Emelyanov
parent 7d8ed36c33
commit 6201096cea

View File

@@ -223,6 +223,7 @@ construct_root()
local libdir=$root/lib local libdir=$root/lib
local libdir2=$root/lib64 local libdir2=$root/lib64
local tmpdir=$root/tmp local tmpdir=$root/tmp
local lname, tname
mkdir -p $root/bin mkdir -p $root/bin
cp $ps_path $root/bin cp $ps_path $root/bin
@@ -242,13 +243,34 @@ construct_root()
# /lib/ld-linux-armhf.so.3 (0xb6f0b000) # /lib/ld-linux-armhf.so.3 (0xb6f0b000)
for i in `ldd $test_path $ps_path | grep -P '^\s' | grep -v vdso | sed "s/.*=> //" | awk '{ print $1 }'`; do for i in `ldd $test_path $ps_path | grep -P '^\s' | grep -v vdso | sed "s/.*=> //" | awk '{ print $1 }'`; do
local lib=`basename $i` local ldir, lib=`basename $i`
[ -f $libdir/$lib ] && continue ||
[ -f $i ] && cp $i $libdir && cp $i $libdir2 && continue || [ -f $libdir2/$lib ] && continue # fast path
[ -f /lib64/$i ] && cp /lib64/$i $libdir && cp /lib64/$i $libdir2 && continue ||
[ -f /usr/lib64/$i ] && cp /usr/lib64/$i $libdir && cp /usr/lib64/$i $libdir2 && continue || if [ -f $i ]; then
[ -f /lib/x86_64-linux-gnu/$i ] && cp /lib/x86_64-linux-gnu/$i $libdir && cp /lib/x86_64-linux-gnu/$i $libdir2 && continue || lname=$i
[ -f /lib/arm-linux-gnueabi/$i ] && cp /lib/arm-linux-gnueabi/$i $libdir && cp /lib/arm-linux-gnueabi/$i $libdir2 && continue || echo "Failed at " $i && return 1 elif [ -f /lib64/$i ]; then
lname=/lib64/$i
elif [ -f /usr/lib64/$i ]; then
lname=/usr/lib64/$i
elif [ -f /lib/x86_64-linux-gnu/$i ]; then
lname=/lib/x86_64-linux-gnu/$i
elif [ -f /lib/arm-linux-gnueabi/$i ]; then
lname=/lib/arm-linux-gnueabi/$i
else
echo "Failed at " $i;
return 1
fi
# When tests are executed concurrently all of them use the same root,
# so libraries must be copied atomically.
for ldir in "$libdir" "$libdir2"; do
tname=$(mktemp $ldir/lib.XXXXXX)
cp -pf $lname $tname &&
mv -n $tname $ldir/$lib || return 1
[ -f $tname ] && unlink $tname
done
done done
# make 'tmp' dir under new root # make 'tmp' dir under new root