Browse code

Fixes plugin file descriptor leak on plugin discovery

Signed-off-by: Clinton Kitson <clintonskitson@gmail.com>

Clinton Kitson authored on 2016/02/27 01:57:44
Showing 1 changed files
... ...
@@ -199,17 +199,27 @@ func GetAll(imp string) ([]*Plugin, error) {
199 199
 		err error
200 200
 	}
201 201
 
202
-	chPl := make(chan plLoad, len(pluginNames))
202
+	chPl := make(chan *plLoad, len(pluginNames))
203
+	var wg sync.WaitGroup
203 204
 	for _, name := range pluginNames {
205
+		if pl, ok := storage.plugins[name]; ok {
206
+			chPl <- &plLoad{pl, nil}
207
+			continue
208
+		}
209
+
210
+		wg.Add(1)
204 211
 		go func(name string) {
212
+			defer wg.Done()
205 213
 			pl, err := loadWithRetry(name, false)
206
-			chPl <- plLoad{pl, err}
214
+			chPl <- &plLoad{pl, err}
207 215
 		}(name)
208 216
 	}
209 217
 
218
+	wg.Wait()
219
+	close(chPl)
220
+
210 221
 	var out []*Plugin
211
-	for i := 0; i < len(pluginNames); i++ {
212
-		pl := <-chPl
222
+	for pl := range chPl {
213 223
 		if pl.err != nil {
214 224
 			logrus.Error(err)
215 225
 			continue