func (db *DistDB) lookupMetadata(metadataKey storage.Key, replicas []storage.Replica) (*storage.RangeLocations, error) { replica := storage.ChooseRandomReplica(replicas) if replica == nil { return nil, util.Errorf("No replica to choose for metadata key: %q", metadataKey) } addr, err := db.nodeIDToAddr(replica.NodeID) if err != nil { // TODO(harshit): May be retry a different replica. return nil, err } client := rpc.NewClient(addr) arg := &storage.InternalRangeLookupRequest{ RequestHeader: storage.RequestHeader{ Replica: *replica, }, Key: metadataKey, } var reply storage.InternalRangeLookupResponse err = client.Call("Node.InternalRangeLookup", arg, &reply) if err != nil { return nil, err } if reply.Error != nil { return nil, reply.Error } return &reply.Locations, nil }
// getNode gets an RPC client to the node where the requested // key is located. The range cache may be updated. The bi-level range // metadata for the cluster is consulted in the event that the local // cache doesn't contain range metadata corresponding to the specified // key. func (db *DistDB) getNode(key storage.Key) (*rpc.Client, *storage.Replica, error) { meta2Val, err := db.lookupMeta2(key) if err != nil { return nil, nil, err } replica := storage.ChooseRandomReplica(meta2Val.Replicas) if replica == nil { return nil, nil, util.Errorf("No node found for key: %q", key) } addr, err := db.nodeIDToAddr(replica.NodeID) if err != nil { // TODO(harshit): May be retry a different replica. return nil, nil, err } return rpc.NewClient(addr), replica, nil }