diff --git a/src/services/execution/execute/execution_extend.c b/src/services/execution/execute/execution_extend.c index 8d1f44c3336153d4e300bd437253e89263f84d68..b2b3bb2a069097d94e87899afebaa0b74a7b8946 100644 --- a/src/services/execution/execute/execution_extend.c +++ b/src/services/execution/execute/execution_extend.c @@ -498,7 +498,7 @@ pack_response: return (cc == ISULAD_SUCCESS) ? 0 : -1; } -static int resume_container(container_t *cont) +static int do_resume_container(container_t *cont) { int ret = 0; const char *id = cont->common_config->id; @@ -662,7 +662,7 @@ static int container_resume_cb(const container_resume_request *request, containe goto pack_response; } - ret = resume_container(cont); + ret = do_resume_container(cont); if (ret != 0) { cc = ISULAD_ERR_EXEC; container_state_set_error(cont->state, (const char *)g_isulad_errmsg); diff --git a/src/services/execution/manager/containers_gc.c b/src/services/execution/manager/containers_gc.c index 98dc38ee01d914d5b264a3a5a6f280a169c03310..b0567e6920ae67b1ad8c7b96f798df182f77bc64 100644 --- a/src/services/execution/manager/containers_gc.c +++ b/src/services/execution/manager/containers_gc.c @@ -25,6 +25,7 @@ #include "utils.h" #include "execution.h" #include "containers_store.h" +#include "runtime.h" static containers_gc_t g_gc_containers; @@ -385,6 +386,57 @@ static void add_to_list_tail_to_retry_gc(struct linked_list *it) gc_containers_unlock(); } +static int do_runtime_resume_container(const container_t *cont) +{ + int ret = 0; + rt_resume_params_t params = { 0 }; + const char *id = cont->common_config->id; + + params.rootpath = cont->root_path; + + if (runtime_resume(id, cont->runtime, ¶ms)) { + ERROR("Failed to resume container:%s", id); + ret = -1; + goto out; + } + + state_reset_paused(cont->state); + + if (container_to_disk(cont)) { + ERROR("Failed to save container \"%s\" to disk", id); + ret = -1; + goto out; + } + +out: + return ret; +} + +static void try_to_resume_container(const char *id, const char *runtime) +{ + int ret = 0; + container_t *cont = NULL; + + if (id == NULL || runtime == NULL) { + ERROR("Invalid input arguments"); + goto out; + } + + cont = containers_store_get(id); + if (cont == NULL) { + WARN("No such container:%s", id); + goto out; + } + + ret = do_runtime_resume_container(cont); + if (ret != 0) { + ERROR("try to runtime resume failed"); + goto out; + } +out: + container_unref(cont); +} + static void gc_container_process(struct linked_list *it) { int ret = 0; @@ -424,6 +476,7 @@ static void gc_container_process(struct linked_list *it) free_container_garbage_config_gc_containers_element(gc_cont); free(it); } else { + try_to_resume_container(id, runtime); ret = kill(pid, SIGKILL); if (ret < 0 && errno != ESRCH) { ERROR("Can not kill process (pid=%d) with SIGKILL for container %s", pid, id); diff --git a/src/services/execution/manager/restore.c b/src/services/execution/manager/restore.c index 7df0042028b942944e24ff3d2f0ccbaee97bcdc6..6f6287cfdf08008e873c446b4a9b3682d4bbf511 100644 --- a/src/services/execution/manager/restore.c +++ b/src/services/execution/manager/restore.c @@ -205,10 +205,14 @@ static void try_to_set_container_running(Container_Status status, container_t *c static int restore_stopped_container(Container_Status status, const container_t *cont, bool *need_save) { const char *id = cont->common_config->id; + pid_t pid = 0; if (status != CONTAINER_STATUS_STOPPED && \ status != CONTAINER_STATUS_CREATED) { - int nret = post_stopped_container_to_gc(id, cont->runtime, cont->state_path, 0); + if (util_process_alive(cont->state->state->pid, cont->state->state->start_time)) { + pid = cont->state->state->pid; + } + int nret = post_stopped_container_to_gc(id, cont->runtime, cont->state_path, pid); if (nret != 0) { ERROR("Failed to post container %s to garbage" "collector, that may lost some resources"