Skip to content

Commit

Permalink
c/r: rearrange things to pass struct migrate_opts all the way down
Browse files Browse the repository at this point in the history
If we don't do this, we'll end up changing the function signatures for the
internal __criu_* functions each time we add a new parameter, which will
get very annoying very quickly. Since we already have the user's arguments
struct, let's just pass that all the way down.

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
  • Loading branch information
Tycho Andersen committed May 10, 2016
1 parent 9504f14 commit b2c3710
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 54 deletions.
77 changes: 29 additions & 48 deletions src/lxc/criu.c
Expand Up @@ -56,20 +56,13 @@ struct criu_opts {
/* The type of criu invocation, one of "dump" or "restore" */
char *action;

/* The directory to pass to criu */
char *directory;
/* the user-provided migrate options relevant to this action */
struct migrate_opts *user;

/* The container to dump */
struct lxc_container *c;

/* Enable criu verbose mode? */
bool verbose;

/* (pre-)dump: a directory for the previous dump's images */
char *predump_dir;

/* dump: stop the container or not after dumping? */
bool stop;
char tty_id[32]; /* the criu tty id for /dev/console, i.e. "tty[${rdev}:${dev}]" */

/* restore: the file to write the init process' pid into */
Expand All @@ -82,10 +75,6 @@ struct criu_opts {
* different) on the target host. NULL if lxc.console = "none".
*/
char *console_name;

/* Address and port where a criu pageserver is listening */
char *pageserver_address;
char *pageserver_port;
};

static int load_tty_major_minor(char *directory, char *output, int len)
Expand Down Expand Up @@ -157,15 +146,15 @@ static void exec_criu(struct criu_opts *opts)
static_args += 4;

/* --prev-images-dir <path-to-directory-A-relative-to-B> */
if (opts->predump_dir)
if (opts->user->predump_dir)
static_args += 2;

/* --page-server --address <address> --port <port> */
if (opts->pageserver_address && opts->pageserver_port)
if (opts->user->pageserver_address && opts->user->pageserver_port)
static_args += 5;

/* --leave-running (only for final dump) */
if (strcmp(opts->action, "dump") == 0 && !opts->stop)
if (strcmp(opts->action, "dump") == 0 && !opts->user->stop)
static_args++;

/* --external tty[88,4] */
Expand All @@ -179,7 +168,7 @@ static void exec_criu(struct criu_opts *opts)
static_args += 10;

tty_info[0] = 0;
if (load_tty_major_minor(opts->directory, tty_info, sizeof(tty_info)))
if (load_tty_major_minor(opts->user->directory, tty_info, sizeof(tty_info)))
return;

/* --inherit-fd fd[%d]:tty[%s] */
Expand All @@ -189,10 +178,10 @@ static void exec_criu(struct criu_opts *opts)
return;
}

if (opts->verbose)
if (opts->user->verbose)
static_args++;

