From e2b66c819ee01e8eaa677e34d2331739d4c792f5 Mon Sep 17 00:00:00 2001 From: okjodom Date: Fri, 22 Sep 2023 15:42:16 -0700 Subject: [PATCH] sim-lib: shutdown simulation on terminal errors --- sim-lib/src/cln.rs | 6 +++++- sim-lib/src/lib.rs | 28 +++++++++++++++++----------- sim-lib/src/lnd.rs | 11 +++++++++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/sim-lib/src/cln.rs b/sim-lib/src/cln.rs index 4b533c82..daf17737 100644 --- a/sim-lib/src/cln.rs +++ b/sim-lib/src/cln.rs @@ -103,7 +103,11 @@ impl LightningNode for ClnNode { amount_msat: Some(Amount { msat: amount_msat }), ..Default::default() }) - .await?; + .await + .map_err(|s| { + // TODO: Parse CLN rpc status to determine if it's a terminal error or not. + LightningError::TerminalRpcError(format!("{:?}", s)) + })?; let KeysendResponse { payment_hash, .. } = response.into_inner(); let slice: [u8; 32] = payment_hash .as_slice() diff --git a/sim-lib/src/lib.rs b/sim-lib/src/lib.rs index c33e6e5d..67f248b3 100644 --- a/sim-lib/src/lib.rs +++ b/sim-lib/src/lib.rs @@ -99,10 +99,8 @@ pub enum LightningError { GetNodeInfoError(String), #[error("Config validation failed {0}")] ValidationError(String), - #[error("RPC error: {0:?}")] - ClnRpcError(#[from] tonic::Status), - #[error("RPC error: {0:?}")] - LndRpcError(#[from] tonic_lnd::tonic::Status), + #[error("Terminal RPC error: {0:?}")] + TerminalRpcError(String), } #[derive(Debug, Clone)] @@ -418,6 +416,7 @@ impl Simulation { node.clone(), receiver, output_sender.clone(), + shutdown.clone(), )); // Add the producer channel to our map so that various activity descriptions can use it. We may have multiple @@ -448,6 +447,7 @@ async fn consume_events( node: Arc>, mut receiver: Receiver, sender: Sender, + shutdown: Trigger, ) { let node_id = node.lock().await.get_info().pubkey; log::debug!("Started consumer for {}.", node_id); @@ -478,13 +478,19 @@ async fn consume_events( SimulationOutput::SendPaymentSuccess(payment) } Err(e) => { - log::error!( - "Error while sending payment {} -> {}. Error {}.", - node_id, - dest, - e - ); - SimulationOutput::SendPaymentFailure(payment, PaymentResult::default()) + log::error!("Error while sending payment {} -> {}", node_id, dest); + + match e { + LightningError::TerminalRpcError(s) => { + log::error!("Simulation terminated with error: {s}"); + shutdown.trigger(); + break; + } + _ => SimulationOutput::SendPaymentFailure( + payment, + PaymentResult::default(), + ), + } } }; diff --git a/sim-lib/src/lnd.rs b/sim-lib/src/lnd.rs index c7455ab3..19722c9f 100644 --- a/sim-lib/src/lnd.rs +++ b/sim-lib/src/lnd.rs @@ -107,11 +107,18 @@ impl LightningNode for LndNode { fee_limit_msat: i64::max_value(), ..Default::default() }) - .await?; + .await + .map_err(|s| { + // TODO: Parse LND rpc status to determine if it's a terminal error or not. + LightningError::TerminalRpcError(format!("{:?}", s)) + })?; let mut stream = response.into_inner(); - let payment_hash = match stream.message().await? { + let payment_hash = match stream.message().await.map_err(|s| { + // TODO: Parse LND rpc status to determine if it's a terminal error or not. + LightningError::TerminalRpcError(format!("{:?}", s)) + })? { Some(payment) => string_to_payment_hash(&payment.payment_hash)?, None => return Err(LightningError::SendPaymentError("No payment".to_string())), };