@@ -43,9 +43,29 @@ 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" )
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
143158func checkRange (rv mvcc.ReadView , req * pb.RangeRequest ) error {
0 commit comments