Merge 'Simulator: persist files in sim memory IO for integrity check' from Pedro Muniz

If we don't persist the files, rusqlite will open an empty file and
perform integrity check on it.

Reviewed-by: bit-aloo (@Shourya742)

Closes #3676
This commit is contained in:
Jussi Saurio
2025-10-13 14:23:53 +03:00
committed by GitHub
4 changed files with 21 additions and 0 deletions

View File

@@ -611,6 +611,8 @@ fn run_simulation_default(
tracing::info!("Simulation completed");
env.io.persist_files().unwrap();
if result.error.is_none() {
let ic = integrity_check(&env.get_db_path());
if let Err(err) = ic {
@@ -684,6 +686,7 @@ const BANNER: &str = r#"
"#;
fn integrity_check(db_path: &Path) -> anyhow::Result<()> {
assert!(db_path.exists());
let conn = rusqlite::Connection::open(db_path)?;
let mut stmt = conn.prepare("SELECT * FROM pragma_integrity_check;")?;
let mut rows = stmt.query(())?;

View File

@@ -79,6 +79,11 @@ impl SimIO for SimulatorIO {
fn close_files(&self) {
self.files.borrow_mut().clear()
}
fn persist_files(&self) -> anyhow::Result<()> {
// Files are persisted automatically
Ok(())
}
}
impl Clock for SimulatorIO {

View File

@@ -190,6 +190,17 @@ impl SimIO for MemorySimIO {
file.closed.set(true);
}
}
fn persist_files(&self) -> anyhow::Result<()> {
let files = self.files.borrow();
for (file_path, file) in files.iter() {
if file_path.ends_with(".db") || file_path.ends_with("wal") || file_path.ends_with("lg")
{
std::fs::write(file_path, &*file.buffer.borrow())?;
}
}
Ok(())
}
}
impl Clock for MemorySimIO {

View File

@@ -20,4 +20,6 @@ pub trait SimIO: turso_core::IO {
fn syncing(&self) -> bool;
fn close_files(&self);
fn persist_files(&self) -> anyhow::Result<()>;
}