From 333ab8c21120c3f7e6b3df7a6a49ca860f079266 Mon Sep 17 00:00:00 2001 From: Marco Vedovati Date: Wed, 27 Jun 2018 19:01:45 +0200 Subject: Fix podman hangs when detecting startup error in container attached mode Signed-off-by: Marco Vedovati 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 --- cmd/podman/utils.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'cmd/podman') 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 -- cgit v1.2.3-54-g00ecf