Merge pull request #9624 from mheon/fix_9615

[NO TESTS NEEDED] Do not return from c.stop() before re-locking
This commit is contained in:
OpenShift Merge Robot 2021-03-05 11:37:03 -05:00 committed by GitHub
commit 44e6d20023
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 4 deletions

View File

@ -1307,9 +1307,7 @@ func (c *Container) stop(timeout uint) error {
c.lock.Unlock()
}
if err := c.ociRuntime.StopContainer(c, timeout, all); err != nil {
return err
}
stopErr := c.ociRuntime.StopContainer(c, timeout, all)
if !c.batched {
c.lock.Lock()
@ -1318,13 +1316,23 @@ func (c *Container) stop(timeout uint) error {
// If the container has already been removed (e.g., via
// the cleanup process), there's nothing left to do.
case define.ErrNoSuchCtr, define.ErrCtrRemoved:
return nil
return stopErr
default:
if stopErr != nil {
logrus.Errorf("Error syncing container %s status: %v", c.ID(), err)
return stopErr
}
return err
}
}
}
// We have to check stopErr *after* we lock again - otherwise, we have a
// change of panicing on a double-unlock. Ref: GH Issue 9615
if stopErr != nil {
return stopErr
}
// Since we're now subject to a race condition with other processes who
// may have altered the state (and other data), let's check if the
// state has changed. If so, we should return immediately and log a