Skip to content

Commit 041fb14

Browse files
authored
make write batch aotmic under txn sys (#91)
1 parent 1d9693c commit 041fb14

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

mini-lsm-mvcc/src/lsm_storage.rs

+11-14
Original file line numberDiff line numberDiff line change
@@ -573,34 +573,31 @@ impl LsmStorageInner {
573573
pub fn write_batch_inner<T: AsRef<[u8]>>(&self, batch: &[WriteBatchRecord<T>]) -> Result<u64> {
574574
let _lck = self.mvcc().write_lock.lock();
575575
let ts = self.mvcc().latest_commit_ts() + 1;
576+
let mut batch_datas: Vec<(key::Key<&[u8]>, &[u8])> = vec![];
577+
let size;
576578
for record in batch {
577579
match record {
578580
WriteBatchRecord::Del(key) => {
579581
let key = key.as_ref();
580582
assert!(!key.is_empty(), "key cannot be empty");
581-
let size;
582-
{
583-
let guard = self.state.read();
584-
guard.memtable.put(KeySlice::from_slice(key, ts), b"")?;
585-
size = guard.memtable.approximate_size();
586-
}
587-
self.try_freeze(size)?;
583+
batch_datas.push((KeySlice::from_slice(key, ts), b""));
588584
}
589585
WriteBatchRecord::Put(key, value) => {
590586
let key = key.as_ref();
591587
let value = value.as_ref();
592588
assert!(!key.is_empty(), "key cannot be empty");
593589
assert!(!value.is_empty(), "value cannot be empty");
594-
let size;
595-
{
596-
let guard = self.state.read();
597-
guard.memtable.put(KeySlice::from_slice(key, ts), value)?;
598-
size = guard.memtable.approximate_size();
599-
}
600-
self.try_freeze(size)?;
590+
batch_datas.push((KeySlice::from_slice(key, ts), value));
601591
}
602592
}
603593
}
594+
{
595+
let guard = self.state.read();
596+
guard.memtable.put_batch(&batch_datas)?;
597+
size = guard.memtable.approximate_size();
598+
}
599+
self.try_freeze(size)?;
600+
604601
self.mvcc().update_commit_ts(ts);
605602
Ok(ts)
606603
}

0 commit comments

Comments
 (0)