// GetAllTablets returns a sorted list of tablets. func GetAllTablets(ctx context.Context, ts topo.Server, cell string) ([]*topo.TabletInfo, error) { aliases, err := ts.GetTabletsByCell(ctx, cell) if err != nil { return nil, err } sort.Sort(topoproto.TabletAliasList(aliases)) tabletMap, err := ts.GetTabletMap(ctx, aliases) if err != nil { // we got another error than topo.ErrNoNode return nil, err } tablets := make([]*topo.TabletInfo, 0, len(aliases)) for _, tabletAlias := range aliases { tabletInfo, ok := tabletMap[*tabletAlias] if !ok { // tablet disappeared on us (GetTabletMap ignores // topo.ErrNoNode), just echo a warning log.Warningf("failed to load tablet %v", tabletAlias) } else { tablets = append(tablets, tabletInfo) } } return tablets, nil }
// FindAllTabletAliasesInShardByCell uses the replication graph to find all the // tablet aliases in the given shard. // // It can return ErrPartialResult if some cells were not fetched, // in which case the result only contains the cells that were fetched. // // The tablet aliases are sorted by cell, then by UID. func (ts Server) FindAllTabletAliasesInShardByCell(ctx context.Context, keyspace, shard string, cells []string) ([]*topodatapb.TabletAlias, error) { span := trace.NewSpanFromContext(ctx) span.StartLocal("topo.FindAllTabletAliasesInShardbyCell") span.Annotate("keyspace", keyspace) span.Annotate("shard", shard) span.Annotate("num_cells", len(cells)) defer span.Finish() ctx = trace.NewContext(ctx, span) // read the shard information to find the cells si, err := ts.GetShard(ctx, keyspace, shard) if err != nil { return nil, err } resultAsMap := make(map[topodatapb.TabletAlias]bool) if si.HasMaster() { if InCellList(si.MasterAlias.Cell, cells) { resultAsMap[*si.MasterAlias] = true } } // read the replication graph in each cell and add all found tablets wg := sync.WaitGroup{} mutex := sync.Mutex{} rec := concurrency.AllErrorRecorder{} for _, cell := range si.Cells { if !InCellList(cell, cells) { continue } wg.Add(1) go func(cell string) { defer wg.Done() sri, err := ts.GetShardReplication(ctx, cell, keyspace, shard) if err != nil { rec.RecordError(fmt.Errorf("GetShardReplication(%v, %v, %v) failed: %v", cell, keyspace, shard, err)) return } mutex.Lock() for _, node := range sri.Nodes { resultAsMap[*node.TabletAlias] = true } mutex.Unlock() }(cell) } wg.Wait() err = nil if rec.HasErrors() { log.Warningf("FindAllTabletAliasesInShard(%v,%v): got partial result: %v", keyspace, shard, rec.Error()) err = ErrPartialResult } result := make([]*topodatapb.TabletAlias, 0, len(resultAsMap)) for a := range resultAsMap { v := a result = append(result, &v) } sort.Sort(topoproto.TabletAliasList(result)) return result, err }