func fetchStateAndBuildZones(logger lager.Logger, workPool *workpool.WorkPool, clients map[string]rep.Client, metricEmitter auctiontypes.AuctionMetricEmitterDelegate) map[string]Zone { wg := &sync.WaitGroup{} zones := map[string]Zone{} lock := &sync.Mutex{} wg.Add(len(clients)) for guid, client := range clients { guid, client := guid, client workPool.Submit(func() { defer wg.Done() state, err := client.State() if err != nil { metricEmitter.FailedCellStateRequest() logger.Error("failed-to-get-state", err, lager.Data{"cell-guid": guid}) return } if state.Evacuating { return } cell := NewCell(logger, guid, client, state) lock.Lock() zones[state.Zone] = append(zones[state.Zone], cell) lock.Unlock() }) } wg.Wait() return zones }
default: panic(fmt.Sprintf("unknown communication mode: %s", communicationMode)) } }) var _ = BeforeEach(func() { var err error workPool, err = workpool.NewWorkPool(workers) Expect(err).NotTo(HaveOccurred()) wg := &sync.WaitGroup{} wg.Add(len(cells)) for _, cell := range cells { cell := cell workPool.Submit(func() { cell.Reset() wg.Done() }) } wg.Wait() util.ResetGuids() runnerDelegate = NewAuctionRunnerDelegate(cells) metricEmitterDelegate := NewAuctionMetricEmitterDelegate() runner = auctionrunner.New( runnerDelegate, metricEmitterDelegate, clock.NewClock(), workPool, logger, )
unblockChan := unblockChan calledChan <- i <-unblockChan } } var err error pool, err = workpool.NewWorkPool(maxWorkers) Expect(err).NotTo(HaveOccurred()) }) Describe("Submit", func() { Context("when submitting less work than the max number of workers", func() { It("should run the passed-in work", func() { for i := 0; i < maxWorkers-1; i++ { pool.Submit(work(i)) } for i := 0; i < maxWorkers-1; i++ { Eventually(calledChan).Should(Receive(Equal(i))) } }) }) Context("when submitting work equal to the number of workers", func() { It("should run the passed-in work concurrently", func() { for i := 0; i < maxWorkers; i++ { pool.Submit(work(i)) } for i := 0; i < maxWorkers; i++ {