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)
static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
{
int ret, state_client_fd = -1;
bool retv = false;
int killret, ret;
pid_t pid;
int haltsignal = SIGPWR;
int haltsignal = SIGPWR, state_client_fd = -1;
lxc_state_t states[MAX_STATE] = {0};
if (!c)
......@@ -1873,6 +1872,7 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
if (!do_lxcapi_is_running(c))
return true;
pid = do_lxcapi_init_pid(c);
if (pid <= 0)
return true;
......@@ -1884,37 +1884,49 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
if (c->lxc_conf && 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
* don't miss a state.
*/
states[STOPPED] = 1;
ret = lxc_cmd_add_state_client(c->name, c->config_path, states,
&state_client_fd);
if (timeout != 0) {
states[STOPPED] = 1;
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 (kill(pid, haltsignal) < 0)
WARN("Could not send signal %d to pid %d", haltsignal, pid);
if (state_client_fd < 0)
return false;
if (ret == STOPPED)
return true;
/* Retrieve the 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)
if (ret < MAX_STATE)
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)
......
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