[CRIU] [PATCH v2] dump: add timeout for collecting processes
Andrey Ryabinin
aryabinin at virtuozzo.com
Tue Dec 8 03:36:57 PST 2015
Currently criu dump may hang indefinitely. E.g. in wait for task
that blocked in vfork() or task could be in D state for some other
reason. This patch adds time limit on dump operation.
If collecting processes takes too long, dump process will be terminated.
Timeout is 20 seconds by default, but it could be changed via parameter.
Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
crtools.c | 10 ++++++++--
include/cr_options.h | 3 +++
seize.c | 10 ++++++++++
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/crtools.c b/crtools.c
index d3812a1..17aac53 100644
--- a/crtools.c
+++ b/crtools.c
@@ -64,6 +64,7 @@ void init_opts(void)
opts.manage_cgroups = CG_MODE_DEFAULT;
opts.ps_socket = -1;
opts.ghost_limit = DEFAULT_GHOST_LIMIT;
+ opts.timeout = DEFAULT_TIMEOUT;
}
static int parse_ns_string(const char *ptr)
@@ -253,6 +254,7 @@ int main(int argc, char *argv[], char *envp[])
{ "freeze-cgroup", required_argument, 0, 1068 },
{ "ghost-limit", required_argument, 0, 1069 },
{ "irmap-scan-path", required_argument, 0, 1070 },
+ { "timeout", required_argument, 0, 1071 },
{ },
};
@@ -498,6 +500,9 @@ int main(int argc, char *argv[], char *envp[])
if (irmap_scan_path_add(optarg))
return -1;
break;
+ case 1071:
+ opts.timeout = atoi(optarg);
+ break;
case 'M':
{
char *aux;
@@ -708,8 +713,9 @@ usage:
" 'cpu','fpu','all','ins','none'. To disable capability, prefix it with '^'.\n"
" --exec-cmd execute the command specified after '--' on successful\n"
" restore making it the parent of the restored process\n"
-" --freeze-cgroup\n"
-" use cgroup freezer to collect processes\n"
+" --freeze-cgroup use cgroup freezer to collect processes\n"
+" --timeout seconds timeout in seconds for dump. Dumping will fail if timeout reached.\n"
+" If not specified timeout is 20 seconds\n"
"\n"
"* Special resources support:\n"
" -x|--" USK_EXT_PARAM "inode,.." " allow external unix connections (optionally can be assign socket's inode that allows one-sided dump)\n"
diff --git a/include/cr_options.h b/include/cr_options.h
index eac7283..6296721 100644
--- a/include/cr_options.h
+++ b/include/cr_options.h
@@ -38,6 +38,8 @@ struct cg_root_opt {
*/
#define DEFAULT_GHOST_LIMIT (1 << 20)
+#define DEFAULT_TIMEOUT 20
+
struct irmap;
struct irmap_path_opt {
@@ -95,6 +97,7 @@ struct cr_options {
bool overlayfs;
size_t ghost_limit;
struct list_head irmap_scan_paths;
+ unsigned int timeout;
};
extern struct cr_options opts;
diff --git a/seize.c b/seize.c
index de5c929..63adf5e 100644
--- a/seize.c
+++ b/seize.c
@@ -568,6 +568,12 @@ int collect_pstree(pid_t pid)
goto err;
}
+ /*
+ * Fire SIGALRM if timeout reached and terminate current
+ * process (this is a default action for SIGALRM).
+ */
+ alarm(opts.timeout);
+
ret = seize_wait_task(pid, -1, &dmpi(root_item)->pi_creds);
if (ret < 0)
goto err;
@@ -578,11 +584,15 @@ int collect_pstree(pid_t pid)
if (ret < 0)
goto err;
+ /* cancel pending alarm */
+ alarm(0);
timing_stop(TIME_FREEZING);
timing_start(TIME_FROZEN);
return 0;
err:
+ /* cancel pending alarm */
+ alarm(0);
pstree_switch_state(root_item, TASK_ALIVE);
return -1;
}
--
2.4.10
More information about the CRIU
mailing list