get autovacuum mode from db header on existing dbs

if autovaccum on, look for ptrmap pages
This commit is contained in:
Pavan-Nambi
2025-10-18 18:46:40 +05:30
parent 73cabf49f2
commit 1a058a1531
4 changed files with 51 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ pub mod numeric;
mod numeric;
use crate::storage::checksum::CHECKSUM_REQUIRED_RESERVED_BYTES;
use crate::storage::pager::{AutoVacuumMode, HeaderRef};
use crate::translate::display::PlanContext;
use crate::translate::pragma::TURSO_CDC_DEFAULT_TABLE_NAME;
#[cfg(all(feature = "fs", feature = "conn_raw_api"))]
@@ -549,6 +550,29 @@ impl Database {
pager.enable_encryption(self.opts.enable_encryption);
let pager = Arc::new(pager);
if self.db_state.is_initialized() {
let header_ref = pager.io.block(|| HeaderRef::from_pager(&pager))?;
let header = header_ref.borrow();
let mode = if header.vacuum_mode_largest_root_page.get() > 0 {
if header.incremental_vacuum_enabled.get() > 0 {
AutoVacuumMode::Incremental
} else {
AutoVacuumMode::Full
}
} else {
AutoVacuumMode::None
};
pager.set_auto_vacuum_mode(mode);
tracing::debug!(
"Opened existing database. Detected auto_vacuum_mode from header: {:?}",
mode
);
}
let page_size = pager.get_page_size_unchecked();
let default_cache_size = pager

View File

@@ -5887,6 +5887,7 @@ pub(crate) enum PageCategory {
Overflow,
FreeListTrunk,
FreePage,
PointerMap,
}
#[derive(Clone)]

View File

@@ -2591,7 +2591,7 @@ impl CreateBTreeFlags {
** identifies the parent page in the btree.
*/
#[cfg(not(feature = "omit_autovacuum"))]
mod ptrmap {
pub(crate) mod ptrmap {
use crate::{storage::sqlite3_ondisk::PageSize, LimboError, Result};
// Constants

View File

@@ -7974,6 +7974,31 @@ pub fn op_integrity_check(
expected_count: integrity_check_state.freelist_count.expected_count,
});
}
let auto_vacuum_mode = pager.get_auto_vacuum_mode();
if !matches!(
auto_vacuum_mode,
crate::storage::pager::AutoVacuumMode::None
) {
tracing::debug!("Integrity check: auto-vacuum mode detected ({:?}). Scanning for pointer-map pages.", auto_vacuum_mode);
let page_size = pager.get_page_size_unchecked().get() as usize;
for page_number in 2..=integrity_check_state.db_size {
if crate::storage::pager::ptrmap::is_ptrmap_page(
page_number as u32,
page_size,
) {
tracing::debug!("Integrity check: Found and marking pointer-map page as visited: page_id={}", page_number);
integrity_check_state.start(
page_number as i64,
PageCategory::PointerMap,
errors,
);
}
}
}
for page_number in 2..=integrity_check_state.db_size {
if !integrity_check_state
.page_reference