Merge pull request #1887 from mheon/rm_sync

Add --sync option to podman rm
This commit is contained in:
OpenShift Merge Robot
2018-12-06 08:11:51 -08:00
committed by GitHub
5 changed files with 33 additions and 8 deletions

View File

@ -200,6 +200,10 @@ var (
Usage: "Sort output by command, created, id, image, names, runningfor, size, or status",
Value: "created",
},
cli.BoolFlag{
Name: "sync",
Usage: "Sync container state with OCI runtime",
},
}
psDescription = "Prints out information about the containers"
psCommand = cli.Command{
@ -260,6 +264,7 @@ func psCmd(c *cli.Context) error {
Size: c.Bool("size"),
Namespace: c.Bool("namespace"),
Sort: c.String("sort"),
Sync: c.Bool("sync"),
}
filters := c.StringSlice("filter")

View File

@ -45,6 +45,7 @@ type PsOptions struct {
Sort string
Label string
Namespace bool
Sync bool
}
// BatchContainerStruct is the return obkect from BatchContainer and contains
@ -126,6 +127,12 @@ func NewBatchContainer(ctr *libpod.Container, opts PsOptions) (PsContainerOutput
pso PsContainerOutput
)
batchErr := ctr.Batch(func(c *libpod.Container) error {
if opts.Sync {
if err := c.Sync(); err != nil {
return err
}
}
conState, err = c.State()
if err != nil {
return errors.Wrapf(err, "unable to obtain container state")

View File

@ -2037,6 +2037,7 @@ _podman_ps() {
--quiet -q
--size -s
--namespace --ns
--sync
"
_complete_ "$options_with_args" "$boolean_options"
}

View File

@ -103,6 +103,13 @@ Valid filters are listed below:
Print usage statement
**--sync**
Force a sync of container state with the OCI runtime.
In some cases, a container's state in the runtime can become out of sync with Podman's state.
This will update Podman's state based on what the OCI runtime reports.
Forcibly syncing is much slower, but can resolve inconsistent state issues.
## EXAMPLES
```

View File

@ -675,22 +675,27 @@ func (c *Container) Batch(batchFunc func(*Container) error) error {
return err
}
// Sync updates the current state of the container, checking whether its state
// has changed
// Sync can only be used inside Batch() - otherwise, it will be done
// automatically.
// When called outside Batch(), Sync() is a no-op
// Sync updates the status of a container by querying the OCI runtime.
// If the container has not been created inside the OCI runtime, nothing will be
// done.
// Most of the time, Podman does not explicitly query the OCI runtime for
// container status, and instead relies upon exit files created by conmon.
// This can cause a disconnect between running state and what Podman sees in
// cases where Conmon was killed unexpected, or runc was upgraded.
// Running a manual Sync() ensures that container state will be correct in
// such situations.
func (c *Container) Sync() error {
if !c.batched {
return nil
c.lock.Lock()
defer c.lock.Unlock()
}
// If runtime knows about the container, update its status in runtime
// And then save back to disk
if (c.state.State != ContainerStateUnknown) &&
(c.state.State != ContainerStateConfigured) {
(c.state.State != ContainerStateConfigured) &&
(c.state.State != ContainerStateExited) {
oldState := c.state.State
// TODO: optionally replace this with a stat for the exit file
if err := c.runtime.ociRuntime.updateContainerStatus(c, true); err != nil {
return err
}