@@ -573,34 +573,31 @@ impl LsmStorageInner {
573
573
pub fn write_batch_inner < T : AsRef < [ u8 ] > > ( & self , batch : & [ WriteBatchRecord < T > ] ) -> Result < u64 > {
574
574
let _lck = self . mvcc ( ) . write_lock . lock ( ) ;
575
575
let ts = self . mvcc ( ) . latest_commit_ts ( ) + 1 ;
576
+ let mut batch_datas: Vec < ( key:: Key < & [ u8 ] > , & [ u8 ] ) > = vec ! [ ] ;
577
+ let size;
576
578
for record in batch {
577
579
match record {
578
580
WriteBatchRecord :: Del ( key) => {
579
581
let key = key. as_ref ( ) ;
580
582
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"" ) ) ;
588
584
}
589
585
WriteBatchRecord :: Put ( key, value) => {
590
586
let key = key. as_ref ( ) ;
591
587
let value = value. as_ref ( ) ;
592
588
assert ! ( !key. is_empty( ) , "key cannot be empty" ) ;
593
589
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) ) ;
601
591
}
602
592
}
603
593
}
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
+
604
601
self . mvcc ( ) . update_commit_ts ( ts) ;
605
602
Ok ( ts)
606
603
}
0 commit comments