@@ -43,32 +43,45 @@ func Range(ctx context.Context, lg *zap.Logger, kv mvcc.KV, r *pb.RangeRequest)
4343func 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
143160func checkRange (rv mvcc.ReadView , req * pb.RangeRequest ) error {
0 commit comments