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>
| ... | ... |
@@ -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)
|