mirror of https://github.com/tikv/client-rust.git
Merge branch 'handle-mutations' into request-based-kv
This commit is contained in:
commit
236c510551
|
|
@ -34,7 +34,7 @@ enum Mutation {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mutation {
|
impl Mutation {
|
||||||
fn with_key(self, key: Key) -> kvrpcpb::Mutation {
|
fn into_proto_with_key(self, key: Key) -> kvrpcpb::Mutation {
|
||||||
let mut pb = kvrpcpb::Mutation {
|
let mut pb = kvrpcpb::Mutation {
|
||||||
key: key.into(),
|
key: key.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
@ -50,7 +50,6 @@ impl Mutation {
|
||||||
pb
|
pb
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a `Some` if the value can be determined by this mutation. Otherwise, returns `None`.
|
|
||||||
fn get_value(&self) -> MutationValue {
|
fn get_value(&self) -> MutationValue {
|
||||||
match self {
|
match self {
|
||||||
Mutation::Put(value) => MutationValue::Determined(Some(value.clone())),
|
Mutation::Put(value) => MutationValue::Determined(Some(value.clone())),
|
||||||
|
|
@ -142,35 +141,28 @@ impl Transaction {
|
||||||
&self,
|
&self,
|
||||||
keys: impl IntoIterator<Item = impl Into<Key>>,
|
keys: impl IntoIterator<Item = impl Into<Key>>,
|
||||||
) -> Result<impl Iterator<Item = (Key, Option<Value>)>> {
|
) -> Result<impl Iterator<Item = (Key, Option<Value>)>> {
|
||||||
let mut keys_from_snapshot = Vec::new();
|
let mut undetermined_keys = Vec::new();
|
||||||
let mut results_in_buffer = keys
|
let mut results_in_buffer = Vec::new();
|
||||||
.into_iter()
|
for key in keys {
|
||||||
.map(|key| {
|
|
||||||
let key = key.into();
|
let key = key.into();
|
||||||
let mutation_value = self.get_from_mutations(&key);
|
let mutation_value = self.get_from_mutations(&key);
|
||||||
|
// If the value cannot be determined according to the buffered mutations, we need to
|
||||||
|
// query from the snapshot.
|
||||||
if let MutationValue::Undetermined = mutation_value {
|
if let MutationValue::Undetermined = mutation_value {
|
||||||
keys_from_snapshot.push(key.clone());
|
undetermined_keys.push(key.clone());
|
||||||
}
|
}
|
||||||
(key, mutation_value)
|
results_in_buffer.push((key, mutation_value));
|
||||||
})
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.into_iter();
|
|
||||||
let mut results_from_snapshot = self
|
|
||||||
.snapshot
|
|
||||||
.batch_get(keys_from_snapshot)
|
|
||||||
.await?
|
|
||||||
.peekable();
|
|
||||||
Ok(std::iter::from_fn(move || {
|
|
||||||
let (key, mutation_value) = results_in_buffer.next()?;
|
|
||||||
match mutation_value {
|
|
||||||
MutationValue::Determined(value) => Some((key, value)),
|
|
||||||
MutationValue::Undetermined => match results_from_snapshot.peek() {
|
|
||||||
Some((key_from_snapshot, _)) if &key == key_from_snapshot => {
|
|
||||||
results_from_snapshot.next()
|
|
||||||
}
|
|
||||||
_ => Some((key, None)),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
let mut results_from_snapshot = self.snapshot.batch_get(undetermined_keys).await?;
|
||||||
|
Ok(results_in_buffer
|
||||||
|
.into_iter()
|
||||||
|
.map(move |(key, mutation_value)| match mutation_value {
|
||||||
|
MutationValue::Determined(value) => (key, value),
|
||||||
|
// `results_from_snapshot` should contain all undetermined keys. If not, it's a bug
|
||||||
|
// in `Snapshot::batch_get`.
|
||||||
|
MutationValue::Undetermined => results_from_snapshot
|
||||||
|
.next()
|
||||||
|
.expect("not enough results from snapshot"),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -311,7 +303,7 @@ impl Transaction {
|
||||||
let _rpc_mutations: Vec<_> = self
|
let _rpc_mutations: Vec<_> = self
|
||||||
.mutations
|
.mutations
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, v)| v.clone().with_key(k.clone()))
|
.map(|(k, v)| v.clone().into_proto_with_key(k.clone()))
|
||||||
.collect();
|
.collect();
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue