// FindRangeLease is similar to FindRangeLeaseHolder but returns a Lease proto // without verifying if the lease is still active. Instead, it returns a time- // stamp taken off the queried node's clock. func (tc *TestCluster) FindRangeLease( rangeDesc *roachpb.RangeDescriptor, hint *ReplicationTarget, ) (_ *roachpb.Lease, now hlc.Timestamp, _ error) { if hint != nil { var ok bool if _, ok = rangeDesc.GetReplicaDescriptor(hint.StoreID); !ok { return nil, hlc.ZeroTimestamp, errors.Errorf( "bad hint: %+v; store doesn't have a replica of the range", hint) } } else { hint = &ReplicationTarget{ NodeID: rangeDesc.Replicas[0].NodeID, StoreID: rangeDesc.Replicas[0].StoreID} } // Find the server indicated by the hint and send a LeaseInfoRequest through // it. var hintServer *server.TestServer for _, s := range tc.Servers { if s.GetNode().Descriptor.NodeID == hint.NodeID { hintServer = s break } } if hintServer == nil { return nil, hlc.ZeroTimestamp, errors.Errorf("bad hint: %+v; no such node", hint) } leaseReq := roachpb.LeaseInfoRequest{ Span: roachpb.Span{ Key: rangeDesc.StartKey.AsRawKey(), }, } leaseResp, pErr := client.SendWrappedWith( context.TODO(), hintServer.DB().GetSender(), roachpb.Header{ // INCONSISTENT read, since we want to make sure that the node used to // send this is the one that processes the command, for the hint to // matter. ReadConsistency: roachpb.INCONSISTENT, }, &leaseReq) if pErr != nil { return nil, hlc.ZeroTimestamp, pErr.GoError() } return leaseResp.(*roachpb.LeaseInfoResponse).Lease, hintServer.Clock().Now(), nil }