diff options
author | Marco Vedovati <mvedovati@suse.com> | 2018-06-27 19:01:45 +0200 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-06-28 13:39:52 +0000 |
commit | 333ab8c21120c3f7e6b3df7a6a49ca860f079266 (patch) | |
tree | 10a7eae95ed31729ded06bff4cb5f28c92091ab6 /cmd/podman/utils.go | |
parent | b5cd076164cdd99c7cc4108b13469228d184eb0e (diff) | |
download | podman-333ab8c21120c3f7e6b3df7a6a49ca860f079266.tar.gz podman-333ab8c21120c3f7e6b3df7a6a49ca860f079266.tar.bz2 podman-333ab8c21120c3f7e6b3df7a6a49ca860f079266.zip |
Fix podman hangs when detecting startup error in container attached mode
Signed-off-by: Marco Vedovati <mvedovati@suse.com>
The initial resize command sent to the terminal window over the resize
channel may never be delivered in case of error.
Hence it is necessary to consume all data from the resize channel to
avoid a deadlock on startup.
Fixes: #1009
Closes: #1010
Approved by: giuseppe
Diffstat (limited to 'cmd/podman/utils.go')
-rw-r--r-- | cmd/podman/utils.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go index fdb720cec..522b74926 100644 --- a/cmd/podman/utils.go +++ b/cmd/podman/utils.go @@ -46,6 +46,19 @@ func attachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys defer restoreTerminal(oldTermState) } + // There may be on the other size of the resize channel a goroutine trying to send. + // So consume all data inside the channel before exiting to avoid a deadlock. + defer func() { + for { + select { + case <-resize: + logrus.Debugf("Consumed resize command from channel") + default: + return + } + } + }() + streams := new(libpod.AttachStreams) streams.OutputStream = stdout streams.ErrorStream = stderr @@ -103,6 +116,19 @@ func startAttachCtr(ctr *libpod.Container, stdout, stderr, stdin *os.File, detac defer restoreTerminal(oldTermState) } + // There may be on the other size of the resize channel a goroutine trying to send. + // So consume all data inside the channel before exiting to avoid a deadlock. + defer func() { + for { + select { + case <-resize: + logrus.Debugf("Consumed resize command from channel") + default: + return + } + } + }() + streams := new(libpod.AttachStreams) streams.OutputStream = stdout streams.ErrorStream = stderr |