Browse Source

Add missing lock in ProcessEvent

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Kenfe-Mickael Laventure 7 năm trước cách đây
mục cha
commit
6c03aa3174
1 tập tin đã thay đổi với 4 bổ sung2 xóa
  1. 4 2
      daemon/monitor.go

+ 4 - 2
daemon/monitor.go

@@ -46,12 +46,12 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc
 		daemon.LogContainerEvent(c, "oom")
 	case libcontainerd.EventExit:
 		if int(ei.Pid) == c.Pid {
+			c.Lock()
 			_, _, err := daemon.containerd.DeleteTask(context.Background(), c.ID)
 			if err != nil {
 				logrus.WithError(err).Warnf("failed to delete container %s from containerd", c.ID)
 			}
 
-			c.Lock()
 			c.StreamConfig.Wait()
 			c.Reset(false)
 
@@ -68,6 +68,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc
 				c.SetStopped(&exitStatus)
 				defer daemon.autoRemove(c)
 			}
+			defer c.Unlock() // needs to be called before autoRemove
 
 			// cancel healthcheck here, they will be automatically
 			// restarted if/when the container is started again
@@ -91,7 +92,9 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc
 						}
 					}
 					if err != nil {
+						c.Lock()
 						c.SetStopped(&exitStatus)
+						c.Unlock()
 						defer daemon.autoRemove(c)
 						if err != restartmanager.ErrRestartCanceled {
 							logrus.Errorf("restartmanger wait error: %+v", err)
@@ -101,7 +104,6 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc
 			}
 
 			daemon.setStateCounter(c)
-			defer c.Unlock()
 			if err := c.CheckpointTo(daemon.containersReplica); err != nil {
 				return err
 			}