[CRIU] [PATCH] zdtm: check that a command completes successfully after a fault (v2)

Pavel Emelyanov xemul at virtuozzo.com
Tue Mar 1 02:01:33 PST 2016


On 03/01/2016 03:04 AM, Andrey Vagin wrote:
> From: Andrew Vagin <avagin at virtuozzo.com>
> 
> I suggest to inject a fault and than try to execute the same command
> again without a fault to check that it will complete successfully.
> 
> v2: skip a parasite blob when we are checking vma-s
> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> ---
>  test/zdtm.py | 40 +++++++++++++++++++++++++++++-----------
>  1 file changed, 29 insertions(+), 11 deletions(-)
> 
> diff --git a/test/zdtm.py b/test/zdtm.py
> index 1ace919..27fa8d4 100755
> --- a/test/zdtm.py
> +++ b/test/zdtm.py
> @@ -656,13 +656,31 @@ class criu_cli:
>  
>  		preexec = self.__user and self.set_user_id or None
>  
> -		ret = self.__criu(action, s_args, self.__fault, strace, preexec)
> -		grep_errors(os.path.join(self.__ddir(), log))
> -		if ret != 0:
> -			if self.__fault or self.__test.blocking() or (self.__sat and action == 'restore'):
> -				raise test_fail_expected_exc(action)
> -			else:
> -				raise test_fail_exc("CRIU %s" % action)
> +		faults = [ self.__fault ]
> +		# try again after the first failed case
> +		if self.__fault:
> +			faults.append(None)
> +		for fault in faults:
> +			__ddir = self.__ddir()
> +
> +			ret = self.__criu(action, s_args, fault, strace, preexec)
> +			grep_errors(os.path.join(__ddir, log))
> +			if ret != 0:
> +				if fault:
> +					try_run_hook(self.__test, ["--fault", action])
> +					if action == "dump":
> +						__ddir_fail = __ddir + ".fail"
> +						os.rename(__ddir, __ddir + ".fail")
> +						os.mkdir(__ddir)
> +						os.chmod(__ddir, 0777)
> +					else:
> +						os.rename(os.path.join(__ddir, log), os.path.join(__ddir, log + ".fail"))

What does this dir manipulation do?

> +					continue
> +				if self.__test.blocking() or (self.__sat and action == 'restore'):
> +					raise test_fail_expected_exc(action)
> +				else:
> +					raise test_fail_exc("CRIU %s" % action)
> +			break
>  
>  	def dump(self, action, opts = []):
>  		self.__iter += 1
> @@ -819,7 +837,7 @@ def get_visible_state(test):
>  		mounts[pid] = set(cmounts)
>  	return files, maps, mounts
>  
> -def check_visible_state(test, state):
> +def check_visible_state(test, state, opts):
>  	new = get_visible_state(test)
>  
>  	for pid in state[0].keys():
> @@ -835,8 +853,8 @@ def check_visible_state(test, state):
>  		if old_maps != new_maps:
>  			print "%s: Old maps lost: %s" % (pid, old_maps - new_maps)
>  			print "%s: New maps appeared: %s" % (pid, new_maps - old_maps)
> -
> -			raise test_fail_exc("maps compare")
> +			if not opts['fault']: # skip parasite blob
> +				raise test_fail_exc("maps compare")
>  
>  		old_mounts = state[2][pid]
>  		new_mounts = new[2][pid]
> @@ -937,7 +955,7 @@ def do_run_test(tname, tdesc, flavs, opts):
>  					t.stop()
>  				try_run_hook(t, ["--fault", e.cr_action])
>  			else:
> -				check_visible_state(t, s)
> +				check_visible_state(t, s, opts)
>  				t.stop()
>  				try_run_hook(t, ["--clean"])
>  		except test_fail_exc as e:
> 



More information about the CRIU mailing list