diff --git a/Cargo.lock b/Cargo.lock index 3417f5d31..59ee751af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,15 +12,6 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -521,7 +512,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", @@ -529,15 +520,40 @@ dependencies = [ "http-body 0.4.6", "hyper 0.14.32", "itoa", - "matchit", + "matchit 0.7.3", "memchr", "mime", "percent-encoding 2.3.1", "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 0.1.2", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +dependencies = [ + "axum-core 0.5.5", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit 0.8.4", + "memchr", + "mime", + "percent-encoding 2.3.1", + "pin-project-lite", + "serde_core", + "sync_wrapper 1.0.2", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -559,6 +575,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "backoff" version = "0.4.0" @@ -573,21 +607,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if 1.0.1", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.12.3" @@ -719,7 +738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.12.3", + "hashbrown 0.13.2", ] [[package]] @@ -965,7 +984,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -1119,22 +1138,23 @@ dependencies = [ [[package]] name = "console-api" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" +checksum = "e8599749b6667e2f0c910c1d0dff6901163ff698a52d5a39720f61b5be4b20d3" dependencies = [ "futures-core", - "prost 0.12.6", - "prost-types 0.12.6", - "tonic 0.10.2", + "prost 0.14.1", + "prost-types 0.14.1", + "tonic 0.14.2", + "tonic-prost", "tracing-core", ] [[package]] name = "console-subscriber" -version = "0.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" +checksum = "fb4915b7d8dd960457a1b6c380114c2944f728e7c65294ab247ae6b6f1f37592" dependencies = [ "console-api", "crossbeam-channel", @@ -1142,13 +1162,15 @@ dependencies = [ "futures-task", "hdrhistogram", "humantime", - "prost-types 0.12.6", + "hyper-util", + "prost 0.14.1", + "prost-types 0.14.1", "serde", "serde_json", "thread_local", "tokio", "tokio-stream", - "tonic 0.10.2", + "tonic 0.14.2", "tracing", "tracing-core", "tracing-subscriber", @@ -2159,12 +2181,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "git-version" version = "0.3.9" @@ -2566,7 +2582,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2638,6 +2654,19 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.6.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -2658,12 +2687,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "bytes", + "futures-channel", "futures-core", + "futures-util", "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", + "libc", "pin-project-lite", + "socket2 0.5.10", "tokio", + "tower-service", + "tracing", ] [[package]] @@ -4048,6 +4083,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.7.5" @@ -4432,15 +4473,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "oid-registry" version = "0.6.1" @@ -4970,12 +5002,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", - "prost-derive 0.12.6", + "prost-derive 0.14.1", ] [[package]] @@ -5015,12 +5047,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.104", @@ -5037,11 +5069,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.6" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ - "prost 0.12.6", + "prost 0.14.1", ] [[package]] @@ -5133,7 +5165,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.28", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -5172,7 +5204,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -5506,7 +5538,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -6222,6 +6254,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "soketto" version = "0.7.1" @@ -7694,7 +7736,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_derive", - "socket2", + "socket2 0.5.10", "solana-serde", "tokio", "url 2.5.4", @@ -9018,7 +9060,7 @@ dependencies = [ "rand 0.8.5", "rustls 0.23.28", "smallvec", - "socket2", + "socket2 0.5.10", "solana-keypair", "solana-measure", "solana-metrics", @@ -10224,6 +10266,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "synstructure" version = "0.12.6" @@ -10524,21 +10572,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.1", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -10553,9 +10600,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -10753,7 +10800,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-stream", "async-trait", - "axum", + "axum 0.6.20", "base64 0.21.7", "bytes", "futures-core", @@ -10762,7 +10809,7 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", - "hyper-timeout", + "hyper-timeout 0.4.1", "percent-encoding 2.3.1", "pin-project", "prost 0.11.9", @@ -10770,7 +10817,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -10778,26 +10825,28 @@ dependencies = [ [[package]] name = "tonic" -version = "0.10.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" dependencies = [ - "async-stream", "async-trait", - "axum", - "base64 0.21.7", + "axum 0.8.7", + "base64 0.22.1", "bytes", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-timeout", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-timeout 0.5.2", + "hyper-util", "percent-encoding 2.3.1", "pin-project", - "prost 0.12.6", + "socket2 0.6.1", + "sync_wrapper 1.0.2", "tokio", "tokio-stream", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -10816,6 +10865,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tonic-prost" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +dependencies = [ + "bytes", + "prost 0.14.1", + "tonic 0.14.2", +] + [[package]] name = "tower" version = "0.4.13" @@ -10836,6 +10896,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 2.10.0", + "pin-project-lite", + "slab", + "sync_wrapper 1.0.2", + "tokio", + "tokio-util 0.7.15", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -11395,7 +11474,7 @@ dependencies = [ "windows-collections", "windows-core", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -11416,7 +11495,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings", ] @@ -11428,7 +11507,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.1.3", "windows-threading", ] @@ -11460,6 +11539,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -11467,7 +11552,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -11476,7 +11561,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -11485,7 +11570,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -11533,6 +11618,15 @@ dependencies = [ "windows-targets 0.53.2", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -11601,7 +11695,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8b90dd076..2f1fa6dcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ cargo-expand = "1" cargo-lock = "10.0.0" chrono = "0.4" clap = "4.5.40" -console-subscriber = "0.2.0" +console-subscriber = "0.5.0" const_format = "0.2.34" convert_case = "0.8.0" crossbeam-channel = "0.5.11" diff --git a/magicblock-api/src/magic_validator.rs b/magicblock-api/src/magic_validator.rs index ff68a4d1a..c4da8a53b 100644 --- a/magicblock-api/src/magic_validator.rs +++ b/magicblock-api/src/magic_validator.rs @@ -761,6 +761,9 @@ impl MagicValidator { error!("Failed to shutdown ledger: {:?}", err); } let _ = self.rpc_handle.join(); + if let Err(err) = self.ledger_truncator.join() { + error!("Ledger truncator did not gracefully exit: {:?}", err); + } } pub fn ledger(&self) -> &Ledger { diff --git a/magicblock-ledger/src/ledger_truncator.rs b/magicblock-ledger/src/ledger_truncator.rs index 6048bae14..98e7e72e1 100644 --- a/magicblock-ledger/src/ledger_truncator.rs +++ b/magicblock-ledger/src/ledger_truncator.rs @@ -1,5 +1,6 @@ use std::{ cmp::min, + ops::ControlFlow, sync::Arc, thread::{self, JoinHandle}, time::Duration, @@ -87,9 +88,12 @@ impl LedgerTrunctationWorker { self.truncate_fat_ledger(current_ledger_size)?; } else { match self.estimate_truncation_range(current_ledger_size)? { - Some((from_slot, to_slot)) => { - Self::truncate_slot_range(&self.ledger, from_slot, to_slot) - } + Some((from_slot, to_slot)) => Self::truncate_slot_range( + &self.ledger, + from_slot, + to_slot, + self.cancellation_token.clone(), + ), None => warn!("Could not estimate truncation range"), } } @@ -137,7 +141,12 @@ impl LedgerTrunctationWorker { // We will still compact error!("Failed to flush: {}", err); } - Self::compact_slot_range(&self.ledger, 0, truncate_to_slot); + Self::compact_slot_range( + &self.ledger, + 0, + truncate_to_slot, + self.cancellation_token.clone(), + ); Ok(()) } @@ -191,6 +200,7 @@ impl LedgerTrunctationWorker { ledger: &Arc, from_slot: u64, to_slot: u64, + cancellation_token: CancellationToken, ) { // In order not to torture RocksDB's WriteBatch we split large tasks into chunks const SINGLE_TRUNCATION_LIMIT: usize = 300; @@ -207,7 +217,11 @@ impl LedgerTrunctationWorker { let ledger_copy = ledger.clone(); (from_slot..=to_slot) .step_by(SINGLE_TRUNCATION_LIMIT) - .for_each(|cur_from_slot| { + .try_for_each(|cur_from_slot| { + if cancellation_token.is_cancelled() { + return ControlFlow::Break(()); + } + let num_slots_to_truncate = min( to_slot - cur_from_slot + 1, SINGLE_TRUNCATION_LIMIT as u64, @@ -223,56 +237,112 @@ impl LedgerTrunctationWorker { cur_from_slot, truncate_to_slot, err ); } + + ControlFlow::Continue(()) }); // Flush memtables with tombstones prior to compaction if let Err(err) = ledger_copy.flush() { error!("Failed to flush ledger: {err}"); } - Self::compact_slot_range(ledger, from_slot, to_slot); + Self::compact_slot_range( + ledger, + from_slot, + to_slot, + cancellation_token, + ); } /// Synchronous utility function that triggers and awaits compaction on all the columns - /// Compacts [from_slot; to_slot] inclusing ramge + /// Compacts [from_slot; to_slot] inclusive range pub fn compact_slot_range( ledger: &Arc, from_slot: u64, to_slot: u64, + cancellation_token: CancellationToken, ) { + use crate::compact_cf_or_return; + if to_slot < from_slot { warn!("LedgerTruncator: Nani2?"); return; } + if cancellation_token.is_cancelled() { + info!("Validator is shutting down - skipping manual compaction"); + return; + } - // Compaction can be run concurrently for different cf - // but it utilizes rocksdb threads, in order not to drain - // our tokio rt threads, we split offload the effort to a - // separate thread - let mut measure = Measure::start("Manual compaction"); - let ledger = ledger.clone(); - ledger.compact_slot_range_cf::( - Some(from_slot), - Some(to_slot + 1), + info!( + "LedgerTruncator: compacting slot range [{from_slot}; {to_slot}]" ); - ledger.compact_slot_range_cf::( - Some(from_slot), - Some(to_slot + 1), + + struct CompactionMeasure { + measure: Measure, + } + impl Drop for CompactionMeasure { + fn drop(&mut self) { + self.measure.stop(); + info!("Manual compaction took: {}", self.measure); + } + } + + let _measure = CompactionMeasure { + measure: Measure::start("Manual compaction"), + }; + + let start = from_slot; + let end = to_slot + 1; + compact_cf_or_return!( + ledger, + cancellation_token, + start, + end, + Blocktime ); - ledger.compact_slot_range_cf::( - Some(from_slot), - Some(to_slot + 1), + compact_cf_or_return!( + ledger, + cancellation_token, + start, + end, + Blockhash ); - ledger.compact_slot_range_cf::( - Some((from_slot, u32::MIN)), - Some((to_slot + 1, u32::MAX)), + compact_cf_or_return!( + ledger, + cancellation_token, + start, + end, + PerfSamples + ); + compact_cf_or_return!( + ledger, + cancellation_token, + (Some((from_slot, u32::MIN)), Some((to_slot + 1, u32::MAX))), + SlotSignatures + ); + compact_cf_or_return!( + ledger, + cancellation_token, + (None, None), + TransactionStatus + ); + compact_cf_or_return!( + ledger, + cancellation_token, + (None, None), + Transaction + ); + compact_cf_or_return!( + ledger, + cancellation_token, + (None, None), + TransactionMemos + ); + compact_cf_or_return!( + ledger, + cancellation_token, + (None, None), + AddressSignatures ); - ledger.compact_slot_range_cf::(None, None); - ledger.compact_slot_range_cf::(None, None); - ledger.compact_slot_range_cf::(None, None); - ledger.compact_slot_range_cf::(None, None); - - measure.stop(); - info!("Manual compaction took: {measure}"); } } @@ -360,3 +430,27 @@ impl LedgerTruncator { } } } + +#[macro_export] +macro_rules! compact_cf_or_return { + ($ledger:expr, $token:expr, $from:expr, $to:expr, $cf:ty) => {{ + $ledger.compact_slot_range_cf::<$cf>(Some($from), Some($to)); + if $token.is_cancelled() { + info!( + "Validator shutting down - stopping compaction after {}", + <$cf as $crate::database::columns::ColumnName>::NAME + ); + return; + } + }}; + ($ledger:expr, $token:expr, ($from:expr, $to:expr), $cf:ty) => {{ + $ledger.compact_slot_range_cf::<$cf>($from, $to); + if $token.is_cancelled() { + info!( + "Validator shutting down - stopping compaction after {}", + <$cf as $crate::database::columns::ColumnName>::NAME + ); + return; + } + }}; +}