diff --git a/cozorocks/bridge/cozorocks.h b/cozorocks/bridge/cozorocks.h index 820fa586..9499c45d 100644 --- a/cozorocks/bridge/cozorocks.h +++ b/cozorocks/bridge/cozorocks.h @@ -386,6 +386,13 @@ struct TransactionBridge { write_status(raw_db->Flush(options, const_cast(&cf)), status); } + inline void compact_all_raw(const ColumnFamilyHandle &cf, BridgeStatus &status) const { + auto options = CompactRangeOptions(); + options.change_level = true; + options.target_level = 0; + options.exclusive_manual_compaction = false; + write_status(raw_db->CompactRange(options, nullptr, nullptr), status); + } inline std::unique_ptr iterator_txn( const ColumnFamilyHandle &cf) const { diff --git a/cozorocks/src/bridge.rs b/cozorocks/src/bridge.rs index 505fd727..7e46b864 100644 --- a/cozorocks/src/bridge.rs +++ b/cozorocks/src/bridge.rs @@ -148,6 +148,7 @@ mod ffi { fn del_range_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle, start_key: &[u8], end_key: &[u8], status: &mut BridgeStatus); fn flush_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle, options: &FlushOptions, status: &mut BridgeStatus); + fn compact_all_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle, status: &mut BridgeStatus); fn iterator_txn(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr; fn iterator_raw(self: &TransactionBridge, cf: &ColumnFamilyHandle) -> UniquePtr; fn multiget_txn(self: &TransactionBridge, cf: &ColumnFamilyHandle, diff --git a/cozorocks/src/lib.rs b/cozorocks/src/lib.rs index 18f20b69..6dd9f73d 100644 --- a/cozorocks/src/lib.rs +++ b/cozorocks/src/lib.rs @@ -569,6 +569,12 @@ impl TransactionPtr { status.check_err(()) } #[inline] + pub fn compact_all(&self, cf: &ColumnFamilyHandle) -> Result<()> { + let mut status = BridgeStatus::default(); + self.compact_all_raw(cf, &mut status); + status.check_err(()) + } + #[inline] pub fn put(&self, transact: bool, cf: &ColumnFamilyHandle, key: impl AsRef<[u8]>, val: impl AsRef<[u8]>) -> Result<()> { let mut status = BridgeStatus::default(); if transact { diff --git a/src/db/engine.rs b/src/db/engine.rs index 489d1ae8..8fefa332 100644 --- a/src/db/engine.rs +++ b/src/db/engine.rs @@ -162,9 +162,10 @@ impl<'a> Session<'a> { } pub fn finish_work(&mut self) -> Result<()> { self.txn.del_range(&self.temp_cf, Tuple::with_null_prefix(), Tuple::max_tuple())?; - let mut options = FlushOptionsPtr::default(); - options.set_allow_write_stall(true).set_flush_wait(true); - self.txn.flush(&self.temp_cf, options)?; + self.txn.compact_all(&self.temp_cf)?; + // let mut options = FlushOptionsPtr::default(); + // options.set_allow_write_stall(true).set_flush_wait(true); + // self.txn.flush(&self.temp_cf, options)?; Ok(()) } }