Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support criu-image-streamer through RPC #2536

Open
wants to merge 1 commit into
base: criu-dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions criu/cr-service.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,14 +394,10 @@ static int setup_opts_from_req(int sk, CriuOpts *req)
if (req->parent_img)
SET_CHAR_OPTS(img_parent, req->parent_img);

/*
* Image streaming is not supported with CRIU's service feature as
* the streamer must be started for each dump/restore operation.
* It is unclear how to do that with RPC, so we punt for now.
* This explains why we provide the argument mode=-1 instead of
* O_RSTR or O_DUMP.
*/
if (open_image_dir(images_dir_path, -1) < 0) {
if (req->stream)
opts.stream = true;

if (open_image_dir(images_dir_path, image_dir_mode()) < 0) {
pr_perror("Can't open images directory");
goto err;
}
Expand Down Expand Up @@ -1261,7 +1257,7 @@ static int handle_cpuinfo(int sk, CriuReq *msg)
if (pid == 0) {
int ret = 1;

opts.mode = CR_CPUINFO;
opts.mode = (msg->type == CRIU_REQ_TYPE__CPUINFO_DUMP) ? CR_CPUINFO_DUMP : CR_CPUINFO_CHECK;
if (setup_opts_from_req(sk, msg->opts))
goto cout;

Expand Down
52 changes: 25 additions & 27 deletions criu/crtools.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,17 @@
flush_early_log_buffer(STDERR_FILENO);
}

static int image_dir_mode(char *argv[], int optind)
int image_dir_mode()
{
switch (opts.mode) {
case CR_DUMP:
/* fallthrough */
case CR_CPUINFO_DUMP:
/* fallthrough */
case CR_PRE_DUMP:
return O_DUMP;
case CR_RESTORE:
return O_RSTR;
case CR_CPUINFO:
if (!strcmp(argv[optind + 1], "dump"))
return O_DUMP;
/* fallthrough */
default:
return -1;
}
Expand All @@ -76,7 +74,7 @@
return -1;
}

static int parse_criu_mode(char *mode)
static int parse_criu_mode(char *mode, char *subcommand)
{
if (!strcmp(mode, "dump"))
opts.mode = CR_DUMP;
Expand All @@ -96,8 +94,12 @@
opts.mode = CR_SWRK;
else if (!strcmp(mode, "dedup"))
opts.mode = CR_DEDUP;
else if (!strcmp(mode, "cpuinfo"))
opts.mode = CR_CPUINFO;
else if (!strcmp(mode, "cpuinfo") && subcommand == NULL)
return -2;
else if (!strcmp(mode, "cpuinfo") && !strcmp(subcommand, "dump"))
opts.mode = CR_CPUINFO_DUMP;
else if (!strcmp(mode, "cpuinfo") && !strcmp(subcommand, "check"))
opts.mode = CR_CPUINFO_CHECK;
else if (!strcmp(mode, "exec"))
opts.mode = CR_EXEC_DEPRECATED;
else if (!strcmp(mode, "show"))
Expand All @@ -115,6 +117,7 @@
bool has_exec_cmd = false;
bool has_sub_command;
int state = PARSING_GLOBAL_CONF;
char* subcommand;

Check warning on line 120 in criu/crtools.c

View workflow job for this annotation

GitHub Actions / build


BUILD_BUG_ON(CTL_32 != SYSCTL_TYPE__CTL_32);
BUILD_BUG_ON(__CTL_STR != SYSCTL_TYPE__CTL_STR);
Expand Down Expand Up @@ -165,9 +168,15 @@
return 1;
}

if (parse_criu_mode(argv[optind])) {
has_sub_command = (argc - optind) > 1;
subcommand = has_sub_command ? argv[optind + 1] : NULL;
ret = parse_criu_mode(argv[optind], subcommand);
if (ret == -1) {
pr_err("unknown command: %s\n", argv[optind]);
goto usage;
} else if (ret == -2) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
/*
* util_init initializes criu_run_id and compel_run_id so that sockets
Expand Down Expand Up @@ -200,8 +209,6 @@
if (opts.work_dir == NULL)
SET_CHAR_OPTS(work_dir, opts.imgs_dir);

has_sub_command = (argc - optind) > 1;

if (has_exec_cmd) {
if (!has_sub_command) {
pr_err("--exec-cmd requires a command\n");
Expand All @@ -225,23 +232,20 @@
opts.exec_cmd[argc - optind - 1] = NULL;
} else {
/* No subcommands except for cpuinfo and restore --exec-cmd */
if (opts.mode != CR_CPUINFO && has_sub_command) {
if (opts.mode != CR_CPUINFO_DUMP && opts.mode != CR_CPUINFO_CHECK && has_sub_command) {
pr_err("excessive parameter%s for command %s\n", (argc - optind) > 2 ? "s" : "", argv[optind]);
goto usage;
} else if (opts.mode == CR_CPUINFO && !has_sub_command) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
}

if (opts.stream && image_dir_mode(argv, optind) == -1) {
if (opts.stream && image_dir_mode() == -1) {
pr_err("--stream cannot be used with the %s command\n", argv[optind]);
goto usage;
}

/* We must not open imgs dir, if service is called */
if (opts.mode != CR_SERVICE) {
ret = open_image_dir(opts.imgs_dir, image_dir_mode(argv, optind));
ret = open_image_dir(opts.imgs_dir, image_dir_mode());
if (ret < 0) {
pr_err("Couldn't open image dir %s\n", opts.imgs_dir);
return 1;
Expand Down Expand Up @@ -335,16 +339,10 @@
if (opts.mode == CR_DEDUP)
return cr_dedup() != 0;

if (opts.mode == CR_CPUINFO) {
if (!argv[optind + 1]) {
pr_err("cpuinfo requires an action: dump or check\n");
goto usage;
}
if (!strcmp(argv[optind + 1], "dump"))
return cpuinfo_dump();
else if (!strcmp(argv[optind + 1], "check"))
return cpuinfo_check();
}
if (opts.mode == CR_CPUINFO_DUMP)
return cpuinfo_dump();
if (opts.mode == CR_CPUINFO_CHECK)
return cpuinfo_check();

if (opts.mode == CR_EXEC_DEPRECATED) {
pr_err("The \"exec\" action is deprecated by the Compel library.\n");
Expand Down
3 changes: 2 additions & 1 deletion criu/include/cr_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ enum criu_mode {
CR_SERVICE,
CR_SWRK,
CR_DEDUP,
CR_CPUINFO,
CR_CPUINFO_DUMP,
CR_CPUINFO_CHECK,
CR_EXEC_DEPRECATED,
CR_SHOW_DEPRECATED,
};
Expand Down
2 changes: 2 additions & 0 deletions criu/include/crtools.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ extern int cr_lazy_pages(bool daemon);
extern int check_add_feature(char *arg);
extern void pr_check_features(const char *offset, const char *sep, int width);

int image_dir_mode(void);

#define PPREP_HEAD_INACTIVE ((struct pprep_head *)-1)

#define add_post_prepare_cb_once(phead) \
Expand Down
1 change: 1 addition & 0 deletions images/rpc.proto
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ message criu_opts {
optional bool leave_stopped = 69;
optional bool display_stats = 70;
optional bool log_to_stderr = 71;
optional bool stream = 72;
/* optional bool check_mounts = 128; */
}

Expand Down
Loading