From d0e26643816c7da680dac1ed54827faf2f79f958 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 19 Dec 2023 11:42:23 +0100 Subject: [PATCH 1/5] [fix]: Make the ledger wait for genesis before starting up any processes --- apps/src/lib/node/ledger/mod.rs | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index 11bd75aba5..d747ed1a7d 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -17,6 +17,8 @@ use futures::future::TryFutureExt; use namada::core::ledger::governance::storage::keys as governance_storage; use namada::eth_bridge::ethers::providers::{Http, Provider}; use namada::types::storage::Key; +use namada::types::time::{DateTimeUtc, Utc}; +use namada_sdk::control_flow::install_shutdown_signal; use namada_sdk::tendermint::abci::request::CheckTxKind; use once_cell::unsync::Lazy; use sysinfo::{RefreshKind, System, SystemExt}; @@ -249,6 +251,10 @@ async fn run_aux(config: config::Ledger, wasm_dir: PathBuf) { // Start Tendermint node let tendermint_node = start_tendermint(&mut spawner, &config); + // wait for genesis time + let genesis_time = DateTimeUtc::try_from(config.genesis_time.clone()) + .expect("Should be able to parse genesis time"); + sleep_until(genesis_time).await; // Start oracle if necessary let (eth_oracle_channels, eth_oracle) = @@ -748,3 +754,31 @@ async fn maybe_start_ethereum_oracle( fn spawn_dummy_task(ready: T) -> task::JoinHandle { tokio::spawn(async { std::future::ready(ready).await }) } + +/// Sleep until the genesis time if necessary. +async fn sleep_until(time: DateTimeUtc) { + let shutdown_signal = install_shutdown_signal(); + // Sleep until start time if needed + let sleep = async { + if let Ok(sleep_time) = + time.0.signed_duration_since(Utc::now()).to_std() + { + if !sleep_time.is_zero() { + tracing::info!( + "Waiting for ledger genesis time: {:?}, time left: {:?}", + time, + sleep_time + ); + tokio::time::sleep(sleep_time).await + } + } + }; + tokio::select! { + _ = shutdown_signal => { + tracing::info!("Shutdown signal receiving, shutting down"); + } + _ = sleep => { + tracing::info!("Genesis time reached, starting ledger"); + } + }; +} From df1ad885546db9b198b9c43a9373601868849dc3 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 19 Dec 2023 11:46:59 +0100 Subject: [PATCH 2/5] changelog --- .changelog/unreleased/bug-fixes/2310-wait-for-genesis-time.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/unreleased/bug-fixes/2310-wait-for-genesis-time.md diff --git a/.changelog/unreleased/bug-fixes/2310-wait-for-genesis-time.md b/.changelog/unreleased/bug-fixes/2310-wait-for-genesis-time.md new file mode 100644 index 0000000000..0d8c8ab34f --- /dev/null +++ b/.changelog/unreleased/bug-fixes/2310-wait-for-genesis-time.md @@ -0,0 +1 @@ + - Make the ledger wait for genesis before starting up any processes ([\#2310](https://github.com/anoma/namada/pull/2310)) \ No newline at end of file From 6779c618935d7dd5b9804292e33a1ee1a080e1ad Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 19 Dec 2023 11:47:58 +0100 Subject: [PATCH 3/5] [fix]: Fixed english --- apps/src/lib/node/ledger/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index d747ed1a7d..fe7c0704f0 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -775,7 +775,7 @@ async fn sleep_until(time: DateTimeUtc) { }; tokio::select! { _ = shutdown_signal => { - tracing::info!("Shutdown signal receiving, shutting down"); + tracing::info!("Shutdown signal received, shutting down"); } _ = sleep => { tracing::info!("Genesis time reached, starting ledger"); From 8e5bc9bb183ee49fc75661714c9bc4f604826c1d Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 19 Dec 2023 15:27:57 +0100 Subject: [PATCH 4/5] Addressing review comments --- apps/src/lib/node/ledger/mod.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index fe7c0704f0..f48b1964b4 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -249,12 +249,14 @@ async fn run_aux(config: config::Ledger, wasm_dir: PathBuf) { // from Tendermint let mut spawner = AbortableSpawner::new(); - // Start Tendermint node - let tendermint_node = start_tendermint(&mut spawner, &config); // wait for genesis time let genesis_time = DateTimeUtc::try_from(config.genesis_time.clone()) .expect("Should be able to parse genesis time"); - sleep_until(genesis_time).await; + if let std::ops::ControlFlow::Break(_) = sleep_until(genesis_time).await { + return; + } + // Start Tendermint node + let tendermint_node = start_tendermint(&mut spawner, &config); // Start oracle if necessary let (eth_oracle_channels, eth_oracle) = @@ -756,7 +758,7 @@ fn spawn_dummy_task(ready: T) -> task::JoinHandle { } /// Sleep until the genesis time if necessary. -async fn sleep_until(time: DateTimeUtc) { +async fn sleep_until(time: DateTimeUtc) -> std::ops::ControlFlow<()> { let shutdown_signal = install_shutdown_signal(); // Sleep until start time if needed let sleep = async { @@ -776,9 +778,11 @@ async fn sleep_until(time: DateTimeUtc) { tokio::select! { _ = shutdown_signal => { tracing::info!("Shutdown signal received, shutting down"); + std::ops::ControlFlow::Break(()) } _ = sleep => { tracing::info!("Genesis time reached, starting ledger"); + std::ops::ControlFlow::Continue(()) } - }; + } } From f882dd3f34faca255c53e668bf63b20bac1f4fb3 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 20 Dec 2023 10:36:19 +0100 Subject: [PATCH 5/5] [fix]: Don't spawn another async task to shutdown while waiting for genesis. --- apps/src/lib/node/ledger/mod.rs | 20 +++++++++++--------- sdk/src/control_flow/mod.rs | 4 ++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index f48b1964b4..c5188f5c7b 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -18,7 +18,6 @@ use namada::core::ledger::governance::storage::keys as governance_storage; use namada::eth_bridge::ethers::providers::{Http, Provider}; use namada::types::storage::Key; use namada::types::time::{DateTimeUtc, Utc}; -use namada_sdk::control_flow::install_shutdown_signal; use namada_sdk::tendermint::abci::request::CheckTxKind; use once_cell::unsync::Lazy; use sysinfo::{RefreshKind, System, SystemExt}; @@ -243,18 +242,18 @@ pub fn rollback(config: config::Ledger) -> Result<(), shell::Error> { /// /// All must be alive for correct functioning. async fn run_aux(config: config::Ledger, wasm_dir: PathBuf) { - let setup_data = run_aux_setup(&config, &wasm_dir).await; - - // Create an `AbortableSpawner` for signalling shut down from the shell or - // from Tendermint - let mut spawner = AbortableSpawner::new(); - // wait for genesis time let genesis_time = DateTimeUtc::try_from(config.genesis_time.clone()) .expect("Should be able to parse genesis time"); if let std::ops::ControlFlow::Break(_) = sleep_until(genesis_time).await { return; } + let setup_data = run_aux_setup(&config, &wasm_dir).await; + + // Create an `AbortableSpawner` for signalling shut down from the shell or + // from Tendermint + let mut spawner = AbortableSpawner::new(); + // Start Tendermint node let tendermint_node = start_tendermint(&mut spawner, &config); @@ -759,7 +758,6 @@ fn spawn_dummy_task(ready: T) -> task::JoinHandle { /// Sleep until the genesis time if necessary. async fn sleep_until(time: DateTimeUtc) -> std::ops::ControlFlow<()> { - let shutdown_signal = install_shutdown_signal(); // Sleep until start time if needed let sleep = async { if let Ok(sleep_time) = @@ -775,9 +773,13 @@ async fn sleep_until(time: DateTimeUtc) -> std::ops::ControlFlow<()> { } } }; + let shutdown_signal = async { + let (tx, rx) = tokio::sync::oneshot::channel(); + namada_sdk::control_flow::shutdown_send(tx).await; + rx.await + }; tokio::select! { _ = shutdown_signal => { - tracing::info!("Shutdown signal received, shutting down"); std::ops::ControlFlow::Break(()) } _ = sleep => { diff --git a/sdk/src/control_flow/mod.rs b/sdk/src/control_flow/mod.rs index 9b75b6e921..42294d5191 100644 --- a/sdk/src/control_flow/mod.rs +++ b/sdk/src/control_flow/mod.rs @@ -66,7 +66,7 @@ pub fn install_shutdown_signal() -> ShutdownSignal { } #[cfg(unix)] -async fn shutdown_send(tx: oneshot::Sender<()>) { +pub async fn shutdown_send(tx: oneshot::Sender<()>) { use tokio::signal::unix::{signal, SignalKind}; let mut sigterm = signal(SignalKind::terminate()).unwrap(); let mut sighup = signal(SignalKind::hangup()).unwrap(); @@ -107,7 +107,7 @@ async fn shutdown_send(tx: oneshot::Sender<()>) { } #[cfg(windows)] -async fn shutdown_send(tx: oneshot::Sender<()>) { +pub async fn shutdown_send(tx: oneshot::Sender<()>) { let mut sigbreak = tokio::signal::windows::ctrl_break().unwrap(); tokio::select! { signal = tokio::signal::ctrl_c() => {