@@ -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
@@ -98,6 +113,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
98
113
// don't re-sort when target is 'KEY' and order is ASCEND
99
114
sortOrder = pb .RangeRequest_NONE
100
115
}
116
+
101
117
if sortOrder != pb .RangeRequest_NONE {
102
118
var sorter sort.Interface
103
119
switch {
@@ -121,12 +137,14 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
121
137
sort .Sort (sort .Reverse (sorter ))
122
138
}
123
139
}
140
+ }
124
141
142
+ func asembleRangeResponse (rr * mvcc.RangeResult , r * pb.RangeRequest ) * pb.RangeResponse {
143
+ resp := & pb.RangeResponse {Header : & pb.ResponseHeader {}}
125
144
if r .Limit > 0 && len (rr .KVs ) > int (r .Limit ) {
126
145
rr .KVs = rr .KVs [:r .Limit ]
127
146
resp .More = true
128
147
}
129
- trace .Step ("filter and sort the key-value pairs" )
130
148
resp .Header .Revision = rr .Rev
131
149
resp .Count = int64 (rr .Count )
132
150
resp .Kvs = make ([]* mvccpb.KeyValue , len (rr .KVs ))
@@ -136,8 +154,7 @@ func executeRange(ctx context.Context, lg *zap.Logger, txnRead mvcc.TxnRead, r *
136
154
}
137
155
resp .Kvs [i ] = & rr .KVs [i ]
138
156
}
139
- trace .Step ("assemble the response" )
140
- return resp , nil
157
+ return resp
141
158
}
142
159
143
160
func checkRange (rv mvcc.ReadView , req * pb.RangeRequest ) error {
0 commit comments