From 19aabf440e4e30662080e52ca1c88c7fd376997d Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Wed, 3 May 2023 14:44:16 +0200 Subject: [PATCH] remote: exec inspect update exec session status The remote API will wait 300s by default before conmon will call the cleanup. In the meantime when you inspect an exec session started with ExecStart() (so not attached) and it did exit we do not know that. If a caller inspects it they think it is still running. To prevent this we should sync the session based on the exec pid and update the state accordingly. For a reproducer see the test in this commit or the issue. Fixes #18424 Signed-off-by: Paul Holzinger --- libpod/container.go | 11 +++++++++++ pkg/bindings/test/exec_test.go | 11 ++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libpod/container.go b/libpod/container.go index 640e24a5f9..3f899f8daf 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -893,6 +893,17 @@ func (c *Container) execSessionNoCopy(id string) (*ExecSession, error) { return nil, fmt.Errorf("no exec session with ID %s found in container %s: %w", id, c.ID(), define.ErrNoSuchExecSession) } + // make sure to update the exec session if needed #18424 + alive, err := c.ociRuntime.ExecUpdateStatus(c, id) + if err != nil { + return nil, err + } + if !alive { + if err := retrieveAndWriteExecExitCode(c, session.ID()); err != nil { + return nil, err + } + } + return session, nil } diff --git a/pkg/bindings/test/exec_test.go b/pkg/bindings/test/exec_test.go index 2943b087a9..97fc6dc9df 100644 --- a/pkg/bindings/test/exec_test.go +++ b/pkg/bindings/test/exec_test.go @@ -30,7 +30,7 @@ var _ = Describe("Podman containers exec", func() { bt.cleanup() }) - It("Podman exec create makes an exec session", func() { + It("Podman exec create+start makes an exec session", func() { name := "testCtr" cid, err := bt.RunTopContainer(&name, nil) Expect(err).ToNot(HaveOccurred()) @@ -48,6 +48,15 @@ var _ = Describe("Podman containers exec", func() { Expect(inspectOut.ProcessConfig.Entrypoint).To(Equal("echo")) Expect(inspectOut.ProcessConfig.Arguments).To(HaveLen(1)) Expect(inspectOut.ProcessConfig.Arguments[0]).To(Equal("hello world")) + + err = containers.ExecStart(bt.conn, sessionID, nil) + Expect(err).ToNot(HaveOccurred()) + + inspectOut, err = containers.ExecInspect(bt.conn, sessionID, nil) + Expect(err).ToNot(HaveOccurred()) + Expect(inspectOut.ContainerID).To(Equal(cid)) + Expect(inspectOut.Running).To(BeFalse(), "session should not be running") + Expect(inspectOut.ExitCode).To(Equal(0), "exit code from echo") }) It("Podman exec create with bad command fails", func() {