2
0
mirror of git://github.com/lxc/lxc synced 2025-09-04 13:29:32 +00:00

Merge pull request #902 from tych0/better-criu-logging

Better criu logging
This commit is contained in:
Stéphane Graber
2016-03-18 16:12:45 -04:00

View File

@@ -126,7 +126,7 @@ static void exec_criu(struct criu_opts *opts)
int netnr = 0; int netnr = 0;
struct lxc_list *it; 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 /* 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 * 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; 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 #undef DECLARE_ARG
execv(argv[0], argv); execv(argv[0], argv);
err: err:
@@ -521,12 +530,12 @@ out_unlock:
// do_restore never returns, the calling process is used as the // do_restore never returns, the calling process is used as the
// monitor process. do_restore calls exit() if it fails. // 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; pid_t pid;
char pidfile[L_tmpnam]; char pidfile[L_tmpnam];
struct lxc_handler *handler; struct lxc_handler *handler;
int status; int status, pipes[2] = {-1, -1};
if (!tmpnam(pidfile)) if (!tmpnam(pidfile))
goto out; goto out;
@@ -552,6 +561,11 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
resolve_clone_flags(handler); resolve_clone_flags(handler);
if (pipe(pipes) < 0) {
SYSERROR("pipe() failed");
goto out_fini_handler;
}
pid = fork(); pid = fork();
if (pid < 0) if (pid < 0)
goto out_fini_handler; 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; struct lxc_rootfs *rootfs;
int flags; int flags;
close(pipe); close(status_pipe);
pipe = -1; 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)) if (unshare(CLONE_NEWNS))
goto out_fini_handler; goto out_fini_handler;
@@ -623,15 +649,18 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
int ret; int ret;
char title[2048]; char title[2048];
close(pipes[1]);
pipes[1] = -1;
pid_t w = waitpid(pid, &status, 0); pid_t w = waitpid(pid, &status, 0);
if (w == -1) { if (w == -1) {
SYSERROR("waitpid"); SYSERROR("waitpid");
goto out_fini_handler; goto out_fini_handler;
} }
ret = write(pipe, &status, sizeof(status)); ret = write(status_pipe, &status, sizeof(status));
close(pipe); close(status_pipe);
pipe = -1; status_pipe = -1;
if (sizeof(status) != ret) { if (sizeof(status) != ret) {
SYSERROR("failed to write all of status"); 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 (WIFEXITED(status)) {
if (WEXITSTATUS(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; goto out_fini_handler;
} else { } else {
int ret; int ret;
@@ -670,6 +710,8 @@ void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose
goto out_fini_handler; goto out_fini_handler;
} }
close(pipes[0]);
/* /*
* See comment in lxcapi_start; we don't care if these * See comment in lxcapi_start; we don't care if these
* fail because it's just a beauty thing. We just * 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: out_fini_handler:
if (pipes[0] >= 0)
close(pipes[0]);
if (pipes[1] >= 0)
close(pipes[1]);
lxc_fini(c->name, handler); lxc_fini(c->name, handler);
if (unlink(pidfile) < 0 && errno != ENOENT) if (unlink(pidfile) < 0 && errno != ENOENT)
SYSERROR("unlinking pidfile failed"); SYSERROR("unlinking pidfile failed");
out: out:
if (pipe >= 0) { if (status_pipe >= 0) {
status = 1; status = 1;
if (write(pipe, &status, sizeof(status)) != sizeof(status)) { if (write(status_pipe, &status, sizeof(status)) != sizeof(status)) {
SYSERROR("writing status failed"); SYSERROR("writing status failed");
} }
close(pipe); close(status_pipe);
} }
exit(1); exit(1);