Skip to content

Commit 28546fa

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

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

server/etcdserver/txn/range.go

+31-16
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,29 @@ 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")
64+
65+
return resp, nil
66+
}
4867

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 ||
@@ -57,18 +77,10 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
5777
// fetch one extra for 'more' flag
5878
limit = limit + 1
5979
}
80+
return limit
81+
}
6082

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-
83+
func filterRangeResults(rr *mvcc.RangeResult, r *pb.RangeRequest) {
7284
if r.MaxModRevision != 0 {
7385
f := func(kv *mvccpb.KeyValue) bool { return kv.ModRevision > r.MaxModRevision }
7486
pruneKVs(rr, f)
@@ -85,7 +97,9 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
8597
f := func(kv *mvccpb.KeyValue) bool { return kv.CreateRevision < r.MinCreateRevision }
8698
pruneKVs(rr, f)
8799
}
100+
}
88101

102+
func sortRangeResults(rr *mvcc.RangeResult, r *pb.RangeRequest, lg *zap.Logger) {
89103
sortOrder := r.SortOrder
90104
if r.SortTarget != pb.RangeRequest_KEY && sortOrder == pb.RangeRequest_NONE {
91105
// Since current mvcc.Range implementation returns results
@@ -121,12 +135,14 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
121135
sort.Sort(sort.Reverse(sorter))
122136
}
123137
}
138+
}
124139

140+
func asembleRangeResponse(rr *mvcc.RangeResult, r *pb.RangeRequest) *pb.RangeResponse {
141+
resp := &pb.RangeResponse{Header: &pb.ResponseHeader{}}
125142
if r.Limit > 0 && len(rr.KVs) > int(r.Limit) {
126143
rr.KVs = rr.KVs[:r.Limit]
127144
resp.More = true
128145
}
129-
trace.Step("filter and sort the key-value pairs")
130146
resp.Header.Revision = rr.Rev
131147
resp.Count = int64(rr.Count)
132148
resp.Kvs = make([]*mvccpb.KeyValue, len(rr.KVs))
@@ -136,8 +152,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
136152
}
137153
resp.Kvs[i] = &rr.KVs[i]
138154
}
139-
trace.Step("assemble the response")
140-
return resp, nil
155+
return resp
141156
}
142157

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

0 commit comments

Comments
 (0)