lxccontainer: restore non-blocking shutdown

If timeout is set to 0 don't block. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent bc631984
...@@ -1862,10 +1862,9 @@ WRAP_API_1(bool, lxcapi_reboot2, int) ...@@ -1862,10 +1862,9 @@ WRAP_API_1(bool, lxcapi_reboot2, int)
static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout) static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
{ {
int ret, state_client_fd = -1; int killret, ret;
bool retv = false;
pid_t pid; pid_t pid;
int haltsignal = SIGPWR; int haltsignal = SIGPWR, state_client_fd = -1;
lxc_state_t states[MAX_STATE] = {0}; lxc_state_t states[MAX_STATE] = {0};
if (!c) if (!c)
...@@ -1873,6 +1872,7 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout) ...@@ -1873,6 +1872,7 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
if (!do_lxcapi_is_running(c)) if (!do_lxcapi_is_running(c))
return true; return true;
pid = do_lxcapi_init_pid(c); pid = do_lxcapi_init_pid(c);
if (pid <= 0) if (pid <= 0)
return true; return true;
...@@ -1884,37 +1884,49 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout) ...@@ -1884,37 +1884,49 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
if (c->lxc_conf && c->lxc_conf->haltsignal) if (c->lxc_conf && c->lxc_conf->haltsignal)
haltsignal = c->lxc_conf->haltsignal; haltsignal = c->lxc_conf->haltsignal;
INFO("Using signal number '%d' as halt signal", haltsignal);
/* Add a new state client before sending the shutdown signal so that we /* Add a new state client before sending the shutdown signal so that we
* don't miss a state. * don't miss a state.
*/ */
states[STOPPED] = 1; if (timeout != 0) {
ret = lxc_cmd_add_state_client(c->name, c->config_path, states, states[STOPPED] = 1;
&state_client_fd); ret = lxc_cmd_add_state_client(c->name, c->config_path, states,
&state_client_fd);
if (ret < 0)
return false;
/* Send shutdown signal to container. */ if (state_client_fd < 0)
if (kill(pid, haltsignal) < 0) return false;
WARN("Could not send signal %d to pid %d", haltsignal, pid);
if (ret == STOPPED)
return true;
/* Retrieve the state. */ if (ret < MAX_STATE)
if (state_client_fd >= 0) {
int state;
state = lxc_cmd_sock_rcv_state(state_client_fd, timeout);
close(state_client_fd);
TRACE("Received state \"%s\"", lxc_state2str(state));
if (state != STOPPED)
return false; return false;
retv = true;
} else if (ret == STOPPED) {
TRACE("Container is already stopped");
retv = true;
} else {
TRACE("Received state \"%s\" instead of expected \"STOPPED\"",
lxc_state2str(ret));
} }
return retv; /* Send shutdown signal to container. */
killret = kill(pid, haltsignal);
if (killret < 0) {
WARN("Could not send signal %d to pid %d", haltsignal, pid);
if (state_client_fd >= 0)
close(state_client_fd);
return false;
}
TRACE("Sent signal %d to pid %d", haltsignal, pid);
if (timeout == 0)
return true;
ret = lxc_cmd_sock_rcv_state(state_client_fd, timeout);
close(state_client_fd);
if (ret < 0)
return false;
TRACE("Received state \"%s\"", lxc_state2str(ret));
if (ret != STOPPED)
return false;
return true;
} }
WRAP_API_1(bool, lxcapi_shutdown, int) WRAP_API_1(bool, lxcapi_shutdown, int)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment