diff options
author | Matthew Heon <matthew.heon@pm.me> | 2019-12-12 16:19:36 -0500 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2019-12-12 16:35:37 -0500 |
commit | bd44fd5c815fc750fd6b60899328564bee74e6e5 (patch) | |
tree | 980a0e85eec4f3a646c1f0ac63c05634fd13510b /libpod/oci.go | |
parent | c2dab75f0ec1502e075cf5174d1b308267648fda (diff) | |
download | podman-bd44fd5c815fc750fd6b60899328564bee74e6e5.tar.gz podman-bd44fd5c815fc750fd6b60899328564bee74e6e5.tar.bz2 podman-bd44fd5c815fc750fd6b60899328564bee74e6e5.zip |
Reap exec sessions on cleanup and removal
We currently rely on exec sessions being removed from the state
by the Exec() API itself, on detecting the session stopping. This
is not a reliable method, though. The Podman frontend for exec
could be killed before the session ended, or another Podman
process could be holding the lock and prevent update (most
notable in `run --rm`, when a container with an active exec
session is stopped).
To resolve this, add a function to reap active exec sessions from
the state, and use it on cleanup (to clear sessions after the
container stops) and remove (to do the same when --rm is passed).
This is a bit more complicated than it ought to be because Kata
and company exist, and we can't guarantee the exec session has a
PID on the host, so we have to plumb this through to the OCI
runtime.
Fixes #4666
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'libpod/oci.go')
-rw-r--r-- | libpod/oci.go | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/libpod/oci.go b/libpod/oci.go index 9e761788e..05a2f37db 100644 --- a/libpod/oci.go +++ b/libpod/oci.go @@ -23,9 +23,6 @@ type OCIRuntime interface { // CreateContainer creates the container in the OCI runtime. CreateContainer(ctr *Container, restoreOptions *ContainerCheckpointOptions) error // UpdateContainerStatus updates the status of the given container. - // It includes a switch for whether to perform a hard query of the - // runtime. If unset, the exit file (if supported by the implementation) - // will be used. UpdateContainerStatus(ctr *Container) error // StartContainer starts the given container. StartContainer(ctr *Container) error @@ -59,6 +56,9 @@ type OCIRuntime interface { // If timeout is 0, SIGKILL will be sent immediately, and SIGTERM will // be omitted. ExecStopContainer(ctr *Container, sessionID string, timeout uint) error + // ExecUpdateStatus checks the status of a given exec session. + // Returns true if the session is still running, or false if it exited. + ExecUpdateStatus(ctr *Container, sessionID string) (bool, error) // ExecContainerCleanup cleans up after an exec session exits. // It removes any files left by the exec session that are no longer // needed, including the attach socket. |