diff options
author | Marco Vedovati <mvedovati@suse.com> | 2019-06-17 15:14:54 +0200 |
---|---|---|
committer | Marco Vedovati <mvedovati@suse.com> | 2019-06-26 10:17:29 +0200 |
commit | 4f56964d556a7379c09a903258fd44c2232a686a (patch) | |
tree | 57f2be6e11e5f413122172505c1b7661bae2a5e1 /libpod/container_attach_linux.go | |
parent | 6e9b490f5e2c84a903e6cc86440599e3ea7c63d2 (diff) | |
download | podman-4f56964d556a7379c09a903258fd44c2232a686a.tar.gz podman-4f56964d556a7379c09a903258fd44c2232a686a.tar.bz2 podman-4f56964d556a7379c09a903258fd44c2232a686a.zip |
libpod: fix hang on container start and attach
When a container is attached upon start, the WaitGroup counter may
never be decremented if an error is raised before start, causing
the caller to hang.
Synchronize with the start & attach goroutine using a channel, to be
able to detect failures before start.
Signed-off-by: Marco Vedovati <mvedovati@suse.com>
Diffstat (limited to 'libpod/container_attach_linux.go')
-rw-r--r-- | libpod/container_attach_linux.go | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/libpod/container_attach_linux.go b/libpod/container_attach_linux.go index 3de5ea1cf..f5aac5794 100644 --- a/libpod/container_attach_linux.go +++ b/libpod/container_attach_linux.go @@ -8,7 +8,6 @@ import ( "net" "os" "path/filepath" - "sync" "github.com/containers/libpod/libpod/define" "github.com/containers/libpod/pkg/kubeutils" @@ -33,22 +32,22 @@ const ( // Attach to the given container // Does not check if state is appropriate -func (c *Container) attach(streams *AttachStreams, keys string, resize <-chan remotecommand.TerminalSize, startContainer bool, wg *sync.WaitGroup) error { +func (c *Container) attach(streams *AttachStreams, keys string, resize <-chan remotecommand.TerminalSize, startContainer bool, started chan bool) error { if !streams.AttachOutput && !streams.AttachError && !streams.AttachInput { return errors.Wrapf(define.ErrInvalidArg, "must provide at least one stream to attach to") } logrus.Debugf("Attaching to container %s", c.ID()) - return c.attachContainerSocket(resize, keys, streams, startContainer, wg) + return c.attachContainerSocket(resize, keys, streams, startContainer, started) } // attachContainerSocket connects to the container's attach socket and deals with the IO. -// wg is only required if startContainer is true +// started is only required if startContainer is true // TODO add a channel to allow interrupting -func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, keys string, streams *AttachStreams, startContainer bool, wg *sync.WaitGroup) error { - if startContainer && wg == nil { - return errors.Wrapf(define.ErrInternal, "wait group not passed when startContainer set") +func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, keys string, streams *AttachStreams, startContainer bool, started chan bool) error { + if startContainer && started == nil { + return errors.Wrapf(define.ErrInternal, "started chan not passed when startContainer set") } // Use default detach keys when keys aren't passed or specified in libpod.conf @@ -100,7 +99,7 @@ func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSi if err := c.start(); err != nil { return err } - wg.Done() + started <- true } receiveStdoutError := make(chan error) |