[1/3] crtools: resurrect --pid option for dump

Submitted by Ruslan Kuprieiev on Feb. 27, 2017, 11:39 a.m.

Details

Message ID 20170227113953.27918-2-rkuprieiev@cloudlinux.com
State New
Series "introduce selective dump"
Headers show

Commit Message

Ruslan Kuprieiev Feb. 27, 2017, 11:39 a.m.
This option now allows us to specify a process within specified
process tree that needs to be checkpointed. For now only root
process is allowed(-t and -p options should have same PID).

This behaviour is useful for dumping master processes,
that fork it's children to do the work. I.e. one of such cases
is php process that forks workers. When one uses this option,
he agrees to possible consequences and is ready to handle
recovering from such restore on a dumpee side.

Signed-off-by: Ruslan Kuprieiev <rkuprieiev@cloudlinux.com>
---
 criu/crtools.c            |  8 +++++---
 criu/include/cr_options.h |  1 +
 criu/seize.c              | 11 +++++++----
 3 files changed, 13 insertions(+), 7 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/crtools.c b/criu/crtools.c
index 927ca8e..0c8ba3d 100644
--- a/criu/crtools.c
+++ b/criu/crtools.c
@@ -78,6 +78,7 @@  void init_opts(void)
 	opts.timeout = DEFAULT_TIMEOUT;
 	opts.empty_ns = 0;
 	opts.status_fd = -1;
+	opts.pid = -1;
 }
 
 static int parse_join_ns(const char *ptr)
@@ -212,7 +213,7 @@  bool deprecated_ok(char *what)
 
 int main(int argc, char *argv[], char *envp[])
 {
-	pid_t pid = 0, tree_id = 0;
+	pid_t tree_id = 0;
 	int ret = -1;
 	bool usage_error = true;
 	bool has_exec_cmd = false;
@@ -344,8 +345,8 @@  int main(int argc, char *argv[], char *envp[])
 			opts.ext_unix_sk = true;
 			break;
 		case 'p':
-			pid = atoi(optarg);
-			if (pid <= 0)
+			opts.pid = atoi(optarg);
+			if (opts.pid <= 0)
 				goto bad_arg;
 			break;
 		case 't':
@@ -851,6 +852,7 @@  usage:
 "\n"
 "* Generic:\n"
 "  -t|--tree PID         checkpoint a process tree identified by PID\n"
+"  -p|--pid PID          within a specified process tree, checkpoint only a process with this PID(for now only root of a tree is supported)\n"
 "  -d|--restore-detached detach after restore\n"
 "  -S|--restore-sibling  restore root task as sibling\n"
 "  -s|--leave-stopped    leave tasks in stopped state after checkpoint\n"
diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
index 1c065ac..dd3bb9e 100644
--- a/criu/include/cr_options.h
+++ b/criu/include/cr_options.h
@@ -108,6 +108,7 @@  struct cr_options {
 	bool			lazy_pages;
 	bool			tcp_skip_in_flight;
 	char			*work_dir;
+	int			pid;
 
 	/*
 	 * When we scheduler for removal some functionality we first
diff --git a/criu/seize.c b/criu/seize.c
index d5079ca..5d913a8 100644
--- a/criu/seize.c
+++ b/criu/seize.c
@@ -807,10 +807,13 @@  static int collect_task(struct pstree_item *item)
 	if (ret < 0)
 		goto err_close;
 
-	/* Depth-first search (DFS) is used for traversing a process tree. */
-	ret = collect_loop(item, collect_children);
-	if (ret < 0)
-		goto err_close;
+	/* FIXME: for now only root process is supported for selective dump */
+	if (opts.pid == -1 || opts.pid != item->pid->real) {
+		/* Depth-first search (DFS) is used for traversing a process tree. */
+		ret = collect_loop(item, collect_children);
+		if (ret < 0)
+			goto err_close;
+	}
 
 	if ((item->pid->state == TASK_DEAD) && !list_empty(&item->children)) {
 		pr_err("Zombie with children?! O_o Run, run, run!\n");