diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/repro/repro.go | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/pkg/repro/repro.go b/pkg/repro/repro.go index 8d039e159..b774705e6 100644 --- a/pkg/repro/repro.go +++ b/pkg/repro/repro.go @@ -84,8 +84,12 @@ func Run(crashLog []byte, cfg *mgrconfig.Config, features *host.Features, report wg.Add(1) go func() { defer wg.Done() - ctx.createInstances(cfg, vmPool, vmIndexes) + ctx.createInstances(cfg, vmPool) }() + // Prepare VMs in advance. + for _, idx := range vmIndexes { + ctx.bootRequests <- idx + } // Wait until all VMs are really released. defer wg.Wait() return ctx.run() @@ -642,36 +646,34 @@ func (ctx *context) bisectProgs(progs []*prog.LogEntry, pred func([]*prog.LogEnt return ret, err } -func (ctx *context) createInstances(cfg *mgrconfig.Config, vmPool *vm.Pool, vmIndexes []int) { +func (ctx *context) createInstances(cfg *mgrconfig.Config, vmPool *vm.Pool) { var wg sync.WaitGroup - wg.Add(len(vmIndexes)) - for _, vmIndex := range vmIndexes { - ctx.bootRequests <- vmIndex + for vmIndex := range ctx.bootRequests { + wg.Add(1) + vmIndex := vmIndex go func() { defer wg.Done() - for vmIndex := range ctx.bootRequests { - var inst *instance.ExecProgInstance - maxTry := 3 - for try := 0; try < maxTry; try++ { - select { - case <-vm.Shutdown: - try = maxTry - continue - default: - } - var err error - inst, err = instance.CreateExecProgInstance(vmPool, vmIndex, cfg, - ctx.reporter, &instance.OptionalConfig{Logf: ctx.reproLogf}) - if err != nil { - ctx.reproLogf(0, "failed to init instance: %v", err) - time.Sleep(10 * time.Second) - continue - } - break + + var inst *instance.ExecProgInstance + maxTry := 3 + for try := 0; try < maxTry; try++ { + select { + case <-vm.Shutdown: + try = maxTry + continue + default: } - if inst == nil { - break + var err error + inst, err = instance.CreateExecProgInstance(vmPool, vmIndex, cfg, + ctx.reporter, &instance.OptionalConfig{Logf: ctx.reproLogf}) + if err != nil { + ctx.reproLogf(0, "failed to init instance: %v", err) + time.Sleep(10 * time.Second) + continue } + break + } + if inst != nil { ctx.instances <- &reproInstance{execProg: inst, index: vmIndex} } }() |
