Skip to content

Commit fe6f675

Browse files
committed
Prefetch access list in parallel
1 parent 69e498f commit fe6f675

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
@@ -346,6 +346,72 @@ Result<std::vector<Receipt>> execute_block(
346346

347347
execute_block_header<traits>(chain, block_state, block.header);
348348

349+
auto const access_list_begin = std::chrono::steady_clock::now();
350+
{
351+
size_t count = 0;
352+
for (auto const &tx : block.transactions) {
353+
count += tx.access_list.size();
354+
}
355+
std::shared_ptr<boost::fibers::promise<void>[]> promises{
356+
new boost::fibers::promise<void>[count]};
357+
size_t i = 0;
358+
for (auto const &tx : block.transactions) {
359+
for (auto const &ae : tx.access_list) {
360+
MONAD_ASSERT(i < count);
361+
priority_pool.submit(
362+
i, [promises, i, addr = ae.a, &block_state]() {
363+
block_state.read_account(addr);
364+
promises[static_cast<std::ptrdiff_t>(i)].set_value();
365+
});
366+
++i;
367+
}
368+
}
369+
MONAD_ASSERT(i == count);
370+
block_metrics.set_access_list_addrs(count);
371+
for (size_t j = 0; j < count; ++j) {
372+
promises[static_cast<std::ptrdiff_t>(j)].get_future().wait();
373+
}
374+
}
375+
{
376+
size_t count = 0;
377+
for (auto const &tx : block.transactions) {
378+
for (auto const &ae : tx.access_list) {
379+
count += ae.keys.size();
380+
}
381+
}
382+
std::shared_ptr<boost::fibers::promise<void>[]> promises{
383+
new boost::fibers::promise<void>[count]};
384+
size_t i = 0;
385+
for (auto const &tx : block.transactions) {
386+
for (auto const &ae : tx.access_list) {
387+
Address const addr = ae.a;
388+
auto const account = block_state.read_account(addr);
389+
Incarnation const incarnation = account.has_value()
390+
? account->incarnation
391+
: Incarnation{0, 0};
392+
for (auto const &key : ae.keys) {
393+
MONAD_ASSERT(i < count);
394+
priority_pool.submit(
395+
i,
396+
[promises, i, addr, incarnation, key, &block_state]() {
397+
block_state.read_storage(addr, incarnation, key);
398+
promises[static_cast<std::ptrdiff_t>(i)]
399+
.set_value();
400+
});
401+
++i;
402+
}
403+
}
404+
}
405+
MONAD_ASSERT(i == count);
406+
block_metrics.set_access_list_keys(count);
407+
for (size_t j = 0; j < count; ++j) {
408+
promises[static_cast<std::ptrdiff_t>(j)].get_future().wait();
409+
}
410+
}
411+
block_metrics.set_access_list_time(
412+
std::chrono::duration_cast<std::chrono::microseconds>(
413+
std::chrono::steady_clock::now() - access_list_begin));
414+
349415
BOOST_OUTCOME_TRY(
350416
auto const retvals,
351417
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
@@ -183,6 +183,7 @@ Result<void> process_ethereum_block(
183183
LOG_INFO(
184184
"__exec_block,bl={:8},ts={}"
185185
",tx={:5},rt={:4},rtp={:5.2f}%"
186+
",ala={:3},alk={:4},alt={:>7}"
186187
",sr={:>7},txe={:>8},cmt={:>8},tot={:>8},tpse={:5},tps={:5}"
187188
",gas={:9},gpse={:4},gps={:3}{}{}{}",
188189
block.header.number,
@@ -193,6 +194,9 @@ Result<void> process_ethereum_block(
193194
block_metrics.num_retries(),
194195
100.0 * (double)block_metrics.num_retries() /
195196
std::max(1.0, (double)block.transactions.size()),
197+
block_metrics.access_list_addrs(),
198+
block_metrics.access_list_keys(),
199+
block_metrics.access_list_time(),
196200
sender_recovery_time,
197201
block_metrics.tx_exec_time(),
198202
commit_time,

cmd/monad/runloop_monad.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ Result<BlockExecOutput> propose_block(
326326
LOG_INFO(
327327
"__exec_block,bl={:8},id={},ts={}"
328328
",tx={:5},rt={:4},rtp={:5.2f}%"
329+
",ala={:3},alk={:4},alt={:>7}"
329330
",sr={:>7},txe={:>8},cmt={:>8},tot={:>8},tpse={:5},tps={:5}"
330331
",gas={:9},gpse={:4},gps={:3}{}{}{}",
331332
block.header.number,
@@ -337,6 +338,9 @@ Result<BlockExecOutput> propose_block(
337338
block_metrics.num_retries(),
338339
100.0 * (double)block_metrics.num_retries() /
339340
std::max(1.0, (double)block.transactions.size()),
341+
block_metrics.access_list_addrs(),
342+
block_metrics.access_list_keys(),
343+
block_metrics.access_list_time(),
340344
sender_recovery_time,
341345
block_metrics.tx_exec_time(),
342346
commit_time,

0 commit comments

Comments
 (0)