Skip to content

Commit 493e8bb

Browse files
committed
Split executeRange function
Signed-off-by: Marek Siarkowicz <[email protected]>
1 parent e4fb13d commit 493e8bb

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

server/etcdserver/txn/range.go

+33-16
Original file line numberDiff line numberDiff line change
@@ -43,32 +43,45 @@ func Range(ctx context.Context, lg *zap.Logger, kv mvcc.KV, r *pb.RangeRequest)
4343
func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *pb.RangeRequest) (*pb.RangeResponse, error) {
4444
trace := traceutil.Get(ctx)
4545

46-
resp := &pb.RangeResponse{}
47-
resp.Header = &pb.ResponseHeader{}
46+
limit := rangeLimit(r)
47+
ro := mvcc.RangeOptions{
48+
Limit: limit,
49+
Rev: r.Revision,
50+
Count: r.CountOnly,
51+
}
52+
53+
rr, err := txnRead.Range(ctx, r.Key, mkGteRange(r.RangeEnd), ro)
54+
if err != nil {
55+
return nil, err
56+
}
57+
58+
filterRangeResults(rr, r)
59+
sortRangeResults(rr, r, lg)
60+
trace.Step("filter and sort the key-value pairs")
61+
62+
resp := asembleRangeResponse(rr, r)
63+
trace.Step("assemble the response")
4864

65+
return resp, nil
66+
}
67+
68+
func rangeLimit(r *pb.RangeRequest) int64 {
4969
limit := r.Limit
5070
if r.SortOrder != pb.RangeRequest_NONE ||
5171
r.MinModRevision != 0 || r.MaxModRevision != 0 ||
5272
r.MinCreateRevision != 0 || r.MaxCreateRevision != 0 {
5373
// fetch everything; sort and truncate afterwards
5474
limit = 0
5575
}
76+
5677
if limit > 0 {
5778
// fetch one extra for 'more' flag
5879
limit = limit + 1
5980
}
81+
return limit
82+
}
6083

61-
ro := mvcc.RangeOptions{
62-
Limit: limit,
63-
Rev: r.Revision,
64-
Count: r.CountOnly,
65-
}
66-
67-
rr, err := txnRead.Range(ctx, r.Key, mkGteRange(r.RangeEnd), ro)
68-
if err != nil {
69-
return nil, err
70-
}
71-
84+
func filterRangeResults(rr *mvcc.RangeResult, r *pb.RangeRequest) {
7285
if r.MaxModRevision != 0 {
7386
f := func(kv *mvccpb.KeyValue) bool { return kv.ModRevision > r.MaxModRevision }
7487
pruneKVs(rr, f)
@@ -85,7 +98,9 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
8598
f := func(kv *mvccpb.KeyValue) bool { return kv.CreateRevision < r.MinCreateRevision }
8699
pruneKVs(rr, f)
87100
}
101+
}
88102

103+
func sortRangeResults(rr *mvcc.RangeResult, r *pb.RangeRequest, lg *zap.Logger) {
89104
sortOrder := r.SortOrder
90105
if r.SortTarget != pb.RangeRequest_KEY && sortOrder == pb.RangeRequest_NONE {
91106
// Since current mvcc.Range implementation returns results
@@ -98,6 +113,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
98113
// don't re-sort when target is 'KEY' and order is ASCEND
99114
sortOrder = pb.RangeRequest_NONE
100115
}
116+
101117
if sortOrder != pb.RangeRequest_NONE {
102118
var sorter sort.Interface
103119
switch {
@@ -121,12 +137,14 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
121137
sort.Sort(sort.Reverse(sorter))
122138
}
123139
}
140+
}
124141

142+
func asembleRangeResponse(rr *mvcc.RangeResult, r *pb.RangeRequest) *pb.RangeResponse {
143+
resp := &pb.RangeResponse{Header: &pb.ResponseHeader{}}
125144
if r.Limit > 0 && len(rr.KVs) > int(r.Limit) {
126145
rr.KVs = rr.KVs[:r.Limit]
127146
resp.More = true
128147
}
129-
trace.Step("filter and sort the key-value pairs")
130148
resp.Header.Revision = rr.Rev
131149
resp.Count = int64(rr.Count)
132150
resp.Kvs = make([]*mvccpb.KeyValue, len(rr.KVs))
@@ -136,8 +154,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
136154
}
137155
resp.Kvs[i] = &rr.KVs[i]
138156
}
139-
trace.Step("assemble the response")
140-
return resp, nil
157+
return resp
141158
}
142159

143160
func checkRange(rv mvcc.ReadView, req *pb.RangeRequest) error {

0 commit comments

Comments
 (0)