summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoropenshift-ci[bot] <75433959+openshift-ci[bot]@users.noreply.github.com>2022-07-11 13:31:39 +0000
committerGitHub <noreply@github.com>2022-07-11 13:31:39 +0000
commitea2c31c98893c6e9e907bf3661d4456c886575bd (patch)
tree105eb331e91d038422cbdcc82bd5b6f981ee33b6
parent0af75a74d27c1d37009ba49f7fce11ff188954eb (diff)
parent3bb4cf8ee2ca4d2b5fcd16da95a6ebd60b9ed18b (diff)
downloadpodman-ea2c31c98893c6e9e907bf3661d4456c886575bd.tar.gz
podman-ea2c31c98893c6e9e907bf3661d4456c886575bd.tar.bz2
podman-ea2c31c98893c6e9e907bf3661d4456c886575bd.zip
Merge pull request #14874 from vrothberg/fix-14859
exit code improvements
-rw-r--r--libpod/container_api.go4
-rw-r--r--libpod/container_internal.go6
-rw-r--r--libpod/oci_conmon_linux.go2
-rw-r--r--test/system/130-kill.bats13
4 files changed, 23 insertions, 2 deletions
diff --git a/libpod/container_api.go b/libpod/container_api.go
index dbd5fc1fb..742eb6d3e 100644
--- a/libpod/container_api.go
+++ b/libpod/container_api.go
@@ -551,6 +551,10 @@ func (c *Container) WaitForExit(ctx context.Context, pollInterval time.Duration)
exitCode, err := c.runtime.state.GetContainerExitCode(id)
if err != nil {
+ if errors.Is(err, define.ErrNoSuchExitCode) && c.ensureState(define.ContainerStateConfigured, define.ContainerStateCreated) {
+ // The container never ran.
+ return true, 0, nil
+ }
return true, -1, err
}
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 560b4a1c1..6a98466c2 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -1104,6 +1104,12 @@ func (c *Container) cleanupRuntime(ctx context.Context) error {
return nil
}
+ // We may be doing this redundantly for some call paths but we need to
+ // make sure the exit code is being read at this point.
+ if err := c.checkExitFile(); err != nil {
+ return err
+ }
+
// If necessary, delete attach and ctl files
if err := c.removeConmonFiles(); err != nil {
return err
diff --git a/libpod/oci_conmon_linux.go b/libpod/oci_conmon_linux.go
index 0cdfe90e9..121e750f4 100644
--- a/libpod/oci_conmon_linux.go
+++ b/libpod/oci_conmon_linux.go
@@ -303,7 +303,7 @@ func (r *ConmonOCIRuntime) UpdateContainerStatus(ctr *Container) error {
ctr.state.ExitCode = -1
ctr.state.FinishedTime = time.Now()
ctr.state.State = define.ContainerStateExited
- return nil
+ return ctr.runtime.state.AddContainerExitCode(ctr.ID(), ctr.state.ExitCode)
}
return fmt.Errorf("error getting container %s state. stderr/out: %s: %w", ctr.ID(), out, err)
}
diff --git a/test/system/130-kill.bats b/test/system/130-kill.bats
index 96b633a42..7522c475d 100644
--- a/test/system/130-kill.bats
+++ b/test/system/130-kill.bats
@@ -133,11 +133,22 @@ load helpers
@test "podman kill - concurrent stop" {
# 14761 - concurrent kill/stop must record the exit code
random_name=$(random_string 10)
- run_podman run -d --replace --name=$random_name alpine sh -c "trap 'echo Received SIGTERM, ignoring' SIGTERM; echo READY; while :; do sleep 0.2; done"
+ run_podman run -d --replace --name=$random_name $IMAGE sh -c "trap 'echo Received SIGTERM, ignoring' SIGTERM; echo READY; while :; do sleep 0.2; done"
$PODMAN stop -t 1 $random_name &
run_podman kill $random_name
run_podman wait $random_name
run_podman rm -f $random_name
}
+@test "podman wait - exit codes" {
+ random_name=$(random_string 10)
+ run_podman create --name=$random_name $IMAGE /no/such/command
+ # Container never ran -> exit code == 0
+ run_podman wait $random_name
+ # Container did not start successfully -> exit code != 0
+ run_podman 125 start $random_name
+ # FIXME(#14873): while older Podmans return 0 on wait, Docker does not.
+ run_podman wait $random_name
+}
+
# vim: filetype=sh