diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-04-16 16:38:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-16 16:38:38 -0400 |
commit | b9730d2e9b8cb7d7798929690fa020f180f2e1b2 (patch) | |
tree | cbc1bebde8b80c8da472865fbe4a85a0146e59bf /libpod/container_exec.go | |
parent | bd94d84fadda7000da78e36d9865949dc8e7adb4 (diff) | |
parent | 9148568b2610c6d1fa03d90acf1f77f7bcea6ba4 (diff) | |
download | podman-b9730d2e9b8cb7d7798929690fa020f180f2e1b2.tar.gz podman-b9730d2e9b8cb7d7798929690fa020f180f2e1b2.tar.bz2 podman-b9730d2e9b8cb7d7798929690fa020f180f2e1b2.zip |
Merge pull request #10062 from mheon/bump_311
Bump to v3.1.1
Diffstat (limited to 'libpod/container_exec.go')
-rw-r--r-- | libpod/container_exec.go | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/libpod/container_exec.go b/libpod/container_exec.go index bb43287d9..8d8ed14aa 100644 --- a/libpod/container_exec.go +++ b/libpod/container_exec.go @@ -696,6 +696,24 @@ func (c *Container) ExecResize(sessionID string, newSize define.TerminalSize) er return errors.Wrapf(define.ErrExecSessionStateInvalid, "cannot resize container %s exec session %s as it is not running", c.ID(), session.ID()) } + // The exec session may have exited since we last updated. + // Needed to prevent race conditions around short-running exec sessions. + running, err := c.ociRuntime.ExecUpdateStatus(c, session.ID()) + if err != nil { + return err + } + if !running { + session.State = define.ExecStateStopped + + if err := c.save(); err != nil { + logrus.Errorf("Error saving state of container %s: %v", c.ID(), err) + } + + return errors.Wrapf(define.ErrExecSessionStateInvalid, "cannot resize container %s exec session %s as it has stopped", c.ID(), session.ID()) + } + + // Make sure the exec session is still running. + return c.ociRuntime.ExecAttachResize(c, sessionID, newSize) } @@ -720,8 +738,13 @@ func (c *Container) Exec(config *ExecConfig, streams *define.AttachStreams, resi logrus.Debugf("Sending resize events to exec session %s", sessionID) for resizeRequest := range resize { if err := c.ExecResize(sessionID, resizeRequest); err != nil { - // Assume the exec session went down. - logrus.Warnf("Error resizing exec session %s: %v", sessionID, err) + if errors.Cause(err) == define.ErrExecSessionStateInvalid { + // The exec session stopped + // before we could resize. + logrus.Infof("Missed resize on exec session %s, already stopped", sessionID) + } else { + logrus.Warnf("Error resizing exec session %s: %v", sessionID, err) + } return } } |