aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2018-04-03 18:24:54 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-04-04 01:09:23 +0000
commiteb0d5dfff1ecec97df71247bfb76748d60a666dc (patch)
treeeb25455c62cb58a090196a2d50b545d94bc1bd0e
parent35a10c9ba541807b96b01cc66f79c72606d9ed99 (diff)
downloadpodman-eb0d5dfff1ecec97df71247bfb76748d60a666dc.tar.gz
podman-eb0d5dfff1ecec97df71247bfb76748d60a666dc.tar.bz2
podman-eb0d5dfff1ecec97df71247bfb76748d60a666dc.zip
Prevent a potential race when stopping containers
If sending a signal fails, check if the container is alive. If it is not, it probably stopped on its own before we could send the signal, so don't error out. Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #591 Approved by: rhatdan
-rw-r--r--libpod/oci.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/libpod/oci.go b/libpod/oci.go
index 049d0817b..b59525de7 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -467,6 +467,15 @@ func (r *OCIRuntime) stopContainer(ctr *Container, timeout uint) error {
if timeout > 0 {
if err := r.killContainer(ctr, stopSignal); err != nil {
+ // Is the container gone?
+ // If so, it probably died between the first check and
+ // our sending the signal
+ // The container is stopped, so exit cleanly
+ err := unix.Kill(ctr.state.PID, 0)
+ if err == unix.ESRCH {
+ return nil
+ }
+
return err
}
@@ -479,6 +488,12 @@ func (r *OCIRuntime) stopContainer(ctr *Container, timeout uint) error {
}
if err := utils.ExecCmdWithStdStreams(os.Stdin, os.Stdout, os.Stderr, r.path, "kill", "--all", ctr.ID(), "KILL"); err != nil {
+ // Again, check if the container is gone. If it is, exit cleanly.
+ err := unix.Kill(ctr.state.PID, 0)
+ if err == unix.ESRCH {
+ return nil
+ }
+
return errors.Wrapf(err, "error sending SIGKILL to container %s", ctr.ID())
}