get rid of async recursion

This commit is contained in:
Bryan Stitt 2023-10-10 23:32:50 -07:00
parent 6ccdb9e0cd
commit a9d5006ced
4 changed files with 21 additions and 41 deletions

12
Cargo.lock generated

@ -235,17 +235,6 @@ dependencies = [
"event-listener",
]
[[package]]
name = "async-recursion"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.38",
]
[[package]]
name = "async-stream"
version = "0.3.5"
@ -6595,7 +6584,6 @@ dependencies = [
"anyhow",
"arc-swap",
"argh",
"async-recursion",
"async-stream",
"async-stripe",
"async-trait",

@ -40,7 +40,6 @@ siwe = { git = "https://github.com/llamanodes/siwe-rs", branch = "for_web3_proxy
anyhow = { version = "1.0.75", features = ["backtrace"] }
arc-swap = { version = "1.6.0" }
argh = "0.1.12"
async-recursion = "1.0.5"
async-stream = "0.3.5"
async-stripe = { version = "0.25.2", default-features = false, features = ["billing", "checkout", "connect", "runtime-tokio-hyper-rustls", "webhook-events"], optional = true }
async-trait = "0.1.73"

@ -1,6 +1,4 @@
//! Helper functions for turning ether's BlockNumber into numbers and updating incoming queries to match.
use std::time::Duration;
use crate::app::Web3ProxyApp;
use crate::jsonrpc::JsonRpcRequest;
use crate::{
@ -8,7 +6,6 @@ use crate::{
rpcs::blockchain::Web3ProxyBlock,
};
use anyhow::Context;
use async_recursion::async_recursion;
use derive_more::From;
use ethers::{
prelude::{BlockNumber, U64},
@ -68,7 +65,6 @@ impl From<&Web3ProxyBlock> for BlockNumAndHash {
/// modify params to always have a block hash and not "latest"
/// TODO: it would be nice to replace "latest" with the hash, but not all methods support that
#[async_recursion]
pub async fn clean_block_number<'a>(
params: &'a mut serde_json::Value,
block_param_id: usize,
@ -109,7 +105,8 @@ pub async fn clean_block_number<'a>(
} else if let Some(app) = app {
let block = app
.balanced_rpcs
.block(&block_hash, None, None)
.blocks_by_hash
.get(&block_hash)
.await
.context("fetching block number from hash")?;
@ -142,7 +139,8 @@ pub async fn clean_block_number<'a>(
// TODO: what should this max_wait be?
let block = app
.balanced_rpcs
.block(&block_hash, None, Some(Duration::from_secs(3)))
.blocks_by_hash
.get(&block_hash)
.await
.context("fetching block number from hash")?;
@ -173,15 +171,18 @@ pub async fn clean_block_number<'a>(
if block_num == head_block_num {
(head_block.into(), changed)
} else if let Some(app) = app {
// TODO: we used to make a query here, but thats causing problems with recursion now. come back to this
let block_hash = app
.balanced_rpcs
.block_hash(&block_num)
.blocks_by_number
.get(&block_num)
.await
.context("fetching block hash from number")?;
let block = app
.balanced_rpcs
.block(&block_hash, None, None)
.blocks_by_hash
.get(&block_hash)
.await
.context("fetching block from hash")?;
@ -269,17 +270,8 @@ impl CacheMode {
warn!(
method = %request.method,
params = ?request.params,
"no servers available to get block from params. caching with head block"
"no servers available to get block from params but head block known. caching with head block"
);
if let Some(head_block) = head_block {
// TODO: strange to get NoBlocksKnown **and** have a head block. think about this more
CacheMode::Standard {
block: head_block.into(),
cache_errors: true,
}
} else {
CacheMode::Never
}
}
Err(err) => {
error!(
@ -288,16 +280,17 @@ impl CacheMode {
?err,
"could not get block from params. caching with head block"
);
if let Some(head_block) = head_block {
CacheMode::Standard {
block: head_block.into(),
cache_errors: true,
}
} else {
CacheMode::Never
}
}
}
if let Some(head_block) = head_block {
CacheMode::Standard {
block: head_block.into(),
cache_errors: true,
}
} else {
CacheMode::Never
}
}
pub async fn try_new(

@ -50,9 +50,9 @@ pub struct Web3Rpcs {
/// TODO: this map is going to grow forever unless we do some sort of pruning. maybe store pruned in redis?
/// all blocks, including uncles
/// TODO: i think uncles should be excluded
pub(super) blocks_by_hash: BlocksByHashCache,
pub(crate) blocks_by_hash: BlocksByHashCache,
/// blocks on the heaviest chain
pub(super) blocks_by_number: BlocksByNumberCache,
pub(crate) blocks_by_number: BlocksByNumberCache,
/// the number of rpcs required to agree on consensus for the head block (thundering herd protection)
pub(super) min_synced_rpcs: usize,
/// the soft limit required to agree on consensus for the head block. (thundering herd protection)