ret = snprintf(log, PATH_MAX, "%s/%s.log", opts->directory, opts->action);
ret = snprintf(log, PATH_MAX, "%s/%s.log", opts->user->directory, opts->action);
if (ret < 0 || ret >= PATH_MAX) {
ERROR("logfile name too long\n");
return;
Expand Down Expand Up @@ -236,11 +225,11 @@ static void exec_criu(struct criu_opts *opts)
DECLARE_ARG("--enable-fs");
DECLARE_ARG("tracefs");
DECLARE_ARG("-D");
DECLARE_ARG(opts->directory);
DECLARE_ARG(opts->user->directory);
DECLARE_ARG("-o");
DECLARE_ARG(log);

if (opts->verbose)
if (opts->user->verbose)
DECLARE_ARG("-vvvvvv");

if (strcmp(opts->action, "dump") == 0 || strcmp(opts->action, "pre-dump") == 0) {
Expand Down Expand Up @@ -275,21 +264,21 @@ static void exec_criu(struct criu_opts *opts)
DECLARE_ARG(opts->tty_id);
}

if (opts->predump_dir) {
if (opts->user->predump_dir) {
DECLARE_ARG("--prev-images-dir");
DECLARE_ARG(opts->predump_dir);
DECLARE_ARG(opts->user->predump_dir);
}

if (opts->pageserver_address && opts->pageserver_port) {
if (opts->user->pageserver_address && opts->user->pageserver_port) {
DECLARE_ARG("--page-server");
DECLARE_ARG("--address");
DECLARE_ARG(opts->pageserver_address);
DECLARE_ARG(opts->user->pageserver_address);
DECLARE_ARG("--port");
DECLARE_ARG(opts->pageserver_port);
DECLARE_ARG(opts->user->pageserver_port);
}

/* only for final dump */
if (strcmp(opts->action, "dump") == 0 && !opts->stop)
if (strcmp(opts->action, "dump") == 0 && !opts->user->stop)
DECLARE_ARG("--leave-running");
} else if (strcmp(opts->action, "restore") == 0) {
void *m;
Expand Down Expand Up @@ -556,7 +545,7 @@ static bool restore_net_info(struct lxc_container *c)

// do_restore never returns, the calling process is used as the
// monitor process. do_restore calls exit() if it fails.
void do_restore(struct lxc_container *c, int status_pipe, char *directory, bool verbose)
void do_restore(struct lxc_container *c, int status_pipe, struct migrate_opts *opts)
{
pid_t pid;
char pidfile[L_tmpnam];
Expand Down Expand Up @@ -642,10 +631,9 @@ void do_restore(struct lxc_container *c, int status_pipe, char *directory, bool
}

os.action = "restore";
os.directory = directory;
os.user = opts;
os.c = c;
os.pidfile = pidfile;
os.verbose = verbose;
os.cgroup_path = cgroup_canonical_path(handler);
os.console_fd = c->lxc_conf->console.slave;

Expand Down Expand Up @@ -829,16 +817,14 @@ static int save_tty_major_minor(char *directory, struct lxc_container *c, char *
}

/* do one of either predump or a regular dump */
static bool do_dump(struct lxc_container *c, char *mode, char *directory,
bool stop, bool verbose, char *predump_dir,
char *pageserver_address, char *pageserver_port)
static bool do_dump(struct lxc_container *c, char *mode, struct migrate_opts *opts)
{
pid_t pid;

if (!criu_ok(c))
return false;

if (mkdir_p(directory, 0700) < 0)
if (mkdir_p(opts->directory, 0700) < 0)
return false;

pid = fork();
Expand All @@ -851,16 +837,11 @@ static bool do_dump(struct lxc_container *c, char *mode, char *directory,
struct criu_opts os;

os.action = mode;
os.directory = directory;
os.user = opts;
os.c = c;
os.stop = stop;
os.verbose = verbose;
os.predump_dir = predump_dir;
os.console_name = c->lxc_conf->console.path;
os.pageserver_address = pageserver_address;
os.pageserver_port = pageserver_port;

if (save_tty_major_minor(directory, c, os.tty_id, sizeof(os.tty_id)) < 0)
if (save_tty_major_minor(opts->directory, c, os.tty_id, sizeof(os.tty_id)) < 0)
exit(1);

/* exec_criu() returning is an error */
Expand Down Expand Up @@ -891,17 +872,17 @@ static bool do_dump(struct lxc_container *c, char *mode, char *directory,
}
}

bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port)
bool __criu_pre_dump(struct lxc_container *c, struct migrate_opts *opts)
{
return do_dump(c, "pre-dump", directory, false, verbose, predump_dir, pageserver_address, pageserver_port);
return do_dump(c, "pre-dump", opts);
}

bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port)
bool __criu_dump(struct lxc_container *c, struct migrate_opts *opts)
{
char path[PATH_MAX];
int ret;

ret = snprintf(path, sizeof(path), "%s/inventory.img", directory);
ret = snprintf(path, sizeof(path), "%s/inventory.img", opts->directory);
if (ret < 0 || ret >= sizeof(path))
return false;

Expand All @@ -910,10 +891,10 @@ bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbo
return false;
}

return do_dump(c, "dump", directory, stop, verbose, predump_dir, pageserver_address, pageserver_port);
return do_dump(c, "dump", opts);
}

bool __criu_restore(struct lxc_container *c, char *directory, bool verbose)
bool __criu_restore(struct lxc_container *c, struct migrate_opts *opts)
{
pid_t pid;
int status, nread;
Expand Down Expand Up @@ -942,7 +923,7 @@ bool __criu_restore(struct lxc_container *c, char *directory, bool verbose)
if (pid == 0) {
close(pipefd[0]);
// this never returns
do_restore(c, pipefd[1], directory, verbose);
do_restore(c, pipefd[1], opts);
}

close(pipefd[1]);
Expand Down
6 changes: 3 additions & 3 deletions src/lxc/criu.h
Expand Up @@ -27,8 +27,8 @@

#include <lxc/lxccontainer.h>

bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port);
bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port);
bool __criu_restore(struct lxc_container *c, char *directory, bool verbose);
bool __criu_pre_dump(struct lxc_container *c, struct migrate_opts *opts);
bool __criu_dump(struct lxc_container *c, struct migrate_opts *opts);
bool __criu_restore(struct lxc_container *c, struct migrate_opts *opts);

#endif
6 changes: 3 additions & 3 deletions src/lxc/lxccontainer.c
Expand Up @@ -3968,13 +3968,13 @@ static int do_lxcapi_migrate(struct lxc_container *c, unsigned int cmd,

switch (cmd) {
case MIGRATE_PRE_DUMP:
ret = !__criu_pre_dump(c, opts->directory, opts->verbose, opts->predump_dir, opts->pageserver_address, opts->pageserver_port);
ret = !__criu_pre_dump(c, opts);
break;
case MIGRATE_DUMP:
ret = !__criu_dump(c, opts->directory, opts->stop, opts->verbose, opts->predump_dir, opts->pageserver_address, opts->pageserver_port);
ret = !__criu_dump(c, opts);
break;
case MIGRATE_RESTORE:
ret = !__criu_restore(c, opts->directory, opts->verbose);
ret = !__criu_restore(c, opts);
break;
default:
ERROR("invalid migrate command %u", cmd);
Expand Down

0 comments on commit b2c3710

Please sign in to comment.