Skip to content

Commit 8c02c30

Browse files
committed
Prefetch access list in parallel
1 parent a7038d6 commit 8c02c30

File tree

4 files changed

+107
-0
lines changed

4 files changed

+107
-0
lines changed

category/execution/ethereum/execute_block.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,72 @@ Result<std::vector<Receipt>> execute_block(
344344

345345
execute_block_header<traits>(chain, block_state, block.header);
346346

347+
auto const access_list_begin = std::chrono::steady_clock::now();
348+
{
349+
size_t count = 0;
350+
for (auto const &tx : block.transactions) {
351+
count += tx.access_list.size();
352+
}
353+
std::shared_ptr<boost::fibers::promise<void>[]> promises{
354+
new boost::fibers::promise<void>[count]};
355+
size_t i = 0;
356+
for (auto const &tx : block.transactions) {
357+
for (auto const &ae : tx.access_list) {
358+
MONAD_ASSERT(i < count);
359+
priority_pool.submit(
360+
i, [promises, i, addr = ae.a, &block_state]() {
361+
block_state.read_account(addr);
362+
promises[static_cast<std::ptrdiff_t>(i)].set_value();
363+
});
364+
++i;
365+
}
366+
}
367+
MONAD_ASSERT(i == count);
368+
block_metrics.set_access_list_addrs(count);
369+
for (size_t j = 0; j < count; ++j) {
370+
promises[static_cast<std::ptrdiff_t>(j)].get_future().wait();
371+
}
372+
}
373+
{
374+
size_t count = 0;
375+
for (auto const &tx : block.transactions) {
376+
for (auto const &ae : tx.access_list) {
377+
count += ae.keys.size();
378+
}
379+
}
380+
std::shared_ptr<boost::fibers::promise<void>[]> promises{
381+
new boost::fibers::promise<void>[count]};
382+
size_t i = 0;
383+
for (auto const &tx : block.transactions) {
384+
for (auto const &ae : tx.access_list) {
385+
Address const addr = ae.a;
386+
auto const account = block_state.read_account(addr);
387+
Incarnation const incarnation = account.has_value()
388+
? account->incarnation
389+
: Incarnation{0, 0};
390+
for (auto const &key : ae.keys) {
391+
MONAD_ASSERT(i < count);
392+
priority_pool.submit(
393+
i,
394+
[promises, i, addr, incarnation, key, &block_state]() {
395+
block_state.read_storage(addr, incarnation, key);
396+
promises[static_cast<std::ptrdiff_t>(i)]
397+
.set_value();
398+
});
399+
++i;
400+
}
401+
}
402+
}
403+
MONAD_ASSERT(i == count);
404+
block_metrics.set_access_list_keys(count);
405+
for (size_t j = 0; j < count; ++j) {
406+
promises[static_cast<std::ptrdiff_t>(j)].get_future().wait();
407+
}
408+
}
409+
block_metrics.set_access_list_time(
410+
std::chrono::duration_cast<std::chrono::microseconds>(
411+
std::chrono::steady_clock::now() - access_list_begin));
412+
347413
BOOST_OUTCOME_TRY(
348414
auto const retvals,
349415
execute_block_transactions<traits>(

category/execution/ethereum/metrics/block_metrics.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ class BlockMetrics
2525
{
2626
uint32_t n_retries_{0};
2727
std::chrono::microseconds tx_exec_time_{1};
28+
std::chrono::microseconds access_list_time_{1};
29+
size_t n_access_list_addrs_{0};
30+
size_t n_access_list_keys_{0};
2831

2932
public:
3033
void inc_retries()
@@ -42,10 +45,40 @@ class BlockMetrics
4245
tx_exec_time_ = exec_time;
4346
}
4447

48+
void set_access_list_time(std::chrono::microseconds const access_list_time)
49+
{
50+
access_list_time_ = access_list_time;
51+
}
52+
53+
void set_access_list_addrs(size_t const count)
54+
{
55+
n_access_list_addrs_ = count;
56+
}
57+
58+
void set_access_list_keys(size_t const count)
59+
{
60+
n_access_list_keys_ = count;
61+
}
62+
4563
std::chrono::microseconds tx_exec_time() const
4664
{
4765
return tx_exec_time_;
4866
}
67+
68+
std::chrono::microseconds access_list_time() const
69+
{
70+
return access_list_time_;
71+
}
72+
73+
size_t access_list_addrs() const
74+
{
75+
return n_access_list_addrs_;
76+
}
77+
78+
size_t access_list_keys() const
79+
{
80+
return n_access_list_keys_;
81+
}
4982
};
5083

5184
MONAD_NAMESPACE_END

cmd/monad/runloop_ethereum.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ Result<void> process_ethereum_block(
188188
LOG_INFO(
189189
"__exec_block,bl={:8},ts={}"
190190
",tx={:5},rt={:4},rtp={:5.2f}%"
191+
",ala={:3},alk={:4},alt={:>7}"
191192
",sr={:>7},txe={:>8},cmt={:>8},tot={:>8},tpse={:5},tps={:5}"
192193
",gas={:9},gpse={:4},gps={:3}{}{}{}",
193194
block.header.number,
@@ -198,6 +199,9 @@ Result<void> process_ethereum_block(
198199
block_metrics.num_retries(),
199200
100.0 * (double)block_metrics.num_retries() /
200201
std::max(1.0, (double)block.transactions.size()),
202+
block_metrics.access_list_addrs(),
203+
block_metrics.access_list_keys(),
204+
block_metrics.access_list_time(),
201205
sender_recovery_time,
202206
block_metrics.tx_exec_time(),
203207
commit_time,

cmd/monad/runloop_monad.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ Result<BlockExecOutput> propose_block(
334334
LOG_INFO(
335335
"__exec_block,bl={:8},id={},ts={}"
336336
",tx={:5},rt={:4},rtp={:5.2f}%"
337+
",ala={:3},alk={:4},alt={:>7}"
337338
",sr={:>7},txe={:>8},cmt={:>8},tot={:>8},tpse={:5},tps={:5}"
338339
",gas={:9},gpse={:4},gps={:3}{}{}{}",
339340
block.header.number,
@@ -345,6 +346,9 @@ Result<BlockExecOutput> propose_block(
345346
block_metrics.num_retries(),
346347
100.0 * (double)block_metrics.num_retries() /
347348
std::max(1.0, (double)block.transactions.size()),
349+
block_metrics.access_list_addrs(),
350+
block_metrics.access_list_keys(),
351+
block_metrics.access_list_time(),
348352
sender_recovery_time,
349353
block_metrics.tx_exec_time(),
350354
commit_time,

0 commit comments

Comments
 (0)