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