Skip to content

Commit

Permalink
Improve error and metric recording for ICS31 cross chain queries
Browse files Browse the repository at this point in the history
  • Loading branch information
ljoss17 committed Oct 16, 2024
1 parent b268dc1 commit beeda68
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 12 deletions.
32 changes: 23 additions & 9 deletions crates/relayer/src/worker/cross_chain_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ fn handle_cross_chain_query<ChainA: ChainHandle, ChainB: ChainHandle>(
},
IncludeProof::No,
)
.map_err(|_| TaskError::Fatal(RunError::query()))?
.map_err(|e| TaskError::Fatal(RunError::relayer(e)))?
.0;

// Retrieve client based on client id
Expand All @@ -103,19 +103,21 @@ fn handle_cross_chain_query<ChainA: ChainHandle, ChainB: ChainHandle>(
chain_a_handle.clone(),
connection_end.client_id(),
)
.map_err(|_| TaskError::Fatal(RunError::query()))?;
.map_err(|e| TaskError::Fatal(RunError::foreign_client(e)))?;

let target_height = Height::new(
chain_b_handle.id().version(),
cross_chain_query_responses.first().unwrap().height as u64,
)
.map_err(|_| TaskError::Fatal(RunError::query()))?
.map_err(|e| TaskError::Fatal(RunError::ics02(e)))?
.increment();

// Push update client msg
let mut chain_a_msgs = client_a
.wait_and_build_update_client(target_height)
.map_err(|_| TaskError::Fatal(RunError::query()))?;
.map_err(|e| TaskError::Fatal(RunError::foreign_client(e)))?;

let num_cross_chain_query_responses = cross_chain_query_responses.len();

for response in cross_chain_query_responses {
info!("response arrived: query_id: {}", response.query_id);
Expand All @@ -125,24 +127,36 @@ fn handle_cross_chain_query<ChainA: ChainHandle, ChainB: ChainHandle>(
.try_to_any(
chain_a_handle
.get_signer()
.map_err(|_| TaskError::Fatal(RunError::query()))?,
.map_err(|e| TaskError::Fatal(RunError::relayer(e)))?,
)
.map_err(|_| TaskError::Fatal(RunError::query()))?,
.map_err(|e| TaskError::Fatal(RunError::ics31(e)))?,
);
}

let _ccq_responses = chain_a_handle
let ccq_responses = chain_a_handle
.send_messages_and_wait_check_tx(TrackedMsgs::new_uuid(
chain_a_msgs,
Uuid::new_v4(),
))
.map_err(|_| TaskError::Ignore(RunError::query()))?;
.map_err(|e| {
// Since all the CCQs failed, generate a failure code for the telemetry
let failed_codes =
vec![tendermint::abci::Code::from(1); num_cross_chain_query_responses];
telemetry!(
cross_chain_query_responses,
&cross_chain_query.dst_chain_id,
&cross_chain_query.src_chain_id,
failed_codes
);

TaskError::Ignore(RunError::relayer(e))
})?;

telemetry!(
cross_chain_query_responses,
&cross_chain_query.dst_chain_id,
&cross_chain_query.src_chain_id,
_ccq_responses
ccq_responses
.iter()
.map(|ccq_response| ccq_response.code)
.collect()
Expand Down
18 changes: 15 additions & 3 deletions crates/relayer/src/worker/error.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use crossbeam_channel::RecvError;
use flex_error::{define_error, DisplayOnly};
use ibc_relayer_types::applications::ics31_icq::error::Error as Ics31Error;
use ibc_relayer_types::core::ics02_client::error::Error as Ics02Error;

use crate::channel::ChannelError;
use crate::connection::ConnectionError;
use crate::error::Error as RelayerError;
use crate::foreign_client::ForeignClientError;
use crate::link::error::LinkError;

define_error! {
Expand All @@ -12,6 +15,10 @@ define_error! {
[ Ics02Error ]
| _ | { "client error" },

Ics31
[ Ics31Error ]
| _ | { "cross chain query error" },

Connection
[ ConnectionError ]
| _ | { "connection error" },
Expand All @@ -20,19 +27,24 @@ define_error! {
[ ChannelError ]
| _ | { "channel error" },

ForeignClient
[ ForeignClientError ]
| _ | { "foreign client error" },

Link
[ LinkError ]
| _ | { "link error" },

Relayer
[ RelayerError ]
| _ | { "relayer error" },

Retry
{ retries: retry::Error<u64> }
| e | { format_args!("worker failed after {} retries", e.retries) },

Recv
[ DisplayOnly<RecvError> ]
| _ | { "error receiving from channel: sender end has been closed" },

Query
| _ | { "error occurred during querying" }
}
}

0 comments on commit beeda68

Please sign in to comment.