From 8211c6ea175e43f9ca22f283607db21cee5b600b Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Mon, 26 Feb 2024 10:42:46 -0700 Subject: [PATCH] feat: `error!` output from behavior (#913) * feat: `error!` output from behavior * submodule: update `template` * fix: `minter` example * fix: clippy --- engine/src/machine.rs | 26 +++++++++++++++++--- examples/minter/behaviors/token_admin.rs | 4 +-- examples/minter/behaviors/token_requester.rs | 4 +-- examples/template | 2 +- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/engine/src/machine.rs b/engine/src/machine.rs index 38084dca..d6e3d888 100644 --- a/engine/src/machine.rs +++ b/engine/src/machine.rs @@ -7,6 +7,7 @@ use anyhow::Result; use arbiter_core::middleware::ArbiterMiddleware; use futures_util::{Stream, StreamExt}; use tokio::task::JoinHandle; +use tracing::error; use super::*; @@ -216,15 +217,27 @@ where async fn execute(&mut self, instruction: MachineInstruction) -> Result<()> { // NOTE: The unwraps here are safe because the `Behavior` in an engine is only // accessed here and it is private. + let id: Option; match instruction { MachineInstruction::Start(client, messager) => { + id = messager.id.clone(); + let id_clone = id.clone(); self.state = State::Starting; let mut behavior = self.behavior.take().unwrap(); let behavior_task: JoinHandle>, B)>> = tokio::spawn(async move { - let id = messager.id.clone(); - let stream = behavior.startup(client, messager).await?; - debug!("startup complete for behavior {:?}", id); + let stream = match behavior.startup(client, messager).await { + Ok(stream) => stream, + Err(e) => { + error!( + "startup failed for behavior {:?}: \n reason: {:?}", + id_clone, e + ); + // Throw a panic as we cannot recover from this for now. + panic!(); + } + }; + debug!("startup complete for behavior {:?}", id_clone); Ok((stream, behavior)) }); let (stream, behavior) = behavior_task.await??; @@ -232,7 +245,12 @@ where Some(stream) => { self.event_stream = Some(stream); self.behavior = Some(behavior); - self.execute(MachineInstruction::Process).await?; + match self.execute(MachineInstruction::Process).await { + Ok(_) => {} + Err(e) => { + error!("process failed for behavior {:?}: \n reason: {:?}", id, e); + } + } Ok(()) } None => { diff --git a/examples/minter/behaviors/token_admin.rs b/examples/minter/behaviors/token_admin.rs index f6669605..496f1901 100644 --- a/examples/minter/behaviors/token_admin.rs +++ b/examples/minter/behaviors/token_admin.rs @@ -52,7 +52,7 @@ impl Behavior for TokenAdmin { &mut self, client: Arc, messager: Messager, - ) -> Result> { + ) -> Result>> { self.messager = Some(messager.clone()); self.client = Some(client.clone()); for token_data in self.token_data.values_mut() { @@ -74,7 +74,7 @@ impl Behavior for TokenAdmin { .get_or_insert_with(HashMap::new) .insert(token_data.name.clone(), token.clone()); } - Ok(messager.stream()?) + Ok(Some(messager.stream()?)) } #[tracing::instrument(skip(self), fields(id = diff --git a/examples/minter/behaviors/token_requester.rs b/examples/minter/behaviors/token_requester.rs index 03c9d9db..e8fcb741 100644 --- a/examples/minter/behaviors/token_requester.rs +++ b/examples/minter/behaviors/token_requester.rs @@ -35,7 +35,7 @@ impl Behavior for TokenRequester { &mut self, client: Arc, mut messager: Messager, - ) -> Result> { + ) -> Result>> { messager .send( To::Agent(self.request_to.clone()), @@ -59,7 +59,7 @@ impl Behavior for TokenRequester { self.messager = Some(messager.clone()); self.client = Some(client.clone()); let transfer_stream = stream_event(token.transfer_filter()); - Ok(transfer_stream) + Ok(Some(transfer_stream)) } #[tracing::instrument(skip(self), fields(id = diff --git a/examples/template b/examples/template index c04df2a2..d49cfe74 160000 --- a/examples/template +++ b/examples/template @@ -1 +1 @@ -Subproject commit c04df2a2c8d8a06ab1f4339142de1d1fa940d196 +Subproject commit d49cfe74bca1fa9ba0975346b0dc125477fe8440