Fix race accessing plugin storage map
| ... | ... |
@@ -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 |
} |