summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Vedovati <mvedovati@suse.com>2018-06-27 19:01:45 +0200
committerAtomic Bot <atomic-devel@projectatomic.io>2018-06-28 13:39:52 +0000
commit333ab8c21120c3f7e6b3df7a6a49ca860f079266 (patch)
tree10a7eae95ed31729ded06bff4cb5f28c92091ab6
parentb5cd076164cdd99c7cc4108b13469228d184eb0e (diff)
downloadpodman-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
-rw-r--r--cmd/podman/utils.go26
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