From e4a654385fc8e4e18aa39c68325ad0903f023d7f Mon Sep 17 00:00:00 2001 From: Anca Zamfir Date: Tue, 1 Jun 2021 15:12:04 +0200 Subject: [PATCH] Exit when worker detects expired client, remove event decoding trace (#1023) * Exit when worker detects expired client, remove event decoding trace * Provide worker's name when worker aborts * Exit client worker without error when client is expired or frozen * Remove unused import * Changelog Co-authored-by: Romain Ruetschi Co-authored-by: Adi Seredinschi --- CHANGELOG.md | 5 +++++ relayer/src/event/rpc.rs | 6 ++---- relayer/src/worker.rs | 10 +++++++--- relayer/src/worker/client.rs | 9 ++++++--- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34096576d..4ac234be80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +Special thanks to Colin Axnér (@colin-axner) and Jongwhan Lee (@leejw51crypto) +for raising multiple issues that helped us improve the reliability of Hermes. + ### FEATURES - [ibc-relayer] @@ -23,6 +26,7 @@ - [ibc-relayer] - Fix for a client worker bug; Hermes `start` returns error if no chain is reachable ([#972]) + - Client worker aborts gracefully if the client is expired or frozen ([#1022]) - [gaia-manager] - Import hermes keys properly even if wallet HD derivation path is set ([#975]) @@ -42,6 +46,7 @@ [#996]: https://github.com/informalsystems/ibc-rs/issues/996 [#998]: https://github.com/informalsystems/ibc-rs/issues/998 [#1003]: https://github.com/informalsystems/ibc-rs/issues/1003 +[#1022]: https://github.com/informalsystems/ibc-rs/issues/1022 ## v0.3.2 *May 21st, 2021* diff --git a/relayer/src/event/rpc.rs b/relayer/src/event/rpc.rs index b750a77485..9a1e058524 100644 --- a/relayer/src/event/rpc.rs +++ b/relayer/src/event/rpc.rs @@ -2,7 +2,6 @@ use std::{collections::HashMap, convert::TryFrom}; use anomaly::BoxError; use tendermint_rpc::event::{Event as RpcEvent, EventData as RpcEventData}; -use tracing::trace; use ibc::ics02_client::events::NewBlock; use ibc::ics02_client::height::Height; @@ -42,14 +41,13 @@ pub fn get_all_events( let actions_and_indices = extract_helper(&events)?; for action in actions_and_indices { - match build_event(RawObject::new( + if let Ok(event) = build_event(RawObject::new( height, action.0, action.1 as usize, events.clone(), )) { - Ok(event) => vals.push((height, event)), - Err(e) => trace!("error while building event {}", e.to_string()), + vals.push((height, event)); } } } diff --git a/relayer/src/worker.rs b/relayer/src/worker.rs index c99cef81af..52bec6f8c6 100644 --- a/relayer/src/worker.rs +++ b/relayer/src/worker.rs @@ -80,6 +80,7 @@ impl Worker { /// Run the worker event loop. fn run(self, msg_tx: Sender) { let object = self.object(); + let name = object.short_name(); let result = match self { Self::Client(w) => w.run(), @@ -88,14 +89,17 @@ impl Worker { }; if let Err(e) = result { - error!("worker error: {}", e); + error!("[{}] worker aborted with error: {}", name, e); } if let Err(e) = msg_tx.send(WorkerMsg::Stopped(object)) { - error!("failed to notify supervisor that worker stopped: {}", e); + error!( + "[{}] failed to notify supervisor that worker stopped: {}", + name, e + ); } - info!("worker stopped"); + info!("[{}] worker stopped", name); } fn chains(&self) -> &ChainHandlePair { diff --git a/relayer/src/worker/client.rs b/relayer/src/worker/client.rs index c9bdcef421..c98e151985 100644 --- a/relayer/src/worker/client.rs +++ b/relayer/src/worker/client.rs @@ -2,7 +2,7 @@ use std::{thread, time::Duration}; use anomaly::BoxError; use crossbeam_channel::Receiver; -use tracing::{debug, error, info, trace}; +use tracing::{debug, info, trace, warn}; use ibc::{events::IbcEvent, ics02_client::events::UpdateClient}; @@ -76,8 +76,11 @@ impl ClientWorker { }; } Err(e @ ForeignClientError::ExpiredOrFrozen(..)) => { - error!("failed to refresh client '{}': {}", client, e); - continue; + warn!("failed to refresh client '{}': {}", client, e); + + // This worker has completed its job as the client cannot be refreshed any + // further, and can therefore exit without an error. + return Ok(()); } _ => (), };