diff options
author | Matthew Heon <mheon@redhat.com> | 2018-01-29 11:59:33 -0500 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-01-30 05:02:12 +0000 |
commit | c60d8a0671b48ffdeda68895e0b7d97b252d66d9 (patch) | |
tree | 6be6b971913ae7763b79d7eef68dc71284a841c5 /libpod/container_api.go | |
parent | dd133a1ad25f75e5ddd53ed6cf59eedfb6838f54 (diff) | |
download | podman-c60d8a0671b48ffdeda68895e0b7d97b252d66d9.tar.gz podman-c60d8a0671b48ffdeda68895e0b7d97b252d66d9.tar.bz2 podman-c60d8a0671b48ffdeda68895e0b7d97b252d66d9.zip |
Add StopWithTimeout API function for containers
Normal Stop should not need a timeout, and should use the default
Add a function that does accept a timeout aside it
Signed-off-by: Matthew Heon <mheon@redhat.com>
Closes: #272
Approved by: rhatdan
Diffstat (limited to 'libpod/container_api.go')
-rw-r--r-- | libpod/container_api.go | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/libpod/container_api.go b/libpod/container_api.go index 2b3c83eb2..cd3485880 100644 --- a/libpod/container_api.go +++ b/libpod/container_api.go @@ -326,10 +326,11 @@ func (c *Container) Start() error { } // Stop uses the container's stop signal (or SIGTERM if no signal was specified) -// to stop the container, and if it has not stopped after the given timeout (in -// seconds), uses SIGKILL to attempt to forcibly stop the container. -// If timeout is 0, SIGKILL will be used immediately -func (c *Container) Stop(timeout uint) error { +// to stop the container, and if it has not stopped after container's stop +// timeout, SIGKILL is used to attempt to forcibly stop the container +// Default stop timeout is 10 seconds, but can be overridden when the container +// is created +func (c *Container) Stop() error { if !c.locked { c.lock.Lock() defer c.lock.Unlock() @@ -339,24 +340,23 @@ func (c *Container) Stop(timeout uint) error { } } - logrus.Debugf("Stopping ctr %s with timeout %d", c.ID(), timeout) - - if c.state.State == ContainerStateConfigured || - c.state.State == ContainerStateUnknown || - c.state.State == ContainerStatePaused { - return errors.Wrapf(ErrCtrStateInvalid, "can only stop created, running, or stopped containers") - } + return c.stop(c.config.StopTimeout) +} - if err := c.runtime.ociRuntime.stopContainer(c, timeout); err != nil { - return err - } +// StopWithTimeout is a version of Stop that allows a timeout to be specified +// manually. If timeout is 0, SIGKILL will be used immediately to kill the +// container. +func (c *Container) StopWithTimeout(timeout uint) error { + if !c.locked { + c.lock.Lock() + defer c.lock.Unlock() - // Sync the container's state to pick up return code - if err := c.runtime.ociRuntime.updateContainerStatus(c); err != nil { - return err + if err := c.syncContainer(); err != nil { + return err + } } - return c.cleanupStorage() + return c.stop(timeout) } // Kill sends a signal to a container |