mirror of
https://github.com/containers/podman.git
synced 2025-05-21 00:56:36 +08:00
Sync: handle exit file
Make sure `Sync()` handles state transitions and exit codes correctly. The function was only being called when batching which could render containers in an unusable state when running concurrently with other state-altering functions/commands since the state must be re-read from the database before acting upon it. Fixes: #14761 Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
This commit is contained in:
@ -761,19 +761,8 @@ func (c *Container) Sync() error {
|
|||||||
defer c.lock.Unlock()
|
defer c.lock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// If runtime knows about the container, update its status in runtime
|
if err := c.syncContainer(); err != nil {
|
||||||
// And then save back to disk
|
return err
|
||||||
if c.ensureState(define.ContainerStateCreated, define.ContainerStateRunning, define.ContainerStatePaused, define.ContainerStateStopped, define.ContainerStateStopping) {
|
|
||||||
oldState := c.state.State
|
|
||||||
if err := c.ociRuntime.UpdateContainerStatus(c); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Only save back to DB if state changed
|
|
||||||
if c.state.State != oldState {
|
|
||||||
if err := c.save(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defer c.newContainerEvent(events.Sync)
|
defer c.newContainerEvent(events.Sync)
|
||||||
|
@ -130,4 +130,14 @@ load helpers
|
|||||||
is "$output" $cname
|
is "$output" $cname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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"
|
||||||
|
$PODMAN stop -t 1 $random_name &
|
||||||
|
run_podman kill $random_name
|
||||||
|
run_podman wait $random_name
|
||||||
|
run_podman rm -f $random_name
|
||||||
|
}
|
||||||
|
|
||||||
# vim: filetype=sh
|
# vim: filetype=sh
|
||||||
|
Reference in New Issue
Block a user