From 66fb7c9bb52ceded75fe2f798dfcd52217ca675a 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 b92255d7ed..083b4e9fc4 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -882,6 +882,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 5a2e34eaa1..67c8e4b66b 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() {