diff --git a/nano/core_test/block_store.cpp b/nano/core_test/block_store.cpp index 4677c509..7e1183ba 100644 --- a/nano/core_test/block_store.cpp +++ b/nano/core_test/block_store.cpp @@ -1834,33 +1834,39 @@ TEST (mdb_block_store, upgrade_v18_v19) ASSERT_LT (18, store.version.get (transaction)); } -TEST (mdb_block_store, upgrade_v19_v20) +namespace nano { - if (nano::rocksdb_config::using_rocksdb_in_tests ()) - { - // Don't test this in rocksdb mode - return; - } - auto path (nano::unique_path ()); - nano::logger_mt logger; - nano::stat stats; +namespace lmdb +{ + TEST (mdb_block_store, upgrade_v19_v20) { + if (nano::rocksdb_config::using_rocksdb_in_tests ()) + { + // Don't test this in rocksdb mode + return; + } + auto path (nano::unique_path ()); + nano::logger_mt logger; + nano::stat stats; + { + nano::lmdb::store store (logger, path, nano::dev::constants); + nano::ledger ledger (store, stats, nano::dev::constants); + auto transaction (store.tx_begin_write ()); + store.initialize (transaction, ledger.cache, nano::dev::constants); + // Delete pruned table + ASSERT_FALSE (mdb_drop (store.env.tx (transaction), store.pruned_store.pruned_handle, 1)); + store.version.put (transaction, 19); + } + // Upgrading should create the table nano::lmdb::store store (logger, path, nano::dev::constants); - nano::ledger ledger (store, stats, nano::dev::constants); - auto transaction (store.tx_begin_write ()); - store.initialize (transaction, ledger.cache, nano::dev::constants); - // Delete pruned table - ASSERT_FALSE (mdb_drop (store.env.tx (transaction), store.pruned_handle, 1)); - store.version.put (transaction, 19); - } - // Upgrading should create the table - nano::lmdb::store store (logger, path, nano::dev::constants); - ASSERT_FALSE (store.init_error ()); - ASSERT_NE (store.pruned_handle, 0); + ASSERT_FALSE (store.init_error ()); + ASSERT_NE (store.pruned_store.pruned_handle, 0); - // Version should be correct - auto transaction (store.tx_begin_read ()); - ASSERT_LT (19, store.version.get (transaction)); + // Version should be correct + auto transaction (store.tx_begin_read ()); + ASSERT_LT (19, store.version.get (transaction)); + } +} } TEST (mdb_block_store, upgrade_v20_v21) diff --git a/nano/node/lmdb/lmdb.cpp b/nano/node/lmdb/lmdb.cpp index 6210b839..fd2bc88c 100644 --- a/nano/node/lmdb/lmdb.cpp +++ b/nano/node/lmdb/lmdb.cpp @@ -215,7 +215,7 @@ void nano::lmdb::store::open_databases (bool & error_a, nano::transaction const error_a |= mdb_dbi_open (env.tx (transaction_a), "online_weight", flags, &online_weight_store.online_weight_handle) != 0; error_a |= mdb_dbi_open (env.tx (transaction_a), "meta", flags, &meta_handle) != 0; error_a |= mdb_dbi_open (env.tx (transaction_a), "peers", flags, &peers_handle) != 0; - error_a |= mdb_dbi_open (env.tx (transaction_a), "pruned", flags, &pruned_handle) != 0; + error_a |= mdb_dbi_open (env.tx (transaction_a), "pruned", flags, &pruned_store.pruned_handle) != 0; error_a |= mdb_dbi_open (env.tx (transaction_a), "confirmation_height", flags, &confirmation_height_handle) != 0; error_a |= mdb_dbi_open (env.tx (transaction_a), "accounts", flags, &account_store.accounts_v0_handle) != 0; account_store.accounts_handle = account_store.accounts_v0_handle; @@ -766,7 +766,7 @@ void nano::lmdb::store::upgrade_v18_to_v19 (nano::write_transaction const & tran void nano::lmdb::store::upgrade_v19_to_v20 (nano::write_transaction const & transaction_a) { logger.always_log ("Preparing v19 to v20 database upgrade..."); - mdb_dbi_open (env.tx (transaction_a), "pruned", MDB_CREATE, &pruned_handle); + mdb_dbi_open (env.tx (transaction_a), "pruned", MDB_CREATE, &pruned_store.pruned_handle); version.put (transaction_a, 20); logger.always_log ("Finished creating new pruned table"); } @@ -877,7 +877,7 @@ MDB_dbi nano::lmdb::store::table_to_dbi (tables table_a) const case tables::peers: return peers_handle; case tables::pruned: - return pruned_handle; + return pruned_store.pruned_handle; case tables::confirmation_height: return confirmation_height_handle; case tables::final_votes: @@ -916,7 +916,7 @@ bool nano::lmdb::store::copy_db (boost::filesystem::path const & destination_fil void nano::lmdb::store::rebuild_db (nano::write_transaction const & transaction_a) { // Tables with uint256_union key - std::vector tables = { account_store.accounts_handle, blocks_handle, pruned_handle, confirmation_height_handle }; + std::vector tables = { account_store.accounts_handle, blocks_handle, pruned_store.pruned_handle, confirmation_height_handle }; for (auto const & table : tables) { MDB_dbi temp; diff --git a/nano/node/lmdb/lmdb.hpp b/nano/node/lmdb/lmdb.hpp index 269ecc33..403ce611 100644 --- a/nano/node/lmdb/lmdb.hpp +++ b/nano/node/lmdb/lmdb.hpp @@ -148,12 +148,6 @@ namespace lmdb */ MDB_dbi meta_handle{ 0 }; - /** - * Pruned blocks hashes - * nano::block_hash -> none - */ - MDB_dbi pruned_handle{ 0 }; - /* * Endpoints for peers * nano::endpoint_key -> no_value @@ -267,6 +261,7 @@ namespace lmdb friend class mdb_block_store_supported_version_upgrades_Test; friend class mdb_block_store_upgrade_v14_v15_Test; friend class mdb_block_store_upgrade_v15_v16_Test; + friend class mdb_block_store_upgrade_v19_v20_Test; friend void modify_account_info_to_v14 (nano::lmdb::store &, nano::transaction const &, nano::account const &, uint64_t, nano::block_hash const &); }; } diff --git a/nano/node/lmdb/pruned_store.hpp b/nano/node/lmdb/pruned_store.hpp index 0c8e05ee..859d017d 100644 --- a/nano/node/lmdb/pruned_store.hpp +++ b/nano/node/lmdb/pruned_store.hpp @@ -2,6 +2,8 @@ #include +#include + namespace nano { namespace lmdb @@ -24,6 +26,12 @@ namespace lmdb nano::store_iterator begin (nano::transaction const & transaction_a) const override; nano::store_iterator end () const override; void for_each_par (std::function, nano::store_iterator)> const & action_a) const override; + + /** + * Pruned blocks hashes + * nano::block_hash -> none + */ + MDB_dbi pruned_handle{ 0 }; }; } }