Skip to content

Commit ca604cf

Browse files
author
Naohiro Yoshida
committed
add performance test tool
Signed-off-by: Naohiro Yoshida <naohiro.yoshida@datachain.jp>
1 parent e8afc4d commit ca604cf

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

server/tests/perf.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use alloy_primitives::B256;
2+
use optimism_preimage_maker::l2_client::L2Client;
3+
use optimism_preimage_maker::Request;
4+
use serial_test::serial;
5+
use std::env;
6+
use std::time::Instant;
7+
use tokio::time;
8+
use tracing_subscriber::filter;
9+
use tracing_subscriber::layer::SubscriberExt;
10+
use tracing_subscriber::util::SubscriberInitExt;
11+
12+
fn init() {
13+
let filter = filter::EnvFilter::from_default_env().add_directive("info".parse().unwrap());
14+
let _ = tracing_subscriber::registry()
15+
.with(tracing_subscriber::fmt::layer())
16+
.with(filter)
17+
.try_init();
18+
}
19+
fn get_l2_client() -> L2Client {
20+
let op_node_addr = env::var("L2_ROLLUP").unwrap();
21+
let op_geth_addr = env::var("L2_GETH").unwrap();
22+
tracing::info!(
23+
"Starting with op_node_addr: {} op_geth_addr: {}",
24+
op_node_addr,
25+
op_geth_addr
26+
);
27+
L2Client::new(op_node_addr, op_geth_addr)
28+
}
29+
30+
async fn get_latest_derivation(l2_client: &L2Client) -> (B256, u64) {
31+
let sync_status = l2_client.sync_status().await.unwrap();
32+
(
33+
sync_status.finalized_l1.hash,
34+
sync_status.finalized_l2.number,
35+
)
36+
}
37+
38+
#[serial]
39+
#[tokio::test(flavor = "multi_thread")]
40+
#[ignore] // Ignored because it's a performance test, not a unit test
41+
async fn run_parallel() {
42+
let server_url = format!("{}/derivation", env::var("SERVER_URL").unwrap());
43+
let parallel: u64 = env::var("TASKS")
44+
.unwrap_or("1".to_string())
45+
.parse()
46+
.unwrap();
47+
init();
48+
let l2_client = get_l2_client();
49+
let mut last_claimed: Option<u64> = None;
50+
const MAX_BLOCK_NUMS_PER_CALL: u64 = 60;
51+
loop {
52+
time::sleep(time::Duration::from_secs(10)).await;
53+
let (l1_head, claiming_l2) = get_latest_derivation(&l2_client).await;
54+
if let Some(last_block) = last_claimed {
55+
if claiming_l2 == last_block {
56+
continue;
57+
}
58+
}
59+
last_claimed = Some(claiming_l2);
60+
61+
let mut requests = vec![];
62+
for i in 0..parallel {
63+
let claiming_l2 = claiming_l2 - (i * MAX_BLOCK_NUMS_PER_CALL);
64+
let agreed_l2 = claiming_l2 - MAX_BLOCK_NUMS_PER_CALL;
65+
let agreed_output = l2_client.output_root_at(agreed_l2).await.unwrap();
66+
let claimed_output_root = l2_client.output_root_at(claiming_l2).await.unwrap();
67+
let request = Request {
68+
l1_head_hash: l1_head,
69+
agreed_l2_head_hash: agreed_output.block_ref.hash,
70+
agreed_l2_output_root: agreed_output.output_root,
71+
l2_output_root: claimed_output_root.output_root,
72+
l2_block_number: claiming_l2,
73+
};
74+
requests.push(request);
75+
}
76+
let mut tasks = vec![];
77+
for request in requests {
78+
let server_url = server_url.clone();
79+
let agreed_l2 = request.agreed_l2_head_hash;
80+
let task = tokio::spawn(async move {
81+
let request = request.clone();
82+
let client = reqwest::Client::new();
83+
let builder = client.post(server_url);
84+
let start = Instant::now();
85+
let preimage_bytes = builder.json(&request).send().await.unwrap();
86+
let elapsed = start.elapsed();
87+
let preimage_bytes = preimage_bytes.bytes().await.unwrap();
88+
tracing::info!(
89+
"{}-{},{},{}",
90+
request.l2_block_number,
91+
agreed_l2,
92+
elapsed.as_secs(),
93+
preimage_bytes.len()
94+
);
95+
});
96+
tasks.push(task);
97+
}
98+
for task in tasks {
99+
if let Err(e) = task.await {
100+
tracing::error!("Task failed: {:?}", e);
101+
}
102+
}
103+
}
104+
}

0 commit comments

Comments
 (0)