// rangeLookup dispatches an RangeLookup request for the given // metadata key to the replicas of the given range. Note that we allow // inconsistent reads when doing range lookups for efficiency. Getting // stale data is not a correctness problem but instead may // infrequently result in additional latency as additional range // lookups may be required. Note also that rangeLookup bypasses the // DistSender's Send() method, so there is no error inspection and // retry logic here; this is not an issue since the lookup performs a // single inconsistent read only. func (ds *DistSender) rangeLookup(key proto.Key, options lookupOptions, desc *proto.RangeDescriptor) ([]proto.RangeDescriptor, error) { ba := proto.BatchRequest{} ba.ReadConsistency = proto.INCONSISTENT ba.Add(&proto.RangeLookupRequest{ RequestHeader: proto.RequestHeader{ Key: key, ReadConsistency: proto.INCONSISTENT, }, MaxRanges: ds.rangeLookupMaxRanges, ConsiderIntents: options.considerIntents, Reverse: options.useReverseScan, }) replicas := newReplicaSlice(ds.gossip, desc) // TODO(tschottdorf) consider a Trace here, potentially that of the request // that had the cache miss and waits for the result. reply, err := ds.sendRPC(nil /* Trace */, desc.RangeID, replicas, rpc.OrderRandom, &ba) if err != nil { return nil, err } br := reply.(*proto.BatchResponse) if err := br.GoError(); err != nil { return nil, err } return br.Responses[0].GetInner().(*proto.RangeLookupResponse).Ranges, nil }
// rangeLookup implements the rangeDescriptorDB interface. It looks up // the descriptors for the given (meta) key. func (ls *LocalSender) rangeLookup(key proto.Key, options lookupOptions, _ *proto.RangeDescriptor) ([]proto.RangeDescriptor, error) { ba := proto.BatchRequest{} ba.ReadConsistency = proto.INCONSISTENT ba.Add(&proto.RangeLookupRequest{ RequestHeader: proto.RequestHeader{ Key: key, ReadConsistency: proto.INCONSISTENT, }, MaxRanges: 1, ConsiderIntents: options.considerIntents, Reverse: options.useReverseScan, }) br, pErr := ls.Send(context.Background(), ba) if pErr != nil { return nil, pErr.GoError() } return br.Responses[0].GetInner().(*proto.RangeLookupResponse).Ranges, nil }