@@ -329,14 +329,16 @@ func (h *httpLoader) updateTargets(ctx context.Context, tcs map[string]*types.Ta
329
329
return
330
330
}
331
331
h .m .Lock ()
332
+ // do delete first, since target change
333
+ // consists of delete and add
334
+ for _ , n := range targetOp .Del {
335
+ delete (h .lastTargets , n )
336
+ }
332
337
for n , t := range targetOp .Add {
333
338
if _ , ok := h .lastTargets [n ]; ! ok {
334
339
h .lastTargets [n ] = t
335
340
}
336
341
}
337
- for _ , n := range targetOp .Del {
338
- delete (h .lastTargets , n )
339
- }
340
342
h .m .Unlock ()
341
343
opChan <- targetOp
342
344
}
@@ -417,12 +419,29 @@ func (f *httpLoader) runActions(ctx context.Context, tcs map[string]*types.Targe
417
419
}
418
420
}()
419
421
// create waitGroup and add the number of target operations to it
420
- wg := new (sync.WaitGroup )
421
- wg .Add (len (targetOp .Add ) + len (targetOp .Del ))
422
+ wgDelete := new (sync.WaitGroup )
423
+ wgDelete .Add (len (targetOp .Del ))
424
+ // run OnDelete actions first, since change==delete+add
425
+ for _ , tDel := range targetOp .Del {
426
+ go func (name string ) {
427
+ defer wgDelete .Done ()
428
+ err := f .runOnDeleteActions (ctx , name , tcs )
429
+ if err != nil {
430
+ f .logger .Printf ("failed running OnDelete actions: %v" , err )
431
+ return
432
+ }
433
+ opChan <- & loaders.TargetOperation {Del : []string {name }}
434
+ }(tDel )
435
+ }
436
+ wgDelete .Wait ()
437
+
438
+ wgAdd := new (sync.WaitGroup )
439
+ wgAdd .Add (len (targetOp .Add ))
440
+
422
441
// run OnAdd actions
423
442
for n , tAdd := range targetOp .Add {
424
443
go func (n string , tc * types.TargetConfig ) {
425
- defer wg .Done ()
444
+ defer wgDelete .Done ()
426
445
err := f .runOnAddActions (ctx , tc .Name , tcs )
427
446
if err != nil {
428
447
f .logger .Printf ("failed running OnAdd actions: %v" , err )
@@ -431,19 +450,8 @@ func (f *httpLoader) runActions(ctx context.Context, tcs map[string]*types.Targe
431
450
opChan <- & loaders.TargetOperation {Add : map [string ]* types.TargetConfig {n : tc }}
432
451
}(n , tAdd )
433
452
}
434
- // run OnDelete actions
435
- for _ , tDel := range targetOp .Del {
436
- go func (name string ) {
437
- defer wg .Done ()
438
- err := f .runOnDeleteActions (ctx , name , tcs )
439
- if err != nil {
440
- f .logger .Printf ("failed running OnDelete actions: %v" , err )
441
- return
442
- }
443
- opChan <- & loaders.TargetOperation {Del : []string {name }}
444
- }(tDel )
445
- }
446
- wg .Wait ()
453
+
454
+ wgAdd .Wait ()
447
455
close (opChan )
448
456
<- doneCh //wait for gathering goroutine to finish
449
457
return result , nil
0 commit comments