Skip to content

Commit 917ec1c

Browse files
committed
Merge CacheNode and Node back to single class
Remove using next pointers in rodb cache, always use cache, since using a shared ptr can keep nodes that should be recycled.
1 parent f627ad1 commit 917ec1c

18 files changed

+223
-388
lines changed

category/execution/ethereum/db/trie_rodb.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class TrieRODb final : public ::monad::Db
3434
{
3535
::monad::mpt::RODb &db_;
3636
uint64_t block_number_;
37-
::monad::mpt::CacheNodeCursor prefix_cursor_;
37+
::monad::mpt::NodeCursor prefix_cursor_;
3838

3939
public:
4040
explicit TrieRODb(mpt::RODb &db)

category/mpt/db.cpp

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,8 @@ struct OnDiskWithWorkerThreadImpl
376376

377377
struct RODbFiberFindOwningNodeRequest
378378
{
379-
threadsafe_boost_fibers_promise<find_result_type<CacheNodeCursor>>
380-
*promise;
381-
CacheNodeCursor start;
379+
threadsafe_boost_fibers_promise<find_result_type<NodeCursor>> *promise;
380+
NodeCursor start;
382381
NibblesView key;
383382
uint64_t version;
384383
};
@@ -976,8 +975,7 @@ struct RODb::Impl final : public OnDiskWithWorkerThreadImpl
976975
}
977976

978977
find_owning_cursor_result_type find_fiber_blocking(
979-
CacheNodeCursor const &start, NibblesView const &key,
980-
uint64_t const version)
978+
NodeCursor const &start, NibblesView const &key, uint64_t const version)
981979
{
982980
threadsafe_boost_fibers_promise<find_owning_cursor_result_type> promise;
983981
RODbFiberFindOwningNodeRequest req{
@@ -995,7 +993,7 @@ struct RODb::Impl final : public OnDiskWithWorkerThreadImpl
995993
return fut.get();
996994
}
997995

998-
CacheNodeCursor load_root_fiber_blocking(uint64_t version)
996+
NodeCursor load_root_fiber_blocking(uint64_t version)
999997
{
1000998
auto const root_offset = aux().get_root_offset_at_version(version);
1001999
if (root_offset == INVALID_OFFSET) {
@@ -1068,8 +1066,8 @@ DbError find_result_to_db_error(find_result const result) noexcept
10681066
}
10691067
}
10701068

1071-
Result<CacheNodeCursor> RODb::find(
1072-
CacheNodeCursor const &node_cursor, NibblesView const key,
1069+
Result<NodeCursor> RODb::find(
1070+
NodeCursor const &node_cursor, NibblesView const key,
10731071
uint64_t const block_id) const
10741072
{
10751073
MONAD_ASSERT(impl_);
@@ -1089,25 +1087,22 @@ Result<CacheNodeCursor> RODb::find(
10891087
return cursor;
10901088
}
10911089

1092-
Result<CacheNodeCursor>
1090+
Result<NodeCursor>
10931091
RODb::find(NibblesView const key, uint64_t const block_id) const
10941092
{
10951093
MONAD_ASSERT(impl_);
1096-
CacheNodeCursor cursor = impl_->load_root_fiber_blocking(block_id);
1094+
NodeCursor cursor = impl_->load_root_fiber_blocking(block_id);
10971095
return find(cursor, key, block_id);
10981096
}
10991097

11001098
bool RODb::traverse(
1101-
CacheNodeCursor const &cursor, TraverseMachine &machine,
1102-
uint64_t const block_id, size_t const concurrency_limit)
1099+
NodeCursor const &cursor, TraverseMachine &machine, uint64_t const block_id,
1100+
size_t const concurrency_limit)
11031101
{
11041102
MONAD_ASSERT(impl_);
11051103
MONAD_ASSERT(cursor.is_valid());
11061104
return impl_->traverse_fiber_blocking(
1107-
copy_node<Node>(cursor.node.get()),
1108-
machine,
1109-
block_id,
1110-
concurrency_limit);
1105+
copy_node(cursor.node.get()), machine, block_id, concurrency_limit);
11111106
}
11121107

11131108
Db::Db(StateMachine &machine)
@@ -1394,13 +1389,12 @@ namespace detail
13941389
auto it = inflights.find(sender->block_id);
13951390
auto pendings = std::move(it->second);
13961391
inflights.erase(it);
1397-
std::shared_ptr<CacheNode> root{};
1392+
std::shared_ptr<Node> root{};
13981393
bool const block_alive_after_read =
13991394
sender->context.aux.version_is_valid_ondisk(sender->block_id);
14001395
if (block_alive_after_read) {
1401-
sender->root =
1402-
detail::deserialize_node_from_receiver_result<CacheNode>(
1403-
std::move(buffer_), buffer_off, io_state);
1396+
sender->root = detail::deserialize_node_from_receiver_result(
1397+
std::move(buffer_), buffer_off, io_state);
14041398
root = sender->root;
14051399
sender->res_root = {{sender->root}, find_result::success};
14061400
auto virt_offset =
@@ -1477,7 +1471,7 @@ namespace detail
14771471
return async::success();
14781472
}
14791473

1480-
auto cont = [this, io_state](std::shared_ptr<CacheNode> root_) {
1474+
auto cont = [this, io_state](std::shared_ptr<Node> root_) {
14811475
if (!root_) {
14821476
res_root = {{}, find_result::version_no_longer_exist};
14831477
}
@@ -1569,7 +1563,7 @@ namespace detail
15691563
}
15701564

15711565
template struct DbGetSender<byte_string>;
1572-
template struct DbGetSender<std::shared_ptr<CacheNode>>;
1566+
template struct DbGetSender<std::shared_ptr<Node>>;
15731567
}
15741568

15751569
MONAD_MPT_NAMESPACE_END

category/mpt/db.hpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ class RODb
6868
RODb &operator=(RODb const &) = delete;
6969
RODb &operator=(RODb &&) = delete;
7070

71-
Result<CacheNodeCursor>
72-
find(CacheNodeCursor const &, NibblesView, uint64_t block_id) const;
73-
Result<CacheNodeCursor> find(NibblesView prefix, uint64_t block_id) const;
71+
Result<NodeCursor>
72+
find(NodeCursor const &, NibblesView, uint64_t block_id) const;
73+
Result<NodeCursor> find(NibblesView prefix, uint64_t block_id) const;
7474

7575
uint64_t get_latest_version() const;
7676
uint64_t get_earliest_version() const;
7777
bool traverse(
78-
CacheNodeCursor const &, TraverseMachine &, uint64_t block_id,
78+
NodeCursor const &, TraverseMachine &, uint64_t block_id,
7979
size_t concurrency_limit = 4096);
8080
};
8181

@@ -169,7 +169,7 @@ class Db
169169
struct AsyncContext
170170
{
171171
using inflight_root_t = ankerl::unordered_dense::segmented_map<
172-
uint64_t, std::vector<std::function<void(std::shared_ptr<CacheNode>)>>>;
172+
uint64_t, std::vector<std::function<void(std::shared_ptr<Node>)>>>;
173173

174174
UpdateAux<> &aux;
175175
NodeCache node_cache;
@@ -203,12 +203,12 @@ namespace detail
203203
op_get_node2
204204
} op_type;
205205

206-
std::shared_ptr<CacheNode> root;
207-
CacheNodeCursor cur;
206+
std::shared_ptr<Node> root;
207+
NodeCursor cur;
208208
Nibbles const nv;
209209
uint64_t const block_id;
210210

211-
find_result_type<CacheNodeCursor> res_root;
211+
find_result_type<NodeCursor> res_root;
212212
find_result_type<T> get_result;
213213

214214
constexpr DbGetSender(
@@ -219,21 +219,21 @@ namespace detail
219219
, nv(n)
220220
, block_id(block_id_)
221221
{
222-
if constexpr (std::same_as<T, std::shared_ptr<CacheNode>>) {
222+
if constexpr (std::same_as<T, std::shared_ptr<Node>>) {
223223
MONAD_ASSERT(op_type == op_t::op_get_node1);
224224
}
225225
}
226226

227227
constexpr DbGetSender(
228-
AsyncContext &context_, op_t const op_type_, CacheNodeCursor cur_,
228+
AsyncContext &context_, op_t const op_type_, NodeCursor cur_,
229229
NibblesView const n, uint64_t const block_id_)
230230
: context(context_)
231231
, op_type(op_type_)
232232
, cur(cur_)
233233
, nv(n)
234234
, block_id(block_id_)
235235
{
236-
if constexpr (std::same_as<T, std::shared_ptr<CacheNode>>) {
236+
if constexpr (std::same_as<T, std::shared_ptr<Node>>) {
237237
MONAD_ASSERT(op_type == op_t::op_get_node1);
238238
}
239239
}
@@ -283,13 +283,13 @@ inline detail::DbGetSender<byte_string> make_get_data_sender(
283283
block_id};
284284
}
285285

286-
inline detail::DbGetSender<std::shared_ptr<CacheNode>> make_get_node_sender(
286+
inline detail::DbGetSender<std::shared_ptr<Node>> make_get_node_sender(
287287
AsyncContext *const context, NibblesView const nv, uint64_t const block_id)
288288
{
289289
MONAD_ASSERT(context);
290290
return {
291291
*context,
292-
detail::DbGetSender<std::shared_ptr<CacheNode>>::op_t::op_get_node1,
292+
detail::DbGetSender<std::shared_ptr<Node>>::op_t::op_get_node1,
293293
nv,
294294
block_id};
295295
}

category/mpt/deserialize_node_from_receiver_result.hpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,36 +37,36 @@ namespace detail
3737
[[likely]] if (
3838
bytes_to_read <= MONAD_ASYNC_NAMESPACE::AsyncIO::READ_BUFFER_SIZE) {
3939
read_short_update_sender sender(receiver);
40-
auto iostate = io.make_connected(
41-
std::move(sender), std::forward<Receiver>(receiver));
40+
auto iostate =
41+
io.make_connected(std::move(sender), std::move(receiver));
4242
iostate->initiate();
4343
iostate.release();
4444
}
4545
else {
4646
read_long_update_sender sender(receiver);
47-
using connected_type = decltype(connect(
48-
io, std::move(sender), std::forward<Receiver>(receiver)));
49-
auto *iostate = new connected_type(connect(
50-
io, std::move(sender), std::forward<Receiver>(receiver)));
47+
using connected_type =
48+
decltype(connect(io, std::move(sender), std::move(receiver)));
49+
auto *iostate = new connected_type(
50+
connect(io, std::move(sender), std::move(receiver)));
5151
iostate->initiate();
5252
// drop iostate
5353
}
5454
}
5555

56-
template <class NodeType, class ResultType>
57-
inline NodeType::SharedPtr deserialize_node_from_receiver_result(
56+
template <class ResultType>
57+
inline Node::SharedPtr deserialize_node_from_receiver_result(
5858
ResultType buffer_, uint16_t buffer_off,
5959
MONAD_ASYNC_NAMESPACE::erased_connected_operation *io_state)
6060
{
6161
MONAD_ASSERT(buffer_);
62-
typename NodeType::SharedPtr node;
62+
Node::SharedPtr node;
6363
if constexpr (std::is_same_v<
6464
std::decay_t<ResultType>,
6565
typename monad::async::read_single_buffer_sender::
6666
result_type>) {
6767
auto &buffer = std::move(buffer_).assume_value().get();
6868
MONAD_ASSERT(buffer.size() > buffer_off);
69-
node = deserialize_node_from_buffer<NodeType>(
69+
node = deserialize_node_from_buffer(
7070
(unsigned char *)buffer.data() + buffer_off,
7171
buffer.size() - buffer_off);
7272
buffer.reset();
@@ -78,11 +78,11 @@ namespace detail
7878
// Comes from read_long_update_sender which always allocates single
7979
// buffer.
8080
MONAD_ASSERT(buffer_.assume_value().size() == 1);
81-
auto const &buffer = buffer_.assume_value().front();
81+
auto &buffer = buffer_.assume_value().front();
8282
MONAD_ASSERT(buffer.size() > buffer_off);
8383
// Did the Receiver forget to set lifetime_managed_internally?
8484
MONAD_DEBUG_ASSERT(io_state->lifetime_is_managed_internally());
85-
node = deserialize_node_from_buffer<NodeType>(
85+
node = deserialize_node_from_buffer(
8686
(unsigned char *)buffer.data() + buffer_off,
8787
buffer.size() - buffer_off);
8888
}

0 commit comments

Comments
 (0)