func (wr *Wrangler) waitForFilteredReplication(sourcePositions map[*topo.ShardInfo]*myproto.ReplicationPosition, destinationShards []*topo.ShardInfo) error { wg := sync.WaitGroup{} rec := concurrency.AllErrorRecorder{} for _, si := range destinationShards { wg.Add(1) go func(si *topo.ShardInfo) { for _, sourceShard := range si.SourceShards { // we're waiting on this guy blpPosition := blproto.BlpPosition{ Uid: sourceShard.Uid, } // find the position it should be at for s, rp := range sourcePositions { if s.Keyspace() == sourceShard.Keyspace && s.ShardName() == sourceShard.Shard { blpPosition.GroupId = rp.MasterLogGroupId } } log.Infof("Waiting for %v to catch up", si.MasterAlias) if err := wr.ai.WaitBlpPosition(si.MasterAlias, blpPosition, wr.actionTimeout()); err != nil { rec.RecordError(err) } else { log.Infof("%v caught up", si.MasterAlias) } wg.Done() } }(si) } wg.Wait() return rec.Error() }