Browse code

Merge pull request #35516 from mlaventure/reduce-race-on-exit

Add missing lock in ProcessEvent

Sebastiaan van Stijn authored on 2017/12/01 04:30:51
Showing 1 changed files
... ...
@@ -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
 			}