272 lines
7.5 KiB
Diff
272 lines
7.5 KiB
Diff
|
|
From 5aee93396a979771f59d8accc4f4c168fd31b584 Mon Sep 17 00:00:00 2001
|
||
|
|
From: wujing <wujing50@huawei.com>
|
||
|
|
Date: Mon, 13 Apr 2020 06:32:37 -0400
|
||
|
|
Subject: [PATCH 11/49] add exit fifo to monitor state of lxc monitor
|
||
|
|
|
||
|
|
Signed-off-by: wujing <wujing50@huawei.com>
|
||
|
|
---
|
||
|
|
src/lxc/conf.c | 4 ++++
|
||
|
|
src/lxc/conf.h | 2 ++
|
||
|
|
src/lxc/lxccontainer.c | 30 ++++++++++++++++++++++++++++++
|
||
|
|
src/lxc/lxccontainer.h | 8 ++++++++
|
||
|
|
src/lxc/start.c | 20 ++++++++++++++++++++
|
||
|
|
src/lxc/start.h | 5 +++++
|
||
|
|
src/lxc/tools/arguments.h | 1 +
|
||
|
|
src/lxc/tools/lxc_start.c | 14 ++++++++++++++
|
||
|
|
8 files changed, 84 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
|
||
|
|
index 1487b73..a904348 100644
|
||
|
|
--- a/src/lxc/conf.c
|
||
|
|
+++ b/src/lxc/conf.c
|
||
|
|
@@ -2668,6 +2668,7 @@ struct lxc_conf *lxc_conf_init(void)
|
||
|
|
#ifdef HAVE_ISULAD
|
||
|
|
/* isulad add begin */
|
||
|
|
lxc_list_init(&new->populate_devs);
|
||
|
|
+ new->exit_fd = -1;
|
||
|
|
new->umask = 0027; /*default umask 0027*/
|
||
|
|
new->console.init_fifo[0] = NULL;
|
||
|
|
new->console.init_fifo[1] = NULL;
|
||
|
|
@@ -4097,6 +4098,9 @@ void lxc_conf_free(struct lxc_conf *conf)
|
||
|
|
free(conf->shmount.path_cont);
|
||
|
|
#ifdef HAVE_ISULAD
|
||
|
|
free(conf->container_info_file);
|
||
|
|
+ if (conf->exit_fd != -1) {
|
||
|
|
+ close(conf->exit_fd);
|
||
|
|
+ }
|
||
|
|
lxc_clear_init_args(conf);
|
||
|
|
lxc_clear_populate_devices(conf);
|
||
|
|
#endif
|
||
|
|
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
|
||
|
|
index 23942ac..c5b70e1 100644
|
||
|
|
--- a/src/lxc/conf.h
|
||
|
|
+++ b/src/lxc/conf.h
|
||
|
|
@@ -430,6 +430,8 @@ struct lxc_conf {
|
||
|
|
mode_t umask; //umask value
|
||
|
|
|
||
|
|
char *container_info_file;
|
||
|
|
+
|
||
|
|
+ int exit_fd; /* exit fifo fd*/
|
||
|
|
#endif
|
||
|
|
|
||
|
|
};
|
||
|
|
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
|
||
|
|
index 891fc62..64cde99 100644
|
||
|
|
--- a/src/lxc/lxccontainer.c
|
||
|
|
+++ b/src/lxc/lxccontainer.c
|
||
|
|
@@ -281,6 +281,11 @@ static void lxc_container_free(struct lxc_container *c)
|
||
|
|
free(c->config_path);
|
||
|
|
c->config_path = NULL;
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ free(c->exit_fifo);
|
||
|
|
+ c->exit_fifo = NULL;
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
free(c);
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -894,7 +899,11 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
|
||
|
|
NULL,
|
||
|
|
};
|
||
|
|
char **init_cmd = NULL;
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ int keepfds[] = {-1, -1, -1, -1, -1};
|
||
|
|
+#else
|
||
|
|
int keepfds[3] = {-1, -1, -1};
|
||
|
|
+#endif
|
||
|
|
|
||
|
|
/* container does exist */
|
||
|
|
if (!c)
|
||
|
|
@@ -1091,6 +1100,19 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ /* isulad: open exit fifo */
|
||
|
|
+ if (c->exit_fifo) {
|
||
|
|
+ conf->exit_fd = lxc_open(c->exit_fifo, O_WRONLY | O_NONBLOCK | O_CLOEXEC, 0);
|
||
|
|
+ if (conf->exit_fd < 0) {
|
||
|
|
+ ERROR("Failed to open exit fifo %s: %s.", c->exit_fifo, strerror(errno));
|
||
|
|
+ lxc_free_handler(handler);
|
||
|
|
+ ret = 1;
|
||
|
|
+ goto on_error;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
conf->reboot = REBOOT_NONE;
|
||
|
|
|
||
|
|
/* Unshare the mount namespace if requested */
|
||
|
|
@@ -1125,6 +1147,14 @@ reboot:
|
||
|
|
keepfds[0] = handler->conf->maincmd_fd;
|
||
|
|
keepfds[1] = handler->state_socket_pair[0];
|
||
|
|
keepfds[2] = handler->state_socket_pair[1];
|
||
|
|
+
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ /* keep exit fifo fd */
|
||
|
|
+ if (conf->exit_fd >= 0) {
|
||
|
|
+ keepfds[3] = conf->exit_fd;
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
ret = lxc_check_inherited(conf, c->daemonize, keepfds,
|
||
|
|
sizeof(keepfds) / sizeof(keepfds[0]));
|
||
|
|
if (ret < 0) {
|
||
|
|
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
|
||
|
|
index 4a9ba13..fa9bd5e 100644
|
||
|
|
--- a/src/lxc/lxccontainer.h
|
||
|
|
+++ b/src/lxc/lxccontainer.h
|
||
|
|
@@ -107,6 +107,14 @@ struct lxc_container {
|
||
|
|
/*! Full path to configuration file */
|
||
|
|
char *config_path;
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ /*! isulad:
|
||
|
|
+ * \private
|
||
|
|
+ * exit FIFO File to open used monitor the state of lxc monitor process.
|
||
|
|
+ */
|
||
|
|
+ char *exit_fifo;
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
/*!
|
||
|
|
* \brief Determine if \c /var/lib/lxc/$name/config exists.
|
||
|
|
*
|
||
|
|
diff --git a/src/lxc/start.c b/src/lxc/start.c
|
||
|
|
index f5f9565..70e8282 100644
|
||
|
|
--- a/src/lxc/start.c
|
||
|
|
+++ b/src/lxc/start.c
|
||
|
|
@@ -681,6 +681,11 @@ struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf,
|
||
|
|
handler->nsfd[i] = -EBADF;
|
||
|
|
|
||
|
|
handler->name = name;
|
||
|
|
+
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ handler->exit_code = -1; /* isulad: record exit code of container */
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
if (daemonize)
|
||
|
|
handler->transient_pid = lxc_raw_getpid();
|
||
|
|
else
|
||
|
|
@@ -953,6 +958,16 @@ void lxc_end(struct lxc_handler *handler)
|
||
|
|
*/
|
||
|
|
lxc_monitor_send_state(name, STOPPED, handler->lxcpath);
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ /* isuald: write exit code to exit fifo */
|
||
|
|
+ if (handler->conf->exit_fd >= 0) {
|
||
|
|
+ ret = write(handler->conf->exit_fd, &handler->exit_code, sizeof(int));
|
||
|
|
+ if (ret != sizeof(int)) {
|
||
|
|
+ SYSERROR("Failed to write to exit code to exit fifo.");
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
/* The command socket is closed so no one can acces the command
|
||
|
|
* socket anymore so there's no need to lock it.
|
||
|
|
*/
|
||
|
|
@@ -2127,10 +2142,15 @@ int __lxc_start(struct lxc_handler *handler, struct lxc_operations *ops,
|
||
|
|
#else
|
||
|
|
lxc_monitor_send_exit_code(name, status, handler->lxcpath);
|
||
|
|
#endif
|
||
|
|
+
|
||
|
|
lxc_error_set_and_log(handler->pid, status);
|
||
|
|
if (error_num)
|
||
|
|
*error_num = handler->exit_status;
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ handler->exit_code = exit_code; /* record exit code */
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
/* These are not the droids you are looking for. */
|
||
|
|
__private_goto1:
|
||
|
|
lxc_delete_network(handler);
|
||
|
|
diff --git a/src/lxc/start.h b/src/lxc/start.h
|
||
|
|
index 7e2371c..1368d0e 100644
|
||
|
|
--- a/src/lxc/start.h
|
||
|
|
+++ b/src/lxc/start.h
|
||
|
|
@@ -122,6 +122,11 @@ struct lxc_handler {
|
||
|
|
int exit_status;
|
||
|
|
|
||
|
|
struct cgroup_ops *cgroup_ops;
|
||
|
|
+
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+ int exit_code;/* isulad: record the exit code of container */
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
};
|
||
|
|
|
||
|
|
struct execute_args {
|
||
|
|
diff --git a/src/lxc/tools/arguments.h b/src/lxc/tools/arguments.h
|
||
|
|
index 214949b..ea5f938 100644
|
||
|
|
--- a/src/lxc/tools/arguments.h
|
||
|
|
+++ b/src/lxc/tools/arguments.h
|
||
|
|
@@ -43,6 +43,7 @@ struct lxc_arguments {
|
||
|
|
#ifdef HAVE_ISULAD
|
||
|
|
const char *container_info; /* isulad: file used to store pid and ppid info of container */
|
||
|
|
char *terminal_fifos[3]; /* isulad add, fifos used to redirct stdin/out/err */
|
||
|
|
+ const char *exit_monitor_fifo; /* isulad: fifo used to monitor state of monitor process */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/* for lxc-console */
|
||
|
|
diff --git a/src/lxc/tools/lxc_start.c b/src/lxc/tools/lxc_start.c
|
||
|
|
index 4c4c820..8041f02 100644
|
||
|
|
--- a/src/lxc/tools/lxc_start.c
|
||
|
|
+++ b/src/lxc/tools/lxc_start.c
|
||
|
|
@@ -28,6 +28,10 @@
|
||
|
|
#include "confile.h"
|
||
|
|
#include "log.h"
|
||
|
|
|
||
|
|
+#ifdef HAVE_ISULAD
|
||
|
|
+#include "isulad_utils.h"
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
lxc_log_define(lxc_start, lxc);
|
||
|
|
|
||
|
|
static int my_parser(struct lxc_arguments *args, int c, char *arg);
|
||
|
|
@@ -50,6 +54,7 @@ static const struct option my_longopts[] = {
|
||
|
|
{"share-pid", required_argument, 0, OPT_SHARE_PID},
|
||
|
|
#ifdef HAVE_ISULAD
|
||
|
|
{"container-pidfile", required_argument, 0, OPT_CONTAINER_INFO},
|
||
|
|
+ {"exit-fifo", required_argument, 0, OPT_EXIT_FIFO},
|
||
|
|
#endif
|
||
|
|
LXC_COMMON_OPTIONS
|
||
|
|
};
|
||
|
|
@@ -121,6 +126,7 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
|
||
|
|
case OPT_SHARE_PID:
|
||
|
|
args->share_ns[LXC_NS_PID] = arg;
|
||
|
|
break;
|
||
|
|
+
|
||
|
|
#ifdef HAVE_ISULAD
|
||
|
|
case OPT_CONTAINER_INFO:
|
||
|
|
args->container_info = arg;
|
||
|
|
@@ -133,8 +139,11 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
|
||
|
|
break;
|
||
|
|
case OPT_STDERR_FIFO:
|
||
|
|
args->terminal_fifos[2] = arg;
|
||
|
|
+ case OPT_EXIT_FIFO:
|
||
|
|
+ args->exit_monitor_fifo = arg;
|
||
|
|
break;
|
||
|
|
#endif
|
||
|
|
+
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
@@ -315,8 +324,13 @@ int main(int argc, char *argv[])
|
||
|
|
goto out;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
+
|
||
|
|
if (my_args.terminal_fifos[0] || my_args.terminal_fifos[1] || my_args.terminal_fifos[2]) {
|
||
|
|
c->set_terminal_init_fifos(c, my_args.terminal_fifos[0], my_args.terminal_fifos[1], my_args.terminal_fifos[2]);
|
||
|
|
+
|
||
|
|
+ /* isulad: fifo used to monitor state of monitor process */
|
||
|
|
+ if (my_args.exit_monitor_fifo != NULL) {
|
||
|
|
+ c->exit_fifo = safe_strdup(my_args.exit_monitor_fifo);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
--
|
||
|
|
1.8.3.1
|
||
|
|
|