diff --git a/Cargo.lock b/Cargo.lock index 5e390002..b6e5f2ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -152,7 +146,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", ] @@ -253,6 +247,8 @@ version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -471,15 +467,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "criterion" version = "0.5.1" @@ -778,16 +765,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "flate2" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.4", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1028,6 +1005,15 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -1167,15 +1153,6 @@ dependencies = [ "adler", ] -[[package]] -name = "miniz_oxide" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "1.0.3" @@ -1398,6 +1375,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "plotters" version = "0.3.7" @@ -1544,7 +1527,6 @@ dependencies = [ "criterion", "crossterm", "ctrlc", - "flate2", "handlebars", "interim", "libproc", @@ -1570,6 +1552,7 @@ dependencies = [ "winapi", "windows", "windows-service", + "zstd", ] [[package]] @@ -2997,3 +2980,31 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.14+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/pueue/Cargo.toml b/pueue/Cargo.toml index f691133f..a6722dee 100644 --- a/pueue/Cargo.toml +++ b/pueue/Cargo.toml @@ -36,7 +36,6 @@ color-eyre.workspace = true comfy-table = "7" command-group.workspace = true ctrlc = { version = "3", features = ["termination"] } -flate2 = "1" handlebars.workspace = true interim = { version = "0.2.0", features = ["chrono_0_4"] } pest = "2.7" @@ -58,6 +57,7 @@ tracing-subscriber = { version = "0.3.19", features = [ "fmt", "local-time", ] } +zstd = "0.13" [dev-dependencies] assert_cmd = "2" diff --git a/pueue/src/daemon/internal_state/state.rs b/pueue/src/daemon/internal_state/state.rs index 5e8b7ca5..53655e78 100644 --- a/pueue/src/daemon/internal_state/state.rs +++ b/pueue/src/daemon/internal_state/state.rs @@ -1,13 +1,11 @@ use std::{ collections::BTreeMap, fs::{File, read_to_string}, - io::{Read, Write}, process::Child, sync::{Arc, Mutex, MutexGuard}, }; use chrono::Local; -use flate2::Compression; use pueue_lib::{ Group, GroupStatus, Settings, State, TaskResult, error::Error, @@ -258,14 +256,11 @@ impl InternalState { temp = path.join("state.json.gz.partial"); real = path.join("state.json.gz"); - let file = if temp.exists() { - File::open(&temp)? - } else { - File::create(&temp)? - }; + let compressed = zstd::stream::encode_all(serialized.as_bytes(), 3) + .context("failed to compress state")?; - let mut encoder = flate2::write::GzEncoder::new(file, Compression::default()); - encoder.write_all(serialized.as_bytes())?; + std::fs::write(&temp, compressed) + .context("Failed to write compressed state to temp file while saving state.")?; } else { // Write to temporary log file first, to prevent loss due to crashes. std::fs::write(&temp, serialized) @@ -303,12 +298,12 @@ impl InternalState { // Try to load the file. let data = if settings.daemon.compress_state_file { - let file = File::open(path)?; - let mut decoder = flate2::read::GzDecoder::new(file); - let mut data = String::new(); - decoder.read_to_string(&mut data)?; + let f = File::open(&path).context("State restore: Failed to open file:\n\n{}")?; + + let bytes = + zstd::stream::decode_all(f).context("State restore: Failed to decompress file")?; - data + String::from_utf8(bytes).context("State restore: Failed to parse state as UTF-8")? } else { read_to_string(&path).context("State restore: Failed to read file:\n\n{}")? };