changeset 607:6395514d9a34

Do more compactions, but elegantly
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 14 Jul 2023 21:58:19 +0200
parents 115fa0deaef7
children 2abfa394ba2d
files src/db_impl.rs
diffstat 1 files changed, 8 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/db_impl.rs	Fri Jul 14 21:43:21 2023 +0200
+++ b/src/db_impl.rs	Fri Jul 14 21:58:19 2023 +0200
@@ -418,8 +418,10 @@
 
     /// flush makes sure that all pending changes (e.g. from put()) are stored on disk.
     pub fn flush(&mut self) -> Result<()> {
-        assert!(self.log.is_some());
-        self.log.as_mut().unwrap().flush()
+        if let Some(ref mut log) = self.log.as_mut() {
+            log.flush()?;
+        }
+        Ok(())
     }
 }
 
@@ -565,9 +567,7 @@
     /// make_room_for_write checks if the memtable has become too large, and triggers a compaction
     /// if it's the case.
     fn make_room_for_write(&mut self, force: bool) -> Result<()> {
-        if !force && self.mem.approx_mem_usage() < self.opt.write_buffer_size {
-            Ok(())
-        } else if self.mem.len() == 0 {
+        if !force && self.mem.approx_mem_usage() < self.opt.write_buffer_size || self.mem.len() == 0 {
             Ok(())
         } else {
             // Create new memtable.
@@ -594,8 +594,9 @@
     /// maybe_do_compaction starts a blocking compaction if it makes sense.
     fn maybe_do_compaction(&mut self) -> Result<()> {
         if self.imm.is_some() {
-            self.compact_memtable()
-        } else if self.vset.borrow().needs_compaction() {
+            self.compact_memtable()?;
+        }
+        if self.vset.borrow().needs_compaction() {
             let c = self.vset.borrow_mut().pick_compaction();
             if let Some(c) = c {
                 self.start_compaction(c)
@@ -719,9 +720,6 @@
         }
         ve.set_log_num(self.log_num.unwrap_or(0));
         self.vset.borrow_mut().log_and_apply(ve)?;
-        if let Err(e) = self.maybe_do_compaction() {
-            log!(self.opt.log, "Wanted to do compaction, but failed: {}", e);
-        }
         if let Err(e) = self.delete_obsolete_files() {
             log!(self.opt.log, "Error deleting obsolete files: {}", e);
         }