mirror of
git://github.com/lxc/lxc
synced 2025-08-31 15:47:54 +00:00
Merge pull request #902 from tych0/better-criu-logging
Better criu logging
This commit is contained in:
@@ -126,7 +126,7 @@ static void exec_criu(struct criu_opts *opts)
|
||||
int netnr = 0;
|
||||
struct lxc_list *it;
|
||||
|
||||
char buf[4096], tty_info[32];
|
||||
char buf[4096], *pos, tty_info[32];
|
||||
|
||||
/* If we are currently in a cgroup /foo/bar, and the container is in a
|
||||
* cgroup /lxc/foo, lxcfs will give us an ENOENT if some task in the
|
||||
@@ -356,6 +356,15 @@ static void exec_criu(struct criu_opts *opts)
|
||||
|
||||
argv[argc] = NULL;
|
||||
|
||||
buf[0] = 0;
|
||||
pos = buf;
|
||||
for (i = 0; argv[i]; i++) {
|
||||
pos = strncat(buf, argv[i], buf + sizeof(buf) - pos);
|
||||
pos = strncat(buf, " ", buf + sizeof(buf) - pos);
|
||||
}
|
||||
|
||||
INFO("execing: %s", buf);
|
||||
|
||||
#undef DECLARE_ARG
|
||||
execv(argv[0], argv);
|
||||
err:
|
||||
@@ -521,12 +530,12 @@ out_unlock:
|
||||
|
||||
// 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 pipe, char *directory, bool verbose)
|
||||
void do_restore(struct lxc_container *c, int status_pipe, char *directory, bool verbose)
|
||||
{
|
||||
pid_t pid;
|
||||
char pidfile[L_tmpnam];
|
||||
struct lxc_handler *handler;
|
||||
int status;
|
||||
int status, pipes[2] = {-1, -1};
|
||||
|
||||
if (!tmpnam(pidfile))
|
||||
goto out;
|
||||
@@ -552,6 +561,11 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
|
||||
resolve_clone_flags(handler);
|
||||
|
||||
if (pipe(pipes) < 0) {
|
||||
SYSERROR("pipe() failed");
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
pid = fork();
|
||||
if (pid < 0)
|
||||
goto out_fini_handler;
|
||||
@@ -561,8 +575,20 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
struct lxc_rootfs *rootfs;
|
||||
int flags;
|
||||
|
||||
close(pipe);
|
||||
pipe = -1;
|
||||
close(status_pipe);
|
||||
status_pipe = -1;
|
||||
|
||||
close(pipes[0]);
|
||||
pipes[0] = -1;
|
||||
if (dup2(pipes[1], STDERR_FILENO) < 0) {
|
||||
SYSERROR("dup2 failed");
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
if (dup2(pipes[1], STDOUT_FILENO) < 0) {
|
||||
SYSERROR("dup2 failed");
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
if (unshare(CLONE_NEWNS))
|
||||
goto out_fini_handler;
|
||||
@@ -623,15 +649,18 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
int ret;
|
||||
char title[2048];
|
||||
|
||||
close(pipes[1]);
|
||||
pipes[1] = -1;
|
||||
|
||||
pid_t w = waitpid(pid, &status, 0);
|
||||
if (w == -1) {
|
||||
SYSERROR("waitpid");
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
ret = write(pipe, &status, sizeof(status));
|
||||
close(pipe);
|
||||
pipe = -1;
|
||||
ret = write(status_pipe, &status, sizeof(status));
|
||||
close(status_pipe);
|
||||
status_pipe = -1;
|
||||
|
||||
if (sizeof(status) != ret) {
|
||||
SYSERROR("failed to write all of status");
|
||||
@@ -640,7 +669,18 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
if (WEXITSTATUS(status)) {
|
||||
ERROR("criu process exited %d\n", WEXITSTATUS(status));
|
||||
char buf[4096];
|
||||
int n;
|
||||
|
||||
n = read(pipes[0], buf, sizeof(buf));
|
||||
if (n < 0) {
|
||||
SYSERROR("failed reading from criu stderr");
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
buf[n] = 0;
|
||||
|
||||
ERROR("criu process exited %d, output:\n%s\n", WEXITSTATUS(status), buf);
|
||||
goto out_fini_handler;
|
||||
} else {
|
||||
int ret;
|
||||
@@ -670,6 +710,8 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
goto out_fini_handler;
|
||||
}
|
||||
|
||||
close(pipes[0]);
|
||||
|
||||
/*
|
||||
* See comment in lxcapi_start; we don't care if these
|
||||
* fail because it's just a beauty thing. We just
|
||||
@@ -686,17 +728,22 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
|
||||
}
|
||||
|
||||
out_fini_handler:
|
||||
if (pipes[0] >= 0)
|
||||
close(pipes[0]);
|
||||
if (pipes[1] >= 0)
|
||||
close(pipes[1]);
|
||||
|
||||
lxc_fini(c->name, handler);
|
||||
if (unlink(pidfile) < 0 && errno != ENOENT)
|
||||
SYSERROR("unlinking pidfile failed");
|
||||
|
||||
out:
|
||||
if (pipe >= 0) {
|
||||
if (status_pipe >= 0) {
|
||||
status = 1;
|
||||
if (write(pipe, &status, sizeof(status)) != sizeof(status)) {
|
||||
if (write(status_pipe, &status, sizeof(status)) != sizeof(status)) {
|
||||
SYSERROR("writing status failed");
|
||||
}
|
||||
close(pipe);
|
||||
close(status_pipe);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
|
Reference in New Issue
Block a user