Skip to content

Commit 994225e

Browse files
authored
Optimize key_exists performance (#360)
* Optimize key_exists performance Signed-off-by: yongman <[email protected]> * Fix clippy Signed-off-by: yongman <[email protected]> * Add test case for key_exists Signed-off-by: yongman <[email protected]> * Fix clippy for test Signed-off-by: yongman <[email protected]>
1 parent a1c4eda commit 994225e

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

src/raw/client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,11 +744,11 @@ impl<PdC: PdClient> Client<PdC> {
744744
}
745745

746746
fn assert_non_atomic(&self) -> Result<()> {
747-
(!self.atomic).then(|| ()).ok_or(Error::UnsupportedMode)
747+
(!self.atomic).then_some(()).ok_or(Error::UnsupportedMode)
748748
}
749749

750750
fn assert_atomic(&self) -> Result<()> {
751-
self.atomic.then(|| ()).ok_or(Error::UnsupportedMode)
751+
self.atomic.then_some(()).ok_or(Error::UnsupportedMode)
752752
}
753753
}
754754

src/transaction/transaction.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ impl<PdC: PdClient> Transaction<PdC> {
208208
/// ```
209209
pub async fn key_exists(&mut self, key: impl Into<Key>) -> Result<bool> {
210210
debug!(self.logger, "invoking transactional key_exists request");
211-
let key = key.into();
212-
Ok(self.scan_keys(key.clone()..=key, 1).await?.next().is_some())
211+
Ok(self.get(key).await?.is_some())
213212
}
214213

215214
/// Create a new 'batch get' request.

tests/integration_tests.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,29 @@ async fn txn_scan_reverse() -> Result<()> {
919919
Ok(())
920920
}
921921

922+
#[tokio::test]
923+
#[serial]
924+
async fn txn_key_exists() -> Result<()> {
925+
init().await?;
926+
let client = TransactionClient::new_with_config(pd_addrs(), Default::default(), None).await?;
927+
let key = "key".to_owned();
928+
let value = "value".to_owned();
929+
let mut t1 = client.begin_optimistic().await?;
930+
t1.put(key.clone(), value.clone()).await?;
931+
assert!(t1.key_exists(key.clone()).await?);
932+
t1.commit().await?;
933+
934+
let mut t2 = client.begin_optimistic().await?;
935+
assert!(t2.key_exists(key).await?);
936+
t2.commit().await?;
937+
938+
let not_exists_key = "not_exists_key".to_owned();
939+
let mut t3 = client.begin_optimistic().await?;
940+
assert!(!t3.key_exists(not_exists_key).await?);
941+
t3.commit().await?;
942+
Ok(())
943+
}
944+
922945
// helper function
923946
async fn get_u32(client: &RawClient, key: Vec<u8>) -> Result<u32> {
924947
let x = client.get(key).await?.unwrap();

0 commit comments

Comments
 (0)