remove arbitrary sleep timer

This commit is contained in:
Bryan Stitt 2023-03-01 20:56:00 +00:00
parent a6d3ff61f1
commit 2e9803de72
2 changed files with 39 additions and 30 deletions

@ -128,6 +128,7 @@ impl Web3Rpcs {
if sender.send(()).is_err() { if sender.send(()).is_err() {
// errors are okay. they mean that all receivers have been dropped, or the rpcs just haven't started yet // errors are okay. they mean that all receivers have been dropped, or the rpcs just haven't started yet
// TODO: i'm seeing this error a lot more than expected
trace!("no http receivers"); trace!("no http receivers");
}; };
} }
@ -548,6 +549,11 @@ impl Web3Rpcs {
.unwrap_or(false) .unwrap_or(false)
{ {
// server does not have the max block // server does not have the max block
trace!(
"{} does not have the max block ({:?})",
x,
max_block_needed
);
false false
} else { } else {
!min_block_needed !min_block_needed
@ -573,7 +579,7 @@ impl Web3Rpcs {
if let Some(min_block_age) = min_block_age { if let Some(min_block_age) = min_block_age {
if x_head.age() > min_block_age { if x_head.age() > min_block_age {
// rpc is still syncing // rpc is still syncing
trace!("block is too old"); trace!("server's block is too old");
continue; continue;
} }
} }
@ -818,9 +824,7 @@ impl Web3Rpcs {
// TODO: maximum retries? right now its the total number of servers // TODO: maximum retries? right now its the total number of servers
loop { loop {
let num_skipped = skip_rpcs.len(); if skip_rpcs.len() >= self.by_name.read().len() {
if num_skipped >= self.by_name.read().len() {
break; break;
} }
@ -997,29 +1001,26 @@ impl Web3Rpcs {
let num_skipped = skip_rpcs.len(); let num_skipped = skip_rpcs.len();
if num_skipped == 0 { if num_skipped == 0 {
error!("No servers synced ({} known). None skipped", num_conns); error!(
"No servers synced ({:?}-{:?}) ({} known). None skipped",
// TODO: what error code? min_block_needed, max_block_needed, num_conns
Ok(JsonRpcForwardedResponse::from_str( );
"No servers synced", debug!("{}", serde_json::to_string(&request).unwrap());
Some(-32000),
Some(request.id),
))
} else { } else {
// TODO: warn? debug? trace? // TODO: warn? debug? trace?
warn!( warn!(
"Requested data was not available on {}/{} servers", "Requested data was not available on {}/{} servers",
num_skipped, num_conns num_skipped, num_conns
); );
// TODO: what error code?
// cloudflare gives {"jsonrpc":"2.0","error":{"code":-32043,"message":"Requested data cannot be older than 128 blocks."},"id":1}
Ok(JsonRpcForwardedResponse::from_str(
"Requested data is not available",
Some(-32043),
Some(request.id),
))
} }
// TODO: what error code?
// cloudflare gives {"jsonrpc":"2.0","error":{"code":-32043,"message":"Requested data cannot be older than 128 blocks."},"id":1}
Ok(JsonRpcForwardedResponse::from_str(
"Requested data is not available",
Some(-32043),
Some(request.id),
))
} }
/// be sure there is a timeout on this or it might loop forever /// be sure there is a timeout on this or it might loop forever
@ -1035,6 +1036,8 @@ impl Web3Rpcs {
max_count: Option<usize>, max_count: Option<usize>,
always_include_backups: bool, always_include_backups: bool,
) -> anyhow::Result<JsonRpcForwardedResponse> { ) -> anyhow::Result<JsonRpcForwardedResponse> {
let mut watch_consensus_rpcs = self.watch_consensus_rpcs_sender.subscribe();
loop { loop {
match self match self
.all_connections( .all_connections(
@ -1083,18 +1086,19 @@ impl Web3Rpcs {
.await; .await;
} }
Err(None) => { Err(None) => {
warn!("No servers in sync on {:?}! Retrying", self); warn!(
"No servers in sync on {:?} (block {:?} - {:?})! Retrying",
self, min_block_needed, max_block_needed
);
if let Some(request_metadata) = &request_metadata { if let Some(request_metadata) = &request_metadata {
// TODO: if this times out, i think we drop this
request_metadata.no_servers.fetch_add(1, Ordering::Release); request_metadata.no_servers.fetch_add(1, Ordering::Release);
} }
// TODO: i don't think this will ever happen watch_consensus_rpcs.changed().await?;
// TODO: return a 502? if it does?
// return Err(anyhow::anyhow!("no available rpcs!")); watch_consensus_rpcs.borrow_and_update();
// TODO: sleep how long?
// TODO: subscribe to something in ConsensusConnections instead
sleep(Duration::from_millis(200)).await;
continue; continue;
} }
@ -1108,7 +1112,12 @@ impl Web3Rpcs {
request_metadata.no_servers.fetch_add(1, Ordering::Release); request_metadata.no_servers.fetch_add(1, Ordering::Release);
} }
sleep_until(retry_at).await; tokio::select! {
_ = sleep_until(retry_at) => {}
_ = watch_consensus_rpcs.changed() => {
watch_consensus_rpcs.borrow_and_update();
}
}
continue; continue;
} }

@ -697,10 +697,10 @@ impl Web3Rpc {
}; };
loop { loop {
let http_interval_receiver = http_interval_sender.as_ref().map(|x| x.subscribe());
let mut futures = vec![]; let mut futures = vec![];
let http_interval_receiver = http_interval_sender.as_ref().map(|x| x.subscribe());
{ {
// TODO: move this into a proper function // TODO: move this into a proper function
let authorization = authorization.clone(); let authorization = authorization.clone();