func (op Op) toRequestOp() *pb.RequestOp { switch op.t { case tRange: r := &pb.RangeRequest{ Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev, Serializable: op.serializable, KeysOnly: op.keysOnly, CountOnly: op.countOnly, } if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } return &pb.RequestOp{Request: &pb.RequestOp_RequestRange{RequestRange: r}} case tPut: r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV} return &pb.RequestOp{Request: &pb.RequestOp_RequestPut{RequestPut: r}} case tDeleteRange: r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV} return &pb.RequestOp{Request: &pb.RequestOp_RequestDeleteRange{RequestDeleteRange: r}} default: panic("Unknown Op") } }
func (kv *kv) do(ctx context.Context, op Op) (OpResponse, error) { var err error switch op.t { // TODO: handle other ops case tRange: var resp *pb.RangeResponse r := &pb.RangeRequest{Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev, Serializable: op.serializable} if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } resp, err = kv.remote.Range(ctx, r) if err == nil { return OpResponse{get: (*GetResponse)(resp)}, nil } case tPut: var resp *pb.PutResponse r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} resp, err = kv.remote.Put(ctx, r) if err == nil { return OpResponse{put: (*PutResponse)(resp)}, nil } case tDeleteRange: var resp *pb.DeleteRangeResponse r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} resp, err = kv.remote.DeleteRange(ctx, r) if err == nil { return OpResponse{del: (*DeleteResponse)(resp)}, nil } default: panic("Unknown op") } return OpResponse{}, err }
func (kv *kv) do(ctx context.Context, op Op) (*pb.ResponseUnion, error) { for { var err error switch op.t { // TODO: handle other ops case tRange: var resp *pb.RangeResponse r := &pb.RangeRequest{Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev} if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } resp, err = kv.getRemote().Range(ctx, r) if err == nil { respu := &pb.ResponseUnion_ResponseRange{ResponseRange: resp} return &pb.ResponseUnion{Response: respu}, nil } case tPut: var resp *pb.PutResponse r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} resp, err = kv.getRemote().Put(ctx, r) if err == nil { respu := &pb.ResponseUnion_ResponsePut{ResponsePut: resp} return &pb.ResponseUnion{Response: respu}, nil } case tDeleteRange: var resp *pb.DeleteRangeResponse r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} resp, err = kv.getRemote().DeleteRange(ctx, r) if err == nil { respu := &pb.ResponseUnion_ResponseDeleteRange{ResponseDeleteRange: resp} return &pb.ResponseUnion{Response: respu}, nil } default: panic("Unknown op") } if isRPCError(err) { return nil, err } // do not retry on modifications if op.isWrite() { go kv.switchRemote(err) return nil, err } if nerr := kv.switchRemote(err); nerr != nil { return nil, nerr } } }
func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { for { var err error switch op.t { // TODO: handle other ops case tRange: var resp *pb.RangeResponse r := &pb.RangeRequest{Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev} if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } resp, err = kv.getRemote().Range(ctx, r) if err == nil { return OpResponse{get: (*GetResponse)(resp)}, nil } case tPut: var resp *pb.PutResponse r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} resp, err = kv.getRemote().Put(ctx, r) if err == nil { return OpResponse{put: (*PutResponse)(resp)}, nil } case tDeleteRange: var resp *pb.DeleteRangeResponse r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} resp, err = kv.getRemote().DeleteRange(ctx, r) if err == nil { return OpResponse{del: (*DeleteResponse)(resp)}, nil } default: panic("Unknown op") } if isHalted(ctx, err) { return OpResponse{}, err } // do not retry on modifications if op.isWrite() { go kv.switchRemote(err) return OpResponse{}, err } if nerr := kv.switchRemote(err); nerr != nil { return OpResponse{}, nerr } } }
func (op Op) toRequestUnion() *pb.RequestUnion { switch op.t { case tRange: r := &pb.RangeRequest{Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev} if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } return &pb.RequestUnion{Request: &pb.RequestUnion_RequestRange{RequestRange: r}} case tPut: r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} return &pb.RequestUnion{Request: &pb.RequestUnion_RequestPut{RequestPut: r}} case tDeleteRange: r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} return &pb.RequestUnion{Request: &pb.RequestUnion_RequestDeleteRange{RequestDeleteRange: r}} default: panic("Unknown Op") } }
func (op Op) toRangeRequest() *pb.RangeRequest { if op.t != tRange { panic("op.t != tRange") } r := &pb.RangeRequest{ Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev, Serializable: op.serializable, KeysOnly: op.keysOnly, CountOnly: op.countOnly, MinModRevision: op.minModRev, MaxModRevision: op.maxModRev, MinCreateRevision: op.minCreateRev, MaxCreateRevision: op.maxCreateRev, } if op.sort != nil { r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) } return r }