From c6ac2e2445b647c27f69edf48396146ba829c8fe Mon Sep 17 00:00:00 2001 From: clemahieu Date: Tue, 7 Aug 2018 14:35:20 +0100 Subject: [PATCH] Attach epoch to mdb_val since the block store needs to encode this information anyway. This cleans up a lot of call-site logic to figure out epoch of account_info and pending_info. --- rai/core_test/block_store.cpp | 8 ++-- rai/node/bootstrap.cpp | 4 +- rai/node/rpc.cpp | 16 ++++---- rai/node/testing.cpp | 2 +- rai/node/wallet.cpp | 2 +- rai/qt/qt.cpp | 2 +- rai/rai_node/entry.cpp | 2 +- rai/secure/blockstore.cpp | 70 ++++++++++++++++++++--------------- rai/secure/blockstore.hpp | 6 +-- rai/secure/common.cpp | 18 +++++---- rai/secure/common.hpp | 15 +------- rai/secure/ledger.cpp | 4 +- rai/secure/utility.cpp | 10 +++-- rai/secure/utility.hpp | 16 +++++++- 14 files changed, 95 insertions(+), 80 deletions(-) diff --git a/rai/core_test/block_store.cpp b/rai/core_test/block_store.cpp index 83fc4bd7..4101eede 100644 --- a/rai/core_test/block_store.cpp +++ b/rai/core_test/block_store.cpp @@ -134,7 +134,7 @@ TEST (block_store, pending_iterator) rai::pending_key key1 (current->first); ASSERT_EQ (rai::account (1), key1.account); ASSERT_EQ (rai::block_hash (2), key1.hash); - rai::pending_info pending (current->second, current->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info pending (current->second); ASSERT_EQ (rai::account (2), pending.source); ASSERT_EQ (rai::amount (3), pending.amount); ASSERT_EQ (rai::epoch::epoch_1, pending.epoch); @@ -335,7 +335,7 @@ TEST (block_store, one_account) auto end (store.latest_end ()); ASSERT_NE (end, begin); ASSERT_EQ (account, begin->first.uint256 ()); - rai::account_info info (begin->second, begin->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (begin->second); ASSERT_EQ (hash, info.head); ASSERT_EQ (42, info.balance.number ()); ASSERT_EQ (100, info.modified); @@ -381,7 +381,7 @@ TEST (block_store, two_account) auto end (store.latest_end ()); ASSERT_NE (end, begin); ASSERT_EQ (account1, begin->first.uint256 ()); - rai::account_info info1 (begin->second, begin->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info1 (begin->second); ASSERT_EQ (hash1, info1.head); ASSERT_EQ (42, info1.balance.number ()); ASSERT_EQ (100, info1.modified); @@ -389,7 +389,7 @@ TEST (block_store, two_account) ++begin; ASSERT_NE (end, begin); ASSERT_EQ (account2, begin->first.uint256 ()); - rai::account_info info2 (begin->second, begin->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info2 (begin->second); ASSERT_EQ (hash2, info2.head); ASSERT_EQ (84, info2.balance.number ()); ASSERT_EQ (200, info2.modified); diff --git a/rai/node/bootstrap.cpp b/rai/node/bootstrap.cpp index 71afa26b..c8f96f42 100644 --- a/rai/node/bootstrap.cpp +++ b/rai/node/bootstrap.cpp @@ -358,7 +358,7 @@ void rai::frontier_req_client::next (MDB_txn * transaction_a) if (iterator != connection->node->store.latest_end ()) { current = rai::account (iterator->first.uint256 ()); - info = rai::account_info (iterator->second, iterator->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + info = rai::account_info (iterator->second); } else { @@ -2137,7 +2137,7 @@ void rai::frontier_req_server::next () if (iterator != connection->node->store.latest_end ()) { current = rai::uint256_union (iterator->first.uint256 ()); - info = rai::account_info (iterator->second, iterator->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + info = rai::account_info (iterator->second); } else { diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 04064737..f6a0b38c 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -782,7 +782,7 @@ void rai::rpc_handler::accounts_pending () } else { - rai::pending_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info info (i->second); if (info.amount.number () >= threshold.number ()) { if (source) @@ -1392,7 +1392,7 @@ void rai::rpc_handler::delegators () rai::transaction transaction (node.store.environment, nullptr, false); for (auto i (node.store.latest_begin (transaction)), n (node.store.latest_end ()); i != n; ++i) { - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); auto block (node.store.block_get (transaction, info.rep_block)); assert (block != nullptr); if (block->representative () == account) @@ -1416,7 +1416,7 @@ void rai::rpc_handler::delegators_count () rai::transaction transaction (node.store.environment, nullptr, false); for (auto i (node.store.latest_begin (transaction)), n (node.store.latest_end ()); i != n; ++i) { - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); auto block (node.store.block_get (transaction, info.rep_block)); assert (block != nullptr); if (block->representative () == account) @@ -1468,7 +1468,7 @@ void rai::rpc_handler::frontiers () rai::transaction transaction (node.store.environment, nullptr, false); for (auto i (node.store.latest_begin (transaction, start)), n (node.store.latest_end ()); i != n && frontiers.size () < count; ++i) { - frontiers.put (rai::account (i->first.uint256 ()).to_account (), rai::account_info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0).head.to_string ()); + frontiers.put (rai::account (i->first.uint256 ()).to_account (), rai::account_info (i->second).head.to_string ()); } response_l.add_child ("frontiers", frontiers); } @@ -1778,7 +1778,7 @@ void rai::rpc_handler::ledger () { for (auto i (node.store.latest_begin (transaction, start)), n (node.store.latest_end ()); i != n && accounts.size () < count; ++i) { - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); if (info.modified >= modified_since) { rai::account account (i->first.uint256 ()); @@ -1816,7 +1816,7 @@ void rai::rpc_handler::ledger () std::vector> ledger_l; for (auto i (node.store.latest_begin (transaction, start)), n (node.store.latest_end ()); i != n; ++i) { - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); rai::uint128_union balance (info.balance); if (info.modified >= modified_since) { @@ -1974,7 +1974,7 @@ void rai::rpc_handler::pending () } else { - rai::pending_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info info (i->second); if (info.amount.number () >= threshold.number ()) { if (source || min_version) @@ -3142,7 +3142,7 @@ void rai::rpc_handler::wallet_pending () } else { - rai::pending_info info (ii->second, ii->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info info (ii->second); if (info.amount.number () >= threshold.number ()) { if (source || min_version) diff --git a/rai/node/testing.cpp b/rai/node/testing.cpp index 6b6a6c0c..b77674a4 100644 --- a/rai/node/testing.cpp +++ b/rai/node/testing.cpp @@ -166,7 +166,7 @@ void rai::system::generate_receive (rai::node & node_a) if (i != node_a.store.pending_end ()) { rai::pending_key send_hash (i->first); - rai::pending_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info info (i->second); send_block = node_a.store.block_get (transaction, send_hash.hash); } } diff --git a/rai/node/wallet.cpp b/rai/node/wallet.cpp index f6016590..6ecbbd4d 100644 --- a/rai/node/wallet.cpp +++ b/rai/node/wallet.cpp @@ -1132,7 +1132,7 @@ bool rai::wallet::search_pending () { rai::pending_key key (j->first); auto hash (key.hash); - rai::pending_info pending (j->second, j->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::pending_info pending (j->second); auto amount (pending.amount.number ()); if (node.config.receive_minimum.number () <= amount) { diff --git a/rai/qt/qt.cpp b/rai/qt/qt.cpp index 5786d181..8a10f1f5 100644 --- a/rai/qt/qt.cpp +++ b/rai/qt/qt.cpp @@ -1857,7 +1857,7 @@ void rai_qt::advanced_actions::refresh_ledger () { QList items; items.push_back (new QStandardItem (QString (rai::block_hash (i->first.uint256 ()).to_account ().c_str ()))); - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); std::string balance; rai::amount (info.balance.number () / wallet.rendering_ratio).encode_dec (balance); items.push_back (new QStandardItem (QString (balance.c_str ()))); diff --git a/rai/rai_node/entry.cpp b/rai/rai_node/entry.cpp index f77e5d39..ae86e725 100644 --- a/rai/rai_node/entry.cpp +++ b/rai/rai_node/entry.cpp @@ -131,7 +131,7 @@ int main (int argc, char * const * argv) std::map calculated; for (auto i (node.node->store.latest_begin (transaction)), n (node.node->store.latest_end ()); i != n; ++i) { - rai::account_info info (i->second, i->from_secondary_store ? rai::epoch::epoch_1 : rai::epoch::epoch_0); + rai::account_info info (i->second); rai::block_hash rep_block (node.node->ledger.representative_calculated (transaction, info.head)); std::unique_ptr block (node.node->store.block_get (transaction, rep_block)); calculated[block->representative ()] += info.balance.number (); diff --git a/rai/secure/blockstore.cpp b/rai/secure/blockstore.cpp index 453ca8e2..fdc11987 100644 --- a/rai/secure/blockstore.cpp +++ b/rai/secure/blockstore.cpp @@ -60,9 +60,11 @@ std::pair * rai::store_iterator::operator-> () return ¤t; } -rai::store_iterator::store_iterator (MDB_txn * transaction_a, MDB_dbi db_a) : +rai::store_iterator::store_iterator (MDB_txn * transaction_a, MDB_dbi db_a, rai::epoch epoch_a) : cursor (nullptr) { + current.first.epoch = epoch_a; + current.second.epoch = epoch_a; auto status (mdb_cursor_open (transaction_a, db_a, &cursor)); assert (status == 0); auto status2 (mdb_cursor_get (cursor, ¤t.first.value, ¤t.second.value, MDB_FIRST)); @@ -83,9 +85,11 @@ cursor (nullptr) { } -rai::store_iterator::store_iterator (MDB_txn * transaction_a, MDB_dbi db_a, MDB_val const & val_a) : +rai::store_iterator::store_iterator (MDB_txn * transaction_a, MDB_dbi db_a, MDB_val const & val_a, rai::epoch epoch_a) : cursor (nullptr) { + current.first.epoch = epoch_a; + current.second.epoch = epoch_a; auto status (mdb_cursor_open (transaction_a, db_a, &cursor)); assert (status == 0); current.first.value = val_a; @@ -167,8 +171,8 @@ bool rai::store_iterator::operator!= (rai::store_iterator const & other_a) const void rai::store_iterator::clear () { - current.first = rai::mdb_val (); - current.second = rai::mdb_val (); + current.first = rai::mdb_val (current.first.epoch); + current.second = rai::mdb_val (current.second.epoch); } std::pair rai::store_merge_iterator::cursor_current () @@ -217,12 +221,18 @@ rai::merged_store_kv * rai::store_merge_iterator::operator-> () return cursor_current ().second; } +rai::merged_store_kv::merged_store_kv (rai::epoch epoch_a) : +first (epoch_a), +second (epoch_a) +{ +} + rai::store_merge_iterator::store_merge_iterator (MDB_txn * transaction_a, MDB_dbi db1_a, MDB_dbi db2_a) : cursor1 (nullptr), -cursor2 (nullptr) +cursor2 (nullptr), +current1 (rai::epoch::epoch_0), +current2 (rai::epoch::epoch_1) { - current1.from_secondary_store = false; - current2.from_secondary_store = true; auto status (mdb_cursor_open (transaction_a, db1_a, &cursor1)); assert (status == 0); status = mdb_cursor_get (cursor1, ¤t1.first.value, ¤t1.second.value, MDB_FIRST); @@ -234,8 +244,8 @@ cursor2 (nullptr) } else { - current1.first = rai::mdb_val (); - current1.second = rai::mdb_val (); + current1.first = rai::mdb_val (rai::epoch::epoch_0); + current1.second = rai::mdb_val (rai::epoch::epoch_1); } status = mdb_cursor_open (transaction_a, db2_a, &cursor2); assert (status == 0); @@ -248,25 +258,25 @@ cursor2 (nullptr) } else { - current2.first = rai::mdb_val (); - current2.second = rai::mdb_val (); + current2.first = rai::mdb_val (rai::epoch::epoch_0); + current2.second = rai::mdb_val (rai::epoch::epoch_1); } } rai::store_merge_iterator::store_merge_iterator (std::nullptr_t) : cursor1 (nullptr), -cursor2 (nullptr) +cursor2 (nullptr), +current1 (rai::epoch::epoch_0), +current2 (rai::epoch::epoch_1) { - current1.from_secondary_store = false; - current2.from_secondary_store = true; } rai::store_merge_iterator::store_merge_iterator (MDB_txn * transaction_a, MDB_dbi db1_a, MDB_dbi db2_a, MDB_val const & val_a) : cursor1 (nullptr), -cursor2 (nullptr) +cursor2 (nullptr), +current1 (rai::epoch::epoch_0), +current2 (rai::epoch::epoch_1) { - current1.from_secondary_store = false; - current2.from_secondary_store = true; auto status (mdb_cursor_open (transaction_a, db1_a, &cursor1)); assert (status == 0); current1.first.value = val_a; @@ -279,8 +289,8 @@ cursor2 (nullptr) } else { - current1.first = rai::mdb_val (); - current1.second = rai::mdb_val (); + current1.first = rai::mdb_val (rai::epoch::epoch_0); + current1.second = rai::mdb_val (rai::epoch::epoch_1); } status = mdb_cursor_open (transaction_a, db2_a, &cursor2); assert (status == 0); @@ -294,8 +304,8 @@ cursor2 (nullptr) } else { - current2.first = rai::mdb_val (); - current2.second = rai::mdb_val (); + current2.first = rai::mdb_val (rai::epoch::epoch_0); + current2.second = rai::mdb_val (rai::epoch::epoch_1); } } @@ -742,7 +752,7 @@ void rai::block_store::upgrade_v9_to_v10 (MDB_txn * transaction_a) version_put (transaction_a, 10); for (auto i (latest_v0_begin (transaction_a)), n (latest_v0_end ()); i != n; ++i) { - rai::account_info info (i->second, rai::epoch::epoch_0); + rai::account_info info (i->second); if (info.block_count >= block_info_max) { rai::account account (i->first.uint256 ()); @@ -1341,13 +1351,13 @@ bool rai::block_store::pending_get (MDB_txn * transaction_a, rai::pending_key co rai::store_iterator rai::block_store::pending_v0_begin (MDB_txn * transaction_a, rai::pending_key const & key_a) { - rai::store_iterator result (transaction_a, pending_v0, key_a.val ()); + rai::store_iterator result (transaction_a, pending_v0, key_a.val (), rai::epoch::epoch_0); return result; } rai::store_iterator rai::block_store::pending_v0_begin (MDB_txn * transaction_a) { - rai::store_iterator result (transaction_a, pending_v0); + rai::store_iterator result (transaction_a, pending_v0, rai::epoch::epoch_0); return result; } @@ -1359,13 +1369,13 @@ rai::store_iterator rai::block_store::pending_v0_end () rai::store_iterator rai::block_store::pending_v1_begin (MDB_txn * transaction_a, rai::pending_key const & key_a) { - rai::store_iterator result (transaction_a, pending_v1, key_a.val ()); + rai::store_iterator result (transaction_a, pending_v1, key_a.val (), rai::epoch::epoch_1); return result; } rai::store_iterator rai::block_store::pending_v1_begin (MDB_txn * transaction_a) { - rai::store_iterator result (transaction_a, pending_v1); + rai::store_iterator result (transaction_a, pending_v1, rai::epoch::epoch_1); return result; } @@ -1667,13 +1677,13 @@ std::shared_ptr rai::block_store::vote_max (MDB_txn * transaction_a, rai::store_iterator rai::block_store::latest_v0_begin (MDB_txn * transaction_a, rai::account const & account_a) { - rai::store_iterator result (transaction_a, accounts_v0, rai::mdb_val (account_a)); + rai::store_iterator result (transaction_a, accounts_v0, rai::mdb_val (account_a), rai::epoch::epoch_0); return result; } rai::store_iterator rai::block_store::latest_v0_begin (MDB_txn * transaction_a) { - rai::store_iterator result (transaction_a, accounts_v0); + rai::store_iterator result (transaction_a, accounts_v0, rai::epoch::epoch_0); return result; } @@ -1685,13 +1695,13 @@ rai::store_iterator rai::block_store::latest_v0_end () rai::store_iterator rai::block_store::latest_v1_begin (MDB_txn * transaction_a, rai::account const & account_a) { - rai::store_iterator result (transaction_a, accounts_v1, rai::mdb_val (account_a)); + rai::store_iterator result (transaction_a, accounts_v1, rai::mdb_val (account_a), rai::epoch::epoch_1); return result; } rai::store_iterator rai::block_store::latest_v1_begin (MDB_txn * transaction_a) { - rai::store_iterator result (transaction_a, accounts_v1); + rai::store_iterator result (transaction_a, accounts_v1, rai::epoch::epoch_1); return result; } diff --git a/rai/secure/blockstore.hpp b/rai/secure/blockstore.hpp index b8a4f6e7..7af588ae 100644 --- a/rai/secure/blockstore.hpp +++ b/rai/secure/blockstore.hpp @@ -10,9 +10,9 @@ namespace rai class store_iterator { public: - store_iterator (MDB_txn *, MDB_dbi); + store_iterator (MDB_txn *, MDB_dbi, rai::epoch = rai::epoch::unspecified); store_iterator (std::nullptr_t); - store_iterator (MDB_txn *, MDB_dbi, MDB_val const &); + store_iterator (MDB_txn *, MDB_dbi, MDB_val const &, rai::epoch = rai::epoch::unspecified); store_iterator (rai::store_iterator &&); store_iterator (rai::store_iterator const &) = delete; ~store_iterator (); @@ -34,9 +34,9 @@ public: class merged_store_kv { public: + merged_store_kv (rai::epoch = rai::epoch::unspecified); rai::mdb_val first; rai::mdb_val second; - bool from_secondary_store; }; /** diff --git a/rai/secure/common.cpp b/rai/secure/common.cpp index bb7dc3d6..87863273 100644 --- a/rai/secure/common.cpp +++ b/rai/secure/common.cpp @@ -200,12 +200,13 @@ epoch (rai::epoch::epoch_0) { } -rai::account_info::account_info (MDB_val const & val_a, rai::epoch epoch_a) : -epoch (epoch_a) +rai::account_info::account_info (rai::mdb_val const & val_a) : +epoch (val_a.epoch) { + assert (val_a.epoch == rai::epoch::epoch_0 || val_a.epoch == rai::epoch::epoch_1); auto size (db_size ()); - assert (val_a.mv_size == size); - std::copy (reinterpret_cast (val_a.mv_data), reinterpret_cast (val_a.mv_data) + size, reinterpret_cast (this)); + assert (val_a.value.mv_size == size); + std::copy (reinterpret_cast (val_a.value.mv_data), reinterpret_cast (val_a.value.mv_data) + size, reinterpret_cast (this)); } rai::account_info::account_info (rai::block_hash const & head_a, rai::block_hash const & rep_block_a, rai::block_hash const & open_block_a, rai::amount const & balance_a, uint64_t modified_a, uint64_t block_count_a, rai::epoch epoch_a) : @@ -303,14 +304,15 @@ epoch (rai::epoch::epoch_0) { } -rai::pending_info::pending_info (MDB_val const & val_a, rai::epoch epoch_a) : -epoch (epoch_a) +rai::pending_info::pending_info (rai::mdb_val const & val_a) : +epoch (val_a.epoch) { + assert (val_a.epoch == rai::epoch::epoch_0 || val_a.epoch == rai::epoch::epoch_1); auto db_size (sizeof (source) + sizeof (amount)); - assert (val_a.mv_size == db_size); + assert (val_a.value.mv_size == db_size); assert (reinterpret_cast (this) == reinterpret_cast (&source)); assert (reinterpret_cast (&source) + sizeof (source) == reinterpret_cast (&amount)); - std::copy (reinterpret_cast (val_a.mv_data), reinterpret_cast (val_a.mv_data) + db_size, reinterpret_cast (this)); + std::copy (reinterpret_cast (val_a.value.mv_data), reinterpret_cast (val_a.value.mv_data) + db_size, reinterpret_cast (this)); } rai::pending_info::pending_info (rai::account const & source_a, rai::amount const & amount_a, rai::epoch epoch_a) : diff --git a/rai/secure/common.hpp b/rai/secure/common.hpp index a875b4db..f0fadbae 100644 --- a/rai/secure/common.hpp +++ b/rai/secure/common.hpp @@ -107,17 +107,6 @@ public: std::unique_ptr deserialize_block (MDB_val const &); -/** - * Tag for which epoch an entry belongs to - */ -enum class epoch : uint8_t -{ - invalid = 0, - unspecified = 1, - epoch_0 = 2, - epoch_1 = 3 -}; - /** * Latest information about an account */ @@ -125,7 +114,7 @@ class account_info { public: account_info (); - account_info (MDB_val const &, epoch); + account_info (rai::mdb_val const &); account_info (rai::account_info const &) = default; account_info (rai::block_hash const &, rai::block_hash const &, rai::block_hash const &, rai::amount const &, uint64_t, uint64_t, epoch); void serialize (rai::stream &) const; @@ -151,7 +140,7 @@ class pending_info { public: pending_info (); - pending_info (MDB_val const &, epoch); + pending_info (rai::mdb_val const &); pending_info (rai::account const &, rai::amount const &, epoch); void serialize (rai::stream &) const; bool deserialize (rai::stream &); diff --git a/rai/secure/ledger.cpp b/rai/secure/ledger.cpp index bb6412e6..bae251b6 100644 --- a/rai/secure/ledger.cpp +++ b/rai/secure/ledger.cpp @@ -666,12 +666,12 @@ rai::uint128_t rai::ledger::account_pending (MDB_txn * transaction_a, rai::accou rai::account end (account_a.number () + 1); for (auto i (store.pending_v0_begin (transaction_a, rai::pending_key (account_a, 0))), n (store.pending_v0_begin (transaction_a, rai::pending_key (end, 0))); i != n; ++i) { - rai::pending_info info (i->second, rai::epoch::epoch_0); + rai::pending_info info (i->second); result += info.amount.number (); } for (auto i (store.pending_v1_begin (transaction_a, rai::pending_key (account_a, 0))), n (store.pending_v1_begin (transaction_a, rai::pending_key (end, 0))); i != n; ++i) { - rai::pending_info info (i->second, rai::epoch::epoch_1); + rai::pending_info info (i->second); result += info.amount.number (); } return result; diff --git a/rai/secure/utility.cpp b/rai/secure/utility.cpp index 7084ef99..d9008f2e 100644 --- a/rai/secure/utility.cpp +++ b/rai/secure/utility.cpp @@ -102,13 +102,15 @@ rai::mdb_env::operator MDB_env * () const return environment; } -rai::mdb_val::mdb_val () : -value ({ 0, nullptr }) +rai::mdb_val::mdb_val (rai::epoch epoch_a) : +value ({ 0, nullptr }), +epoch (epoch_a) { } -rai::mdb_val::mdb_val (MDB_val const & value_a) : -value (value_a) +rai::mdb_val::mdb_val (MDB_val const & value_a, rai::epoch epoch_a) : +value (value_a), +epoch (epoch_a) { } diff --git a/rai/secure/utility.hpp b/rai/secure/utility.hpp index 12f19c6d..c11e5210 100644 --- a/rai/secure/utility.hpp +++ b/rai/secure/utility.hpp @@ -113,14 +113,25 @@ public: MDB_env * environment; }; +/** + * Tag for which epoch an entry belongs to + */ +enum class epoch : uint8_t +{ + invalid = 0, + unspecified = 1, + epoch_0 = 2, + epoch_1 = 3 +}; + /** * Encapsulates MDB_val and provides uint256_union conversion of the data. */ class mdb_val { public: - mdb_val (); - mdb_val (MDB_val const &); + mdb_val (rai::epoch = rai::epoch::unspecified); + mdb_val (MDB_val const &, rai::epoch = rai::epoch::unspecified); mdb_val (size_t, void *); mdb_val (rai::uint128_union const &); mdb_val (rai::uint256_union const &); @@ -130,6 +141,7 @@ public: operator MDB_val * () const; operator MDB_val const & () const; MDB_val value; + rai::epoch epoch; }; /**