Skip to content

Commit 0e76e10

Browse files
committed
fix encode range issue with unbound end
Signed-off-by: iosmanthus <[email protected]>
1 parent 182a457 commit 0e76e10

File tree

5 files changed

+95
-26
lines changed

5 files changed

+95
-26
lines changed

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
//! # })}
9393
//! ```
9494
95+
#![feature(min_specialization)]
9596
#[macro_use]
9697
pub mod request;
9798
#[macro_use]

src/raw/requests.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ use crate::{
1313
collect_first,
1414
pd::PdClient,
1515
request::{
16-
codec::RequestCodec, plan::ResponseWithShard, Collect, CollectSingle, DefaultProcessor,
17-
KvRequest, Merge, Process, Shardable, SingleKey,
16+
codec::{RequestCodec, RequestCodecExt},
17+
plan::ResponseWithShard,
18+
Collect, CollectSingle, DefaultProcessor, KvRequest, Merge, Process, Shardable, SingleKey,
1819
},
1920
store::{store_stream_for_keys, store_stream_for_ranges, RegionStore},
2021
transaction::HasLocks,
@@ -215,6 +216,7 @@ pub fn new_raw_scan_request(
215216
req
216217
}
217218

219+
has_reverse!(kvrpcpb::RawScanRequest);
218220
impl_kv_request!(kvrpcpb::RawScanRequest; kvrpcpb::RawScanResponse, kvs);
219221
shardable_range!(kvrpcpb::RawScanRequest);
220222

@@ -244,10 +246,15 @@ pub fn new_raw_batch_scan_request(
244246
req
245247
}
246248

247-
impl_kv_request!(
248-
kvrpcpb::RawBatchScanRequest, ranges;
249-
kvrpcpb::RawBatchScanResponse, kvs
250-
);
249+
impl<C: RequestCodec> KvRequest<C> for kvrpcpb::RawBatchScanRequest {
250+
type Response = kvrpcpb::RawBatchScanResponse;
251+
fn encode_request(mut self, codec: &C) -> Self {
252+
*self.mut_ranges() = codec.encode_ranges(self.take_ranges(), self.get_reverse());
253+
self
254+
}
255+
256+
impl_decode_response! {kvs}
257+
}
251258

252259
impl Shardable for kvrpcpb::RawBatchScanRequest {
253260
type Shard = Vec<kvrpcpb::KeyRange>;

src/request/codec.rs

+52-16
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ type Prefix = [u8; KEYSPACE_PREFIX_LEN];
1414

1515
const KEYSPACE_PREFIX_LEN: usize = 4;
1616

17-
const MAX_KEYSPACE_ID: KeySpaceId = KeySpaceId([0xff, 0xff, 0xff]);
18-
1917
pub trait RequestCodec: Sized + Clone + Sync + Send + 'static {
2018
fn encode_request<'a, R: KvRequest<Self>>(&self, req: &'a R) -> Cow<'a, R> {
2119
Cow::Borrowed(req)
@@ -29,7 +27,7 @@ pub trait RequestCodec: Sized + Clone + Sync + Send + 'static {
2927
Ok(())
3028
}
3129

32-
fn encode_range(&self, start: Vec<u8>, end: Vec<u8>) -> (Vec<u8>, Vec<u8>) {
30+
fn encode_range(&self, start: Vec<u8>, end: Vec<u8>, _reverse: bool) -> (Vec<u8>, Vec<u8>) {
3331
(start, end)
3432
}
3533

@@ -74,6 +72,10 @@ pub trait RequestCodecExt: RequestCodec {
7472
keys.into_iter().map(|key| self.encode_key(key)).collect()
7573
}
7674

75+
fn encode_secondaries(&self, secondaries: Vec<Vec<u8>>) -> Vec<Vec<u8>> {
76+
self.encode_keys(secondaries)
77+
}
78+
7779
fn encode_pairs(&self, mut pairs: Vec<kvrpcpb::KvPair>) -> Vec<kvrpcpb::KvPair> {
7880
for pair in pairs.iter_mut() {
7981
*pair.mut_key() = self.encode_key(pair.take_key());
@@ -82,9 +84,14 @@ pub trait RequestCodecExt: RequestCodec {
8284
pairs
8385
}
8486

85-
fn encode_ranges(&self, mut ranges: Vec<kvrpcpb::KeyRange>) -> Vec<kvrpcpb::KeyRange> {
87+
fn encode_ranges(
88+
&self,
89+
mut ranges: Vec<kvrpcpb::KeyRange>,
90+
reverse: bool,
91+
) -> Vec<kvrpcpb::KeyRange> {
8692
for range in ranges.iter_mut() {
87-
let (start, end) = self.encode_range(range.take_start_key(), range.take_end_key());
93+
let (start, end) =
94+
self.encode_range(range.take_start_key(), range.take_end_key(), reverse);
8895
*range.mut_start_key() = start;
8996
*range.mut_end_key() = end;
9097
}
@@ -217,18 +224,18 @@ pub trait Mode: Clone + Copy + Sync + Send + 'static {
217224
const MAX_KEY: &'static [u8] = &[Self::PREFIX + 1, 0, 0, 0];
218225
}
219226

220-
#[derive(Clone, Copy)]
227+
#[derive(Default, Clone, Copy)]
221228
pub struct RawMode;
222229

223-
#[derive(Clone, Copy)]
230+
#[derive(Default, Clone, Copy)]
224231
pub struct TxnMode;
225232

226233
impl Mode for RawMode {
227234
const PREFIX: u8 = b'r';
228235
}
229236

230237
impl Mode for TxnMode {
231-
const PREFIX: u8 = b't';
238+
const PREFIX: u8 = b'x';
232239
}
233240

234241
#[derive(Clone)]
@@ -263,18 +270,37 @@ impl RequestCodec for ApiV1<TxnMode> {
263270

264271
impl TxnCodec for ApiV1<TxnMode> {}
265272

266-
#[derive(Clone, Copy, Default)]
273+
#[derive(Clone, Copy)]
267274
pub struct KeySpace<M: Mode> {
268275
id: KeySpaceId,
269276
_phantom: PhantomData<M>,
270277
}
271278

279+
impl<M: Mode> Default for KeySpace<M> {
280+
fn default() -> Self {
281+
KeySpace {
282+
id: KeySpaceId::default(),
283+
_phantom: PhantomData,
284+
}
285+
}
286+
}
287+
272288
impl<M: Mode> From<KeySpace<M>> for Prefix {
273289
fn from(s: KeySpace<M>) -> Self {
274290
[M::PREFIX, s.id[0], s.id[1], s.id[2]]
275291
}
276292
}
277293

294+
impl<M: Mode> KeySpace<M> {
295+
fn start(self) -> Prefix {
296+
self.into()
297+
}
298+
299+
fn end(self) -> Prefix {
300+
(u32::from_be_bytes(self.into()) + 1).to_be_bytes()
301+
}
302+
}
303+
278304
#[derive(Default, Clone)]
279305
pub struct ApiV2<M: Mode> {
280306
keyspace: KeySpace<M>,
@@ -318,12 +344,21 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
318344
Ok(())
319345
}
320346

321-
fn encode_range(&self, start: Vec<u8>, end: Vec<u8>) -> (Vec<u8>, Vec<u8>) {
322-
if self.keyspace.id == MAX_KEYSPACE_ID {
323-
(self.encode_key(start), M::MAX_KEY.to_vec())
324-
} else {
325-
(self.encode_key(start), self.encode_key(end))
347+
fn encode_range(&self, start: Vec<u8>, end: Vec<u8>, reverse: bool) -> (Vec<u8>, Vec<u8>) {
348+
if reverse {
349+
let (start, end) = self.encode_range(end, start, false);
350+
return (end, start);
326351
}
352+
353+
let start = self.encode_key(start);
354+
355+
let end = if end.is_empty() {
356+
self.keyspace.end().into()
357+
} else {
358+
self.encode_key(end)
359+
};
360+
361+
(start, end)
327362
}
328363

329364
fn encode_pd_query(&self, key: Vec<u8>) -> Vec<u8> {
@@ -335,14 +370,15 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
335370
decode_bytes_in_place(region.mut_end_key(), false)?;
336371

337372
// Map the region's start key to the keyspace start key.
338-
if region.get_start_key() < M::MIN_KEY {
373+
if region.get_start_key() <= self.keyspace.start().as_slice() {
339374
*region.mut_start_key() = vec![];
340375
} else {
341376
self.decode_key(region.mut_start_key())?;
342377
}
343378

344379
// Map the region's end key to the keyspace end key.
345-
if region.get_end_key().is_empty() || region.get_end_key() > M::MAX_KEY {
380+
if region.get_end_key().is_empty() || region.get_end_key() >= self.keyspace.end().as_slice()
381+
{
346382
*region.mut_end_key() = vec![];
347383
} else {
348384
self.decode_key(region.mut_end_key())?;

src/request/mod.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,26 @@ impl<T: PartialEq + Default> IsDefault for T {
5151
}
5252
}
5353

54+
pub(crate) trait HasReverse {
55+
fn has_reverse(&self) -> bool;
56+
}
57+
58+
impl<T> HasReverse for T {
59+
default fn has_reverse(&self) -> bool {
60+
false
61+
}
62+
}
63+
64+
macro_rules! has_reverse {
65+
($t:ty) => {
66+
impl $crate::request::HasReverse for $t {
67+
fn has_reverse(&self) -> bool {
68+
self.get_reverse()
69+
}
70+
}
71+
};
72+
}
73+
5474
macro_rules! impl_decode_response {
5575
($($o:ident)*) => {
5676
fn decode_response(&self, codec: &C, mut resp: Self::Response) -> Result<Self::Response> {
@@ -75,7 +95,6 @@ macro_rules! impl_decode_response {
7595
};
7696
}
7797

78-
#[macro_export]
7998
macro_rules! impl_kv_request {
8099
($req:ty $(,$i:ident)+; $resp:ty $(,$o:ident)*) => {
81100
impl<C> KvRequest<C> for $req
@@ -102,12 +121,14 @@ macro_rules! impl_kv_request {
102121

103122
($req:ty; $resp:ty $(,$o:ident)*) => {
104123
impl<C> KvRequest<C> for $req
105-
where C: RequestCodec
124+
where C: RequestCodec,
125+
$req: $crate::request::HasReverse
106126
{
107127
type Response = $resp;
108128

109129
fn encode_request(mut self, codec: &C) -> Self {
110-
let (start, end) = codec.encode_range(self.take_start_key(), self.take_end_key());
130+
use $crate::request::HasReverse;
131+
let (start, end) = codec.encode_range(self.take_start_key(), self.take_end_key(), self.has_reverse());
111132
*self.mut_start_key() = start;
112133
*self.mut_end_key() = end;
113134

src/transaction/requests.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ pub fn new_scan_request(
141141
req
142142
}
143143

144+
has_reverse!(kvrpcpb::ScanRequest);
144145
impl_kv_request!(kvrpcpb::ScanRequest; kvrpcpb::ScanResponse, pairs, error);
145146
shardable_range!(kvrpcpb::ScanRequest);
146147

@@ -233,7 +234,10 @@ pub fn new_pessimistic_prewrite_request(
233234
req
234235
}
235236

236-
impl_kv_request!(kvrpcpb::PrewriteRequest, mutations; kvrpcpb::PrewriteResponse, errors);
237+
impl_kv_request!(
238+
kvrpcpb::PrewriteRequest, mutations, primary_lock, secondaries;
239+
kvrpcpb::PrewriteResponse, errors
240+
);
237241

238242
impl Shardable for kvrpcpb::PrewriteRequest {
239243
type Shard = Vec<kvrpcpb::Mutation>;

0 commit comments

Comments
 (0)