mirror of
https://github.com/containers/podman.git
synced 2025-05-21 09:05:56 +08:00
auto-update: stop+start instead of restart sytemd units
It turns out the restart is _not_ a stop+start but keeps certain resources open and is subject to some timeouts that may differ across distributions' default settings. [NO NEW TESTS NEEDED] as I have absolutely no idea how to reliably cause the failure/flake/race. Also ignore ENOENTS of the CID file when removing a container which has been identified of actually fixing #17607. Fixes: #17607 Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
This commit is contained in:
@ -811,7 +811,7 @@ func (r *Runtime) removeContainer(ctx context.Context, c *Container, force, remo
|
|||||||
|
|
||||||
// Remove the container's CID file on container removal.
|
// Remove the container's CID file on container removal.
|
||||||
if cidFile, ok := c.config.Spec.Annotations[define.InspectAnnotationCIDFile]; ok {
|
if cidFile, ok := c.config.Spec.Annotations[define.InspectAnnotationCIDFile]; ok {
|
||||||
if err := os.Remove(cidFile); err != nil {
|
if err := os.Remove(cidFile); err != nil && !errors.Is(err, os.ErrNotExist) {
|
||||||
if cleanupErr == nil {
|
if cleanupErr == nil {
|
||||||
cleanupErr = err
|
cleanupErr = err
|
||||||
} else {
|
} else {
|
||||||
|
@ -334,8 +334,16 @@ func (t *task) rollbackImage() error {
|
|||||||
|
|
||||||
// restartSystemdUnit restarts the systemd unit the container is running in.
|
// restartSystemdUnit restarts the systemd unit the container is running in.
|
||||||
func (u *updater) restartSystemdUnit(ctx context.Context, unit string) error {
|
func (u *updater) restartSystemdUnit(ctx context.Context, unit string) error {
|
||||||
|
if err := u.stopSystemdUnit(ctx, unit); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.startSystemdUnit(ctx, unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// startSystemdUnit starts the systemd unit the container is running in.
|
||||||
|
func (u *updater) startSystemdUnit(ctx context.Context, unit string) error {
|
||||||
restartChan := make(chan string)
|
restartChan := make(chan string)
|
||||||
if _, err := u.conn.RestartUnitContext(ctx, unit, "replace", restartChan); err != nil {
|
if _, err := u.conn.StartUnitContext(ctx, unit, "replace", restartChan); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +357,28 @@ func (u *updater) restartSystemdUnit(ctx context.Context, unit string) error {
|
|||||||
return nil
|
return nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("expected %q but received %q", "done", result)
|
return fmt.Errorf("error starting systemd unit %q expected %q but received %q", unit, "done", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// stopSystemdUnit stop the systemd unit the container is running in.
|
||||||
|
func (u *updater) stopSystemdUnit(ctx context.Context, unit string) error {
|
||||||
|
restartChan := make(chan string)
|
||||||
|
if _, err := u.conn.StopUnitContext(ctx, unit, "replace", restartChan); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the restart to finish and actually check if it was
|
||||||
|
// successful or not.
|
||||||
|
result := <-restartChan
|
||||||
|
|
||||||
|
switch result {
|
||||||
|
case "done":
|
||||||
|
logrus.Infof("Successfully stopped systemd unit %q", unit)
|
||||||
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("error stopping systemd unit %q expected %q but received %q", unit, "done", result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user