From 80ad8cec09965c9739e69f85ce2037b1bd6fde45 Mon Sep 17 00:00:00 2001 From: letterbee Date: Tue, 6 Aug 2024 02:33:29 +0800 Subject: [PATCH] make write batch aotmic under txn sys --- mini-lsm-mvcc/src/lsm_storage.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/mini-lsm-mvcc/src/lsm_storage.rs b/mini-lsm-mvcc/src/lsm_storage.rs index a136f480..5b166993 100644 --- a/mini-lsm-mvcc/src/lsm_storage.rs +++ b/mini-lsm-mvcc/src/lsm_storage.rs @@ -559,34 +559,31 @@ impl LsmStorageInner { pub fn write_batch_inner>(&self, batch: &[WriteBatchRecord]) -> Result { let _lck = self.mvcc().write_lock.lock(); let ts = self.mvcc().latest_commit_ts() + 1; + let mut batch_datas: Vec<(key::Key<&[u8]>, &[u8])> = vec![]; + let size; for record in batch { match record { WriteBatchRecord::Del(key) => { let key = key.as_ref(); assert!(!key.is_empty(), "key cannot be empty"); - let size; - { - let guard = self.state.read(); - guard.memtable.put(KeySlice::from_slice(key, ts), b"")?; - size = guard.memtable.approximate_size(); - } - self.try_freeze(size)?; + batch_datas.push((KeySlice::from_slice(key, ts), b"")); } WriteBatchRecord::Put(key, value) => { let key = key.as_ref(); let value = value.as_ref(); assert!(!key.is_empty(), "key cannot be empty"); assert!(!value.is_empty(), "value cannot be empty"); - let size; - { - let guard = self.state.read(); - guard.memtable.put(KeySlice::from_slice(key, ts), value)?; - size = guard.memtable.approximate_size(); - } - self.try_freeze(size)?; + batch_datas.push((KeySlice::from_slice(key, ts), value)); } } } + { + let guard = self.state.read(); + guard.memtable.put_batch(&batch_datas)?; + size = guard.memtable.approximate_size(); + } + self.try_freeze(size)?; + self.mvcc().update_commit_ts(ts); Ok(ts) }