From b35fab6f1c246c5596114e68d8af89caf9808c5d Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Fri, 14 Oct 2022 11:31:49 +0200 Subject: [PATCH] kill: wait for the container Make sure to wait for the container to exit after kill. While the cleanup process will take care eventually of transitioning the state, we need to give a guarantee to the user to leave the container in the expected state once the (kill) command has finished. The issue could be observed in a flaking test (#16142) where `podman rm -f -t0` failed because the preceding `podman kill` left the container in "running" state which ultimately confused the "stop" backend. Note that we should only wait for the container to exit when SIGKILL is being used. Other signals have different semantics. [NO NEW TESTS NEEDED] as I do not know how to reliably reproduce the issue. If #16142 stops flaking, we are good. Fixes: #16142 Signed-off-by: Valentin Rothberg --- libpod/container_api.go | 7 ++++++- libpod/container_internal.go | 3 +++ test/e2e/attach_test.go | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libpod/container_api.go b/libpod/container_api.go index e179665d59..14d0b7e634 100644 --- a/libpod/container_api.go +++ b/libpod/container_api.go @@ -244,7 +244,12 @@ func (c *Container) Kill(signal uint) error { c.newContainerEvent(events.Kill) - return c.save() + // Make sure to wait for the container to exit in case of SIGKILL. + if signal == uint(unix.SIGKILL) { + return c.waitForConmonToExitAndSave() + } + + return nil } // Attach attaches to a container. diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 7f8f467543..13feb2ffeb 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -1325,7 +1325,10 @@ func (c *Container) stop(timeout uint) error { c.newContainerEvent(events.Stop) c.state.StoppedByUser = true + return c.waitForConmonToExitAndSave() +} +func (c *Container) waitForConmonToExitAndSave() error { conmonAlive, err := c.ociRuntime.CheckConmonRunning(c) if err != nil { return err diff --git a/test/e2e/attach_test.go b/test/e2e/attach_test.go index b110f7c5b2..c2bc582087 100644 --- a/test/e2e/attach_test.go +++ b/test/e2e/attach_test.go @@ -82,6 +82,7 @@ var _ = Describe("Podman attach", func() { Expect(results.OutputToString()).To(ContainSubstring("test")) Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) }) + It("podman attach to the latest container", func() { session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", ALPINE, "/bin/sh", "-c", "while true; do echo test1; sleep 1; done"}) session.WaitWithDefaultTimeout()