better handling when rate limited

This commit is contained in:
Bryan Stitt 2023-01-25 14:24:38 -08:00
parent f80390c88a
commit 43b5652ba8
2 changed files with 34 additions and 13 deletions

View File

@ -201,22 +201,37 @@ async fn check_rpc(
"params": [block_hash, false], "params": [block_hash, false],
}); });
// TODO: don't unwrap! don't use the try operator let response = client
let response: JsonRpcResponse<Block<TxHash>> = client
.post(rpc.clone()) .post(rpc.clone())
.json(&block_by_hash_request) .json(&block_by_hash_request)
.send() .send()
.await .await
.context(format!("awaiting response from {}", rpc))? .context(format!("awaiting response from {}", rpc))?;
.json()
.await
.context(format!("reading json on {}", rpc))?;
if let Some(result) = response.result { if !response.status().is_success() {
return Err(anyhow::anyhow!(
"bad response from {}: {}",
rpc,
response.status(),
));
}
let body = response
.text()
.await
.context(format!("failed parsing body from {}", rpc))?;
let response_json: JsonRpcResponse<Block<TxHash>> = serde_json::from_str(&body)
.context(format!("body: {}", body))
.context(format!("failed parsing json from {}", rpc))?;
if let Some(result) = response_json.result {
let abbreviated = AbbreviatedBlock::from(result); let abbreviated = AbbreviatedBlock::from(result);
debug!("{} has {:?}@{}", rpc, abbreviated.hash, abbreviated.num);
Ok(abbreviated) Ok(abbreviated)
} else if let Some(result) = response.error { } else if let Some(result) = response_json.error {
Err(anyhow!( Err(anyhow!(
"jsonrpc error during check_rpc from {}: {:#}", "jsonrpc error during check_rpc from {}: {:#}",
rpc, rpc,
@ -226,7 +241,7 @@ async fn check_rpc(
Err(anyhow!( Err(anyhow!(
"empty result during check_rpc from {}: {:#}", "empty result during check_rpc from {}: {:#}",
rpc, rpc,
json!(response) json!(response_json)
)) ))
} }
} }

View File

@ -97,7 +97,7 @@ impl SentrydSubCommand {
.or_else(|| top_config.map(|x| x.app.chain_id)) .or_else(|| top_config.map(|x| x.app.chain_id))
.context("--config or --chain-id required")?; .context("--config or --chain-id required")?;
let web3_proxy = self.web3_proxy.trim_end_matches("/").to_string(); let primary_proxy = self.web3_proxy.trim_end_matches("/").to_string();
let other_proxy: Vec<_> = self let other_proxy: Vec<_> = self
.other_proxy .other_proxy
@ -166,7 +166,7 @@ impl SentrydSubCommand {
// check the main rpc's /health endpoint // check the main rpc's /health endpoint
{ {
let url = format!("{}/health", web3_proxy); let url = format!("{}/health", primary_proxy);
let error_sender = error_sender.clone(); let error_sender = error_sender.clone();
// TODO: what timeout? // TODO: what timeout?
@ -212,7 +212,7 @@ impl SentrydSubCommand {
{ {
let max_age = self.max_age; let max_age = self.max_age;
let max_lag = self.max_lag; let max_lag = self.max_lag;
let rpc = self.web3_proxy.clone(); let primary_proxy = primary_proxy.clone();
let error_sender = error_sender.clone(); let error_sender = error_sender.clone();
let mut others = other_proxy.clone(); let mut others = other_proxy.clone();
@ -225,7 +225,13 @@ impl SentrydSubCommand {
log::Level::Error, log::Level::Error,
error_sender, error_sender,
move |error_builder| { move |error_builder| {
compare::main(error_builder, rpc.clone(), others.clone(), max_age, max_lag) compare::main(
error_builder,
primary_proxy.clone(),
others.clone(),
max_age,
max_lag,
)
}, },
); );