diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2019-12-13 10:19:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-13 10:19:31 +0100 |
commit | 71a0c0f69c992a1840a28201526b211f9055b1b6 (patch) | |
tree | 142891c07239f655b3b6657e690d7736731601c9 /libpod/container_internal.go | |
parent | 123e7ea5686a80d6b92486fa88284cfad7b1be6c (diff) | |
parent | bd44fd5c815fc750fd6b60899328564bee74e6e5 (diff) | |
download | podman-71a0c0f69c992a1840a28201526b211f9055b1b6.tar.gz podman-71a0c0f69c992a1840a28201526b211f9055b1b6.tar.bz2 podman-71a0c0f69c992a1840a28201526b211f9055b1b6.zip |
Merge pull request #4692 from mheon/reap_exec_sessions
Reap exec sessions on cleanup and removal
Diffstat (limited to 'libpod/container_internal.go')
-rw-r--r-- | libpod/container_internal.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 1e8a8a580..37801162a 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -1749,6 +1749,11 @@ func (c *Container) checkReadyForRemoval() error { return errors.Wrapf(define.ErrCtrStateInvalid, "cannot remove container %s as it is %s - running or paused containers cannot be removed without force", c.ID(), c.state.State.String()) } + // Reap exec sessions + if err := c.reapExecSessions(); err != nil { + return err + } + if len(c.state.ExecSessions) != 0 { return errors.Wrapf(define.ErrCtrStateInvalid, "cannot remove container %s as it has active exec sessions", c.ID()) } @@ -1855,3 +1860,38 @@ func (c *Container) checkExitFile() error { // Read the exit file to get our stopped time and exit code. return c.handleExitFile(exitFile, info) } + +// Reap dead exec sessions +func (c *Container) reapExecSessions() error { + // Instead of saving once per iteration, use a defer to do it once at + // the end. + var lastErr error + needSave := false + for id := range c.state.ExecSessions { + alive, err := c.ociRuntime.ExecUpdateStatus(c, id) + if err != nil { + if lastErr != nil { + logrus.Errorf("Error reaping exec sessions for container %s: %v", c.ID(), lastErr) + } + lastErr = err + continue + } + if !alive { + // Clean up lingering files and remove the exec session + if err := c.ociRuntime.ExecContainerCleanup(c, id); err != nil { + return errors.Wrapf(err, "error cleaning up container %s exec session %s files", c.ID(), id) + } + delete(c.state.ExecSessions, id) + needSave = true + } + } + if needSave { + if err := c.save(); err != nil { + if lastErr != nil { + logrus.Errorf("Error reaping exec sessions for container %s: %v", c.ID(), lastErr) + } + lastErr = err + } + } + return lastErr +} |