@@ -98,6 +98,9 @@ pub enum WriteMessage {
9898 BeginTransaction ,
9999 /// Commit the current explicit transaction.
100100 CommitTransaction ,
101+ /// Periodic housekeeping: reclaim free pages from deletes/rescans.
102+ /// Sent by a background timer, not counted in WriterStats.
103+ IncrementalVacuum ,
101104 /// Shut down the writer thread.
102105 Shutdown ,
103106}
@@ -381,7 +384,9 @@ fn writer_loop(
381384 let mut accumulator = AccumulatorMaps :: new ( ) ;
382385
383386 for msg in & receiver {
384- stats. record ( & msg) ;
387+ if !matches ! ( msg, WriteMessage :: IncrementalVacuum ) {
388+ stats. record ( & msg) ;
389+ }
385390 if process_message (
386391 & conn,
387392 msg,
@@ -628,6 +633,19 @@ fn process_message(
628633 }
629634 log:: debug!( "Writer: COMMIT transaction ({}ms)" , t. elapsed( ) . as_millis( ) ) ;
630635 }
636+ WriteMessage :: IncrementalVacuum => {
637+ match conn. pragma_query_value ( None , "freelist_count" , |row| row. get :: < _ , i64 > ( 0 ) ) {
638+ Ok ( free) if free > 0 => {
639+ if let Err ( e) = conn. execute_batch ( "PRAGMA incremental_vacuum(2000)" ) {
640+ log:: warn!( "Writer: incremental_vacuum failed: {e}" ) ;
641+ } else {
642+ log:: debug!( "Writer: incremental_vacuum reclaimed up to 2000 of {free} free pages" ) ;
643+ }
644+ }
645+ Ok ( _) => { } // No free pages, nothing to do
646+ Err ( e) => log:: warn!( "Writer: freelist_count query failed: {e}" ) ,
647+ }
648+ }
631649 WriteMessage :: Shutdown => return true ,
632650 }
633651 false
0 commit comments