aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <mheon@redhat.com>2018-07-13 10:24:17 -0400
committerMatthew Heon <mheon@redhat.com>2018-07-13 14:28:41 -0400
commit028374b99e5c9dd23236a10495ea0aebe819b51f (patch)
treebcae62cde75f78ce639b5925f1a485dec98d3218
parent14a6d51a8432fc0c3324fec02e8729d3032f2af2 (diff)
downloadpodman-028374b99e5c9dd23236a10495ea0aebe819b51f.tar.gz
podman-028374b99e5c9dd23236a10495ea0aebe819b51f.tar.bz2
podman-028374b99e5c9dd23236a10495ea0aebe819b51f.zip
Record whether the container has exited
Use this to supplement exit codes returned from containers, to make sure we know when exit codes are invalid (as the container has not yet exited) Signed-off-by: Matthew Heon <mheon@redhat.com>
-rw-r--r--cmd/podman/batchcontainer/container.go2
-rw-r--r--cmd/podman/ps.go2
-rw-r--r--libpod/container.go12
-rw-r--r--libpod/container_internal.go2
-rw-r--r--libpod/oci.go1
5 files changed, 13 insertions, 6 deletions
diff --git a/cmd/podman/batchcontainer/container.go b/cmd/podman/batchcontainer/container.go
index 09db4f8a2..76b10b633 100644
--- a/cmd/podman/batchcontainer/container.go
+++ b/cmd/podman/batchcontainer/container.go
@@ -75,7 +75,7 @@ func BatchContainerOp(ctr *libpod.Container, opts PsOptions) (BatchContainerStru
return errors.Wrapf(err, "unable to obtain container state")
}
- exitCode, err = c.ExitCode()
+ exitCode, _, err = c.ExitCode()
if err != nil {
return errors.Wrapf(err, "unable to obtain container exit code")
}
diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go
index 49e43ffac..22055b274 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -324,7 +324,7 @@ func generateContainerFilterFuncs(filter, filterValue string, runtime *libpod.Ru
return nil, errors.Wrapf(err, "exited code out of range %q", filterValue)
}
return func(c *libpod.Container) bool {
- ec, err := c.ExitCode()
+ ec, _, err := c.ExitCode()
if ec == int32(exitCode) && err == nil {
return true
}
diff --git a/libpod/container.go b/libpod/container.go
index f882868ed..38f07bd5b 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -135,6 +135,8 @@ type containerState struct {
FinishedTime time.Time `json:"finishedTime,omitempty"`
// ExitCode is the exit code returned when the container stopped
ExitCode int32 `json:"exitCode,omitempty"`
+ // Exited is whether the container has exited
+ Exited bool `json:"exited,omitempty"`
// OOMKilled indicates that the container was killed as it ran out of
// memory
OOMKilled bool `json:"oomKilled,omitempty"`
@@ -667,16 +669,18 @@ func (c *Container) FinishedTime() (time.Time, error) {
}
// ExitCode returns the exit code of the container as
-// an int32
-func (c *Container) ExitCode() (int32, error) {
+// an int32, and whether the container has exited.
+// If the container has not exited, exit code will always be 0.
+// If the container restarts, the exit code is reset to 0.
+func (c *Container) ExitCode() (int32, bool, error) {
if !c.batched {
c.lock.Lock()
defer c.lock.Unlock()
if err := c.syncContainer(); err != nil {
- return 0, errors.Wrapf(err, "error updating container %s state", c.ID())
+ return 0, false, errors.Wrapf(err, "error updating container %s state", c.ID())
}
}
- return c.state.ExitCode, nil
+ return c.state.ExitCode, c.state.Exited, nil
}
// OOMKilled returns whether the container was killed by an OOM condition
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 905402c47..010d01315 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -586,6 +586,8 @@ func (c *Container) reinit(ctx context.Context) error {
// Set and save now to make sure that, if the init() below fails
// we still have a valid state
c.state.State = ContainerStateConfigured
+ c.state.ExitCode = 0
+ c.state.Exited = false
if err := c.save(); err != nil {
return err
}
diff --git a/libpod/oci.go b/libpod/oci.go
index c0478b3b6..3eaf159e7 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -450,6 +450,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container) error {
ctr.state.OOMKilled = true
}
+ ctr.state.Exited = true
}
return nil