diff options
author | Alex Auvolat <alex@adnab.me> | 2023-01-10 11:01:49 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2023-01-10 11:03:52 +0100 |
commit | 9f5419f465de3ddbb9afc91464d0eb00636049b9 (patch) | |
tree | ca32f851cda043cfe61873ea46268605f1e2c8ed /src/table/data.rs | |
parent | a48e2e0cb2bdc75e14dfde199dbca0a779b1316b (diff) | |
download | garage-9f5419f465de3ddbb9afc91464d0eb00636049b9.tar.gz garage-9f5419f465de3ddbb9afc91464d0eb00636049b9.zip |
Make K2V item timestamps globally increasing on each node
Diffstat (limited to 'src/table/data.rs')
-rw-r--r-- | src/table/data.rs | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/table/data.rs b/src/table/data.rs index 5c792f1f..26cc3a5a 100644 --- a/src/table/data.rs +++ b/src/table/data.rs @@ -181,13 +181,17 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { pub(crate) fn update_entry(&self, update_bytes: &[u8]) -> Result<(), Error> { let update = self.decode_entry(update_bytes)?; - self.update_entry_with(update.partition_key(), update.sort_key(), |ent| match ent { - Some(mut ent) => { - ent.merge(&update); - ent - } - None => update.clone(), - })?; + self.update_entry_with( + update.partition_key(), + update.sort_key(), + |_tx, ent| match ent { + Some(mut ent) => { + ent.merge(&update); + Ok(ent) + } + None => Ok(update.clone()), + }, + )?; Ok(()) } @@ -195,7 +199,7 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { &self, partition_key: &F::P, sort_key: &F::S, - f: impl Fn(Option<F::E>) -> F::E, + update_fn: impl Fn(&mut db::Transaction, Option<F::E>) -> db::TxOpResult<F::E>, ) -> Result<Option<F::E>, Error> { let tree_key = self.tree_key(partition_key, sort_key); @@ -203,10 +207,10 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { let (old_entry, old_bytes, new_entry) = match tx.get(&self.store, &tree_key)? { Some(old_bytes) => { let old_entry = self.decode_entry(&old_bytes).map_err(db::TxError::Abort)?; - let new_entry = f(Some(old_entry.clone())); + let new_entry = update_fn(&mut tx, Some(old_entry.clone()))?; (Some(old_entry), Some(old_bytes), new_entry) } - None => (None, None, f(None)), + None => (None, None, update_fn(&mut tx, None)?), }; // Changed can be true in two scenarios |