From 5687fc0375375a85a6b939845f270135ca289959 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 14 Sep 2025 19:22:36 +0200 Subject: [PATCH] update rusqlite and snapshot using VACUUM INTO --- Cargo.lock | 18 +++++++++--------- Cargo.toml | 4 ++-- src/db/sqlite_adapter.rs | 30 ++++++++---------------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 997d6a92..5824294e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1810,11 +1810,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -2619,9 +2619,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" dependencies = [ "cc", "pkg-config", @@ -3478,9 +3478,9 @@ dependencies = [ [[package]] name = "r2d2_sqlite" -version = "0.24.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a982edf65c129796dba72f8775b292ef482b40d035e827a9825b3bc07ccc5f2" +checksum = "63417e83dc891797eea3ad379f52a5986da4bca0d6ef28baf4d14034dd111b0c" dependencies = [ "r2d2", "rusqlite", @@ -3669,9 +3669,9 @@ checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" [[package]] name = "rusqlite" -version = "0.31.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" dependencies = [ "bitflags 2.9.0", "fallible-iterator", diff --git a/Cargo.toml b/Cargo.toml index fdec5010..75d5bcfb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -88,9 +88,9 @@ tracing-journald = "0.3.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } heed = { version = "0.11", default-features = false, features = ["lmdb"] } -rusqlite = "0.31.0" +rusqlite = "0.37" r2d2 = "0.8" -r2d2_sqlite = "0.24" +r2d2_sqlite = "0.31" fjall = "2.4" async-compression = { version = "0.4", features = ["tokio", "zstd"] } diff --git a/src/db/sqlite_adapter.rs b/src/db/sqlite_adapter.rs index d645c64e..a03ee8ef 100644 --- a/src/db/sqlite_adapter.rs +++ b/src/db/sqlite_adapter.rs @@ -151,30 +151,16 @@ impl IDb for SqliteDb { } fn snapshot(&self, base_path: &PathBuf) -> Result<()> { - fn progress(p: rusqlite::backup::Progress) { - use std::sync::atomic::{AtomicU64, Ordering}; - use std::time::{SystemTime, UNIX_EPOCH}; - - static LAST_LOG_TIME: AtomicU64 = AtomicU64::new(0); - - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .expect("Fix your clock :o") - .as_millis() as u64; - if now >= LAST_LOG_TIME.load(Ordering::Relaxed) + 10 * 1000 { - let percent = (p.pagecount - p.remaining) * 100 / p.pagecount; - info!("Sqlite snapshot progress: {}%", percent); - - LAST_LOG_TIME.fetch_max(now, Ordering::Relaxed); - } - } - std::fs::create_dir_all(base_path)?; - let path = Engine::Sqlite.db_path(&base_path); + let path = Engine::Sqlite + .db_path(&base_path) + .into_os_string() + .into_string() + .map_err(|_| Error("invalid sqlite path string".into()))?; - self.db - .get()? - .backup(rusqlite::DatabaseName::Main, path, Some(progress))?; + info!("Start sqlite VACUUM INTO `{}`", path); + self.db.get()?.execute("VACUUM INTO ?1", params![path])?; + info!("Finished sqlite VACUUM INTO `{}`", path); Ok(()) }