// isIncluded returns true iff the tablet's keyspace and shard should be // forwarded to the underlying TabletRecorder. func (fbs *FilterByShard) isIncluded(tablet *topodatapb.Tablet) bool { canonical, kr, err := topo.ValidateShardName(tablet.Shard) if err != nil { log.Errorf("Error parsing shard name %v, will ignore tablet: %v", tablet.Shard, err) return false } for _, c := range fbs.filters[tablet.Keyspace] { if canonical == c.shard { // Exact match (probably a non-sharded keyspace). return true } if kr != nil && c.keyRange != nil && key.KeyRangeIncludes(c.keyRange, kr) { // Our filter's KeyRange includes the provided KeyRange return true } } return false }
// getConn returns the right l2VTGateConn for a given keyspace / shard. func (lg *l2VTGateGateway) getConn(keyspace, shard string) (*l2VTGateConn, error) { lg.mu.RLock() defer lg.mu.RUnlock() canonical, kr, err := topo.ValidateShardName(shard) if err != nil { return nil, fmt.Errorf("invalid shard name: %v", shard) } for _, c := range lg.connMap[keyspace] { if canonical == c.shard { // Exact match (probably a non-sharded keyspace). return c, nil } if kr != nil && c.keyRange != nil && key.KeyRangeIncludes(c.keyRange, kr) { // The shard KeyRange is included in this destination's // KeyRange, that's the destination we want. return c, nil } } return nil, fmt.Errorf("no configured destination for %v/%v", keyspace, shard) }