@@ -43,9 +43,29 @@ func Range(ctx context.Context, lg *zap.Logger, kv mvcc.KV, r *pb.RangeRequest)
43
43
func executeRange (ctx context.Context , lg * zap.Logger , txnRead mvcc.TxnRead , r * pb.RangeRequest ) (* pb.RangeResponse , error ) {
44
44
trace := traceutil .Get (ctx )
45
45
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
+ }
48
67
68
+ func rangeLimit (r * pb.RangeRequest ) int64 {
49
69
limit := r .Limit
50
70
if r .SortOrder != pb .RangeRequest_NONE ||
51
71
r .MinModRevision != 0 || r .MaxModRevision != 0 ||
@@ -57,18 +77,10 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
57
77
// fetch one extra for 'more' flag
58
78
limit = limit + 1
59
79
}
80
+ return limit
81
+ }
60
82
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 ) {
72
84
if r .MaxModRevision != 0 {
73
85
f := func (kv * mvccpb.KeyValue ) bool { return kv .ModRevision > r .MaxModRevision }
74
86
pruneKVs (rr , f )
@@ -85,7 +97,9 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
85
97
f := func (kv * mvccpb.KeyValue ) bool { return kv .CreateRevision < r .MinCreateRevision }
86
98
pruneKVs (rr , f )
87
99
}
100
+ }
88
101
102
+ func sortRangeResults (rr * mvcc.RangeResult , r * pb.RangeRequest , lg * zap.Logger ) {
89
103
sortOrder := r .SortOrder
90
104
if r .SortTarget != pb .RangeRequest_KEY && sortOrder == pb .RangeRequest_NONE {
91
105
// Since current mvcc.Range implementation returns results
@@ -121,12 +135,14 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
121
135
sort .Sort (sort .Reverse (sorter ))
122
136
}
123
137
}
138
+ }
124
139
140
+ func asembleRangeResponse (rr * mvcc.RangeResult , r * pb.RangeRequest ) * pb.RangeResponse {
141
+ resp := & pb.RangeResponse {Header : & pb.ResponseHeader {}}
125
142
if r .Limit > 0 && len (rr .KVs ) > int (r .Limit ) {
126
143
rr .KVs = rr .KVs [:r .Limit ]
127
144
resp .More = true
128
145
}
129
- trace .Step ("filter and sort the key-value pairs" )
130
146
resp .Header .Revision = rr .Rev
131
147
resp .Count = int64 (rr .Count )
132
148
resp .Kvs = make ([]* mvccpb.KeyValue , len (rr .KVs ))
@@ -136,8 +152,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
136
152
}
137
153
resp .Kvs [i ] = & rr .KVs [i ]
138
154
}
139
- trace .Step ("assemble the response" )
140
- return resp , nil
155
+ return resp
141
156
}
142
157
143
158
func checkRange (rv mvcc.ReadView , req * pb.RangeRequest ) error {
0 commit comments