installer: concurrent parent task must wait for all children
Change-Id: I1515d36cc731c6063359dd6957743d853b0255f6
diff --git a/core/installer/tasks/tasks.go b/core/installer/tasks/tasks.go
index c097af3..1cc053b 100644
--- a/core/installer/tasks/tasks.go
+++ b/core/installer/tasks/tasks.go
@@ -157,12 +157,16 @@
})
go subtasks[i].Start()
}
- return <-errCh
+ cnt := 0
for _ = range subtasks {
err := <-errCh
if err != nil {
return err
}
+ cnt++
+ if cnt == len(subtasks) {
+ break
+ }
}
return nil
}
diff --git a/core/installer/tasks/tasks_test.go b/core/installer/tasks/tasks_test.go
index 194be44..f914c88 100644
--- a/core/installer/tasks/tasks_test.go
+++ b/core/installer/tasks/tasks_test.go
@@ -2,7 +2,9 @@
import (
"fmt"
+ "sync"
"testing"
+ "time"
)
func TestLeaf(t *testing.T) {
@@ -78,3 +80,34 @@
t.Fatalf("Expected two, got %s", err)
}
}
+
+func TestConcurrentTaskSucceeds_WaitsForAllChildren(t *testing.T) {
+ cnt := 0
+ var m sync.Mutex
+ one := newLeafTask("one", func() error {
+ m.Lock()
+ defer m.Unlock()
+ cnt++
+ return nil
+ })
+ two := newLeafTask("two", func() error {
+ time.Sleep(1 * time.Second)
+ m.Lock()
+ defer m.Unlock()
+ cnt++
+ return nil
+ })
+ l := newConcurrentParentTask("parent", true, &one, &two)
+ done := make(chan error)
+ l.OnDone(func(err error) {
+ done <- err
+ })
+ go l.Start()
+ err := <-done
+ if err != nil {
+ t.Fatalf("Expected nil, got %s", err.Error())
+ }
+ if cnt != 2 {
+ t.Fatalf("Expected 2, got %d", cnt)
+ }
+}