Browse code

Merge pull request #29893 from cpuguy83/fix_race_in_plugin_activation

Fix race accessing plugin storage map

Akihiro Suda authored on 2017/01/07 04:48:41
Showing 1 changed files
... ...
@@ -221,6 +221,10 @@ func loadWithRetry(name string, retry bool) (*Plugin, error) {
221 221
 		}
222 222
 
223 223
 		storage.Lock()
224
+		if pl, exists := storage.plugins[name]; exists {
225
+			storage.Unlock()
226
+			return pl, pl.activate()
227
+		}
224 228
 		storage.plugins[name] = pl
225 229
 		storage.Unlock()
226 230
 
... ...
@@ -298,7 +302,10 @@ func GetAll(imp string) ([]*Plugin, error) {
298 298
 	chPl := make(chan *plLoad, len(pluginNames))
299 299
 	var wg sync.WaitGroup
300 300
 	for _, name := range pluginNames {
301
-		if pl, ok := storage.plugins[name]; ok {
301
+		storage.Lock()
302
+		pl, ok := storage.plugins[name]
303
+		storage.Unlock()
304
+		if ok {
302 305
 			chPl <- &plLoad{pl, nil}
303 306
 			continue
304 307
 		}