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 }