aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex <alex@adnab.me>2024-09-10 09:06:29 +0000
committerAlex <alex@adnab.me>2024-09-10 09:06:29 +0000
commit586957b4b7261b43e7820d7193516153201b4954 (patch)
treeff57ef1a40dc5bd888a6fdfe36dd8cd119626e61
parent8d2bb4afeba6a90ba12a41144246e3b08eac70f8 (diff)
parent8062ec7b4b6115e6158ec1b5523b4bd8dc0185be (diff)
downloadgarage-586957b4b7261b43e7820d7193516153201b4954.tar.gz
garage-586957b4b7261b43e7820d7193516153201b4954.zip
Merge pull request 'KV: don't retrieve values for write ops' (#873) from marvinj97/garage:perf/kv/insert-no-return into main
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/873 Reviewed-by: Alex <alex@adnab.me>
-rw-r--r--src/db/lib.rs12
-rw-r--r--src/db/lmdb_adapter.rs10
-rw-r--r--src/db/sqlite_adapter.rs15
-rw-r--r--src/db/test.rs4
4 files changed, 15 insertions, 26 deletions
diff --git a/src/db/lib.rs b/src/db/lib.rs
index c8f9e13f..d6057505 100644
--- a/src/db/lib.rs
+++ b/src/db/lib.rs
@@ -211,16 +211,12 @@ impl Tree {
/// Returns the old value if there was one
#[inline]
- pub fn insert<T: AsRef<[u8]>, U: AsRef<[u8]>>(
- &self,
- key: T,
- value: U,
- ) -> Result<Option<Value>> {
+ pub fn insert<T: AsRef<[u8]>, U: AsRef<[u8]>>(&self, key: T, value: U) -> Result<()> {
self.0.insert(self.1, key.as_ref(), value.as_ref())
}
/// Returns the old value if there was one
#[inline]
- pub fn remove<T: AsRef<[u8]>>(&self, key: T) -> Result<Option<Value>> {
+ pub fn remove<T: AsRef<[u8]>>(&self, key: T) -> Result<()> {
self.0.remove(self.1, key.as_ref())
}
/// Clears all values from the tree
@@ -339,8 +335,8 @@ pub(crate) trait IDb: Send + Sync {
fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value>>;
fn len(&self, tree: usize) -> Result<usize>;
- fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<Option<Value>>;
- fn remove(&self, tree: usize, key: &[u8]) -> Result<Option<Value>>;
+ fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()>;
+ fn remove(&self, tree: usize, key: &[u8]) -> Result<()>;
fn clear(&self, tree: usize) -> Result<()>;
fn iter(&self, tree: usize) -> Result<ValueIter<'_>>;
diff --git a/src/db/lmdb_adapter.rs b/src/db/lmdb_adapter.rs
index d5066664..436a67fa 100644
--- a/src/db/lmdb_adapter.rs
+++ b/src/db/lmdb_adapter.rs
@@ -132,22 +132,20 @@ impl IDb for LmdbDb {
Ok(tree.len(&tx)?.try_into().unwrap())
}
- fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<Option<Value>> {
+ fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
let tree = self.get_tree(tree)?;
let mut tx = self.db.write_txn()?;
- let old_val = tree.get(&tx, key)?.map(Vec::from);
tree.put(&mut tx, key, value)?;
tx.commit()?;
- Ok(old_val)
+ Ok(())
}
- fn remove(&self, tree: usize, key: &[u8]) -> Result<Option<Value>> {
+ fn remove(&self, tree: usize, key: &[u8]) -> Result<()> {
let tree = self.get_tree(tree)?;
let mut tx = self.db.write_txn()?;
- let old_val = tree.get(&tx, key)?.map(Vec::from);
tree.delete(&mut tx, key)?;
tx.commit()?;
- Ok(old_val)
+ Ok(())
}
fn clear(&self, tree: usize) -> Result<()> {
diff --git a/src/db/sqlite_adapter.rs b/src/db/sqlite_adapter.rs
index a91b9011..5a142117 100644
--- a/src/db/sqlite_adapter.rs
+++ b/src/db/sqlite_adapter.rs
@@ -169,7 +169,7 @@ impl IDb for SqliteDb {
}
}
- fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<Option<Value>> {
+ fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
let tree = self.get_tree(tree)?;
let db = self.db.get()?;
let lock = self.write_lock.lock();
@@ -184,23 +184,18 @@ impl IDb for SqliteDb {
assert_eq!(n, 1);
drop(lock);
- Ok(old_val)
+ Ok(())
}
- fn remove(&self, tree: usize, key: &[u8]) -> Result<Option<Value>> {
+ fn remove(&self, tree: usize, key: &[u8]) -> Result<()> {
let tree = self.get_tree(tree)?;
let db = self.db.get()?;
let lock = self.write_lock.lock();
- let old_val = self.internal_get(&db, &tree, key)?;
-
- if old_val.is_some() {
- let n = db.execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
- assert_eq!(n, 1);
- }
+ let n = db.execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
drop(lock);
- Ok(old_val)
+ Ok(())
}
fn clear(&self, tree: usize) -> Result<()> {
diff --git a/src/db/test.rs b/src/db/test.rs
index adb429e7..e3b7badf 100644
--- a/src/db/test.rs
+++ b/src/db/test.rs
@@ -12,7 +12,7 @@ fn test_suite(db: Db) {
// ---- test simple insert/delete ----
- assert!(tree.insert(ka, va).unwrap().is_none());
+ assert!(tree.insert(ka, va).is_ok());
assert_eq!(tree.get(ka).unwrap().unwrap(), va);
assert_eq!(tree.len().unwrap(), 1);
@@ -50,7 +50,7 @@ fn test_suite(db: Db) {
assert!(iter.next().is_none());
drop(iter);
- assert!(tree.insert(kb, vc).unwrap().is_none());
+ assert!(tree.insert(kb, vc).is_ok());
assert_eq!(tree.get(kb).unwrap().unwrap(), vc);
let mut iter = tree.iter().unwrap();