Add missing lock in ProcessEvent
| ... | ... |
@@ -50,12 +50,12 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc |
| 50 | 50 |
daemon.LogContainerEvent(c, "oom") |
| 51 | 51 |
case libcontainerd.EventExit: |
| 52 | 52 |
if int(ei.Pid) == c.Pid {
|
| 53 |
+ c.Lock() |
|
| 53 | 54 |
_, _, err := daemon.containerd.DeleteTask(context.Background(), c.ID) |
| 54 | 55 |
if err != nil {
|
| 55 | 56 |
logrus.WithError(err).Warnf("failed to delete container %s from containerd", c.ID)
|
| 56 | 57 |
} |
| 57 | 58 |
|
| 58 |
- c.Lock() |
|
| 59 | 59 |
c.StreamConfig.Wait() |
| 60 | 60 |
c.Reset(false) |
| 61 | 61 |
|
| ... | ... |
@@ -72,6 +72,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc |
| 72 | 72 |
c.SetStopped(&exitStatus) |
| 73 | 73 |
defer daemon.autoRemove(c) |
| 74 | 74 |
} |
| 75 |
+ defer c.Unlock() // needs to be called before autoRemove |
|
| 75 | 76 |
|
| 76 | 77 |
// cancel healthcheck here, they will be automatically |
| 77 | 78 |
// restarted if/when the container is started again |
| ... | ... |
@@ -95,7 +96,9 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc |
| 95 | 95 |
} |
| 96 | 96 |
} |
| 97 | 97 |
if err != nil {
|
| 98 |
+ c.Lock() |
|
| 98 | 99 |
c.SetStopped(&exitStatus) |
| 100 |
+ c.Unlock() |
|
| 99 | 101 |
defer daemon.autoRemove(c) |
| 100 | 102 |
if err != restartmanager.ErrRestartCanceled {
|
| 101 | 103 |
logrus.Errorf("restartmanger wait error: %+v", err)
|
| ... | ... |
@@ -105,7 +108,6 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc |
| 105 | 105 |
} |
| 106 | 106 |
|
| 107 | 107 |
daemon.setStateCounter(c) |
| 108 |
- defer c.Unlock() |
|
| 109 | 108 |
if err := c.CheckpointTo(daemon.containersReplica); err != nil {
|
| 110 | 109 |
return err |
| 111 | 110 |
} |