Browse code

When handling plugin exit, lookup plugins only during daemon shutdown.

The main intent of handling plugin exit is for graceful shutdown
of plugins during daemon shutdown. So avoid plugin lookup during
plugin exits caused by other reasons (eg. force remove)

Signed-off-by: Anusha Ragunathan <anusha@docker.com>

Anusha Ragunathan authored on 2016/08/16 01:27:36
Showing 2 changed files
... ...
@@ -253,20 +253,24 @@ func LookupWithCapability(name, capability string) (Plugin, error) {
253 253
 	return nil, ErrInadequateCapability{name, capability}
254 254
 }
255 255
 
256
-// StateChanged updates plugin internals using from libcontainerd events.
256
+// StateChanged updates plugin internals using libcontainerd events.
257 257
 func (pm *Manager) StateChanged(id string, e libcontainerd.StateInfo) error {
258 258
 	logrus.Debugf("plugin state changed %s %#v", id, e)
259 259
 
260 260
 	switch e.State {
261 261
 	case libcontainerd.StateExit:
262
+		var shutdown bool
262 263
 		pm.RLock()
263
-		p, idOk := pm.plugins[id]
264
+		shutdown = pm.shutdown
264 265
 		pm.RUnlock()
265
-		if !idOk {
266
-			return ErrNotFound(id)
267
-		}
268
-		if pm.shutdown == true {
269
-			p.exitChan <- true
266
+		if shutdown {
267
+			pm.RLock()
268
+			p, idOk := pm.plugins[id]
269
+			pm.RUnlock()
270
+			if !idOk {
271
+				return ErrNotFound(id)
272
+			}
273
+			close(p.exitChan)
270 274
 		}
271 275
 	}
272 276
 
... ...
@@ -143,10 +143,12 @@ func (pm *Manager) disable(p *plugin) error {
143 143
 
144 144
 // Shutdown stops all plugins and called during daemon shutdown.
145 145
 func (pm *Manager) Shutdown() {
146
+	pm.Lock()
147
+	pm.shutdown = true
148
+	pm.Unlock()
149
+
146 150
 	pm.RLock()
147 151
 	defer pm.RUnlock()
148
-
149
-	pm.shutdown = true
150 152
 	for _, p := range pm.plugins {
151 153
 		if pm.liveRestore && p.PluginObj.Active {
152 154
 			logrus.Debug("Plugin active when liveRestore is set, skipping shutdown")
... ...
@@ -173,7 +175,6 @@ func (pm *Manager) Shutdown() {
173 173
 					}
174 174
 				}
175 175
 			}
176
-			close(p.exitChan)
177 176
 		}
178 177
 		if err := os.RemoveAll(p.runtimeSourcePath); err != nil {
179 178
 			logrus.Errorf("Remove plugin runtime failed with error: %v", err)