diff --git a/Cargo.lock b/Cargo.lock index 7998ad2907..4967d8e7f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,18 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -853,6 +865,18 @@ dependencies = [ "rand", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.3.0" @@ -1248,6 +1272,9 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -1255,6 +1282,15 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "heck" version = "0.4.1" @@ -1776,6 +1812,16 @@ dependencies = [ "redox_syscall", ] +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "libsystemd" version = "0.7.0" @@ -2677,6 +2723,7 @@ dependencies = [ "regex", "reqwest 0.12.12", "rpmostree-client", + "rusqlite", "rust-ini", "rustix", "serde", @@ -2695,6 +2742,20 @@ dependencies = [ "xmlrpc", ] +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags 2.8.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rust-ini" version = "0.21.1" diff --git a/Cargo.toml b/Cargo.toml index bb3df996fa..868281a622 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,6 +79,7 @@ phf = { version = "0.11", features = ["macros"] } rand = "0.8.5" rayon = "1.10.0" regex = "1.10" +rusqlite = "0.32.1" reqwest = { version = "0.12", features = ["native-tls", "blocking", "gzip"] } rpmostree-client = { path = "rust/rpmostree-client", version = "0.1.0" } rust-ini = "0.21.1" diff --git a/rust/src/composepost.rs b/rust/src/composepost.rs index c1057c8c1b..e07124be0d 100644 --- a/rust/src/composepost.rs +++ b/rust/src/composepost.rs @@ -421,6 +421,17 @@ fn postprocess_cleanup_rpmdb_impl(rootfs_dfd: &Dir) -> Result<()> { } else { return Ok(()); }; + // https://github.com/rpm-software-management/rpm/issues/2219 + const RPMDB_SQLITE: &str = "rpmdb.sqlite"; + const RPMDB_SQLITE_SHM: &str = "rpmdb.sqlite-shm"; + if d.try_exists(RPMDB_SQLITE_SHM)? { + tracing::debug!("Cleaning up {RPMDB_SQLITE_SHM}"); + let procpath = format!("/proc/self/fd/{}/{RPMDB_SQLITE}", d.as_raw_fd()); + let conn = rusqlite::Connection::open(&procpath) + .with_context(|| format!("Opening {RPMDB_SQLITE}"))?; + conn.pragma_update(None, "journal_mode", "DELETE")?; + conn.close().map_err(|r| r.1)?; + } for ent in d.entries()? { let ent = ent?; let name = ent.file_name()?; @@ -1184,6 +1195,8 @@ fn rewrite_rpmdb_for_target_inner(rootfs_dfd: &Dir, normalize: bool) -> Result<( normalization::normalize_rpmdb(rootfs_dfd, RPMOSTREE_RPMDB_LOCATION)?; } + postprocess_cleanup_rpmdb_impl(rootfs_dfd)?; + tempetc.undo()?; Ok(()) diff --git a/tests/compose/libbasic-test.sh b/tests/compose/libbasic-test.sh index 3f7c6d8ae5..0455c26857 100644 --- a/tests/compose/libbasic-test.sh +++ b/tests/compose/libbasic-test.sh @@ -43,6 +43,7 @@ echo "ok etc/default/useradd" for path in /usr/share/rpm /usr/lib/sysimage/rpm-ostree-base-db; do ostree --repo=${repo} ls -R ${treeref} ${path} > db.txt assert_file_has_content_literal db.txt rpmdb.sqlite + assert_not_file_has_content db.txt rpmdb.sqlite-shm done ostree --repo=${repo} ls ${treeref} /usr/lib/sysimage/rpm >/dev/null echo "ok db"