From ac9edf359b2dd3a8b10bdae266871098292000c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Sat, 28 Jun 2025 16:19:39 +0200 Subject: [PATCH] Throw from `lmdb::env` --- nano/core_test/wallet.cpp | 57 ++++++++++++------------------------ nano/node/wallet.cpp | 6 +--- nano/store/lmdb/lmdb.cpp | 21 +++---------- nano/store/lmdb/lmdb_env.cpp | 11 ++++--- nano/store/lmdb/lmdb_env.hpp | 4 +-- 5 files changed, 31 insertions(+), 68 deletions(-) diff --git a/nano/core_test/wallet.cpp b/nano/core_test/wallet.cpp index 8aed6748..f61816f0 100644 --- a/nano/core_test/wallet.cpp +++ b/nano/core_test/wallet.cpp @@ -18,8 +18,7 @@ unsigned constexpr nano::wallet_store::version_current; TEST (wallet, no_special_keys_accounts) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -39,8 +38,7 @@ TEST (wallet, no_special_keys_accounts) TEST (wallet, no_key) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -54,8 +52,7 @@ TEST (wallet, no_key) TEST (wallet, fetch_locked) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -76,8 +73,7 @@ TEST (wallet, fetch_locked) TEST (wallet, retrieval) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -98,8 +94,7 @@ TEST (wallet, retrieval) TEST (wallet, empty_iteration) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -112,8 +107,7 @@ TEST (wallet, empty_iteration) TEST (wallet, one_item_iteration) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -134,8 +128,7 @@ TEST (wallet, one_item_iteration) TEST (wallet, two_item_iteration) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); nano::keypair key1; nano::keypair key2; ASSERT_NE (key1.pub, key2.pub); @@ -260,8 +253,7 @@ TEST (wallet, spend_no_previous) TEST (wallet, find_none) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -273,8 +265,7 @@ TEST (wallet, find_none) TEST (wallet, find_existing) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -292,8 +283,7 @@ TEST (wallet, find_existing) TEST (wallet, rekey) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -322,8 +312,7 @@ TEST (wallet, rekey) TEST (wallet, hash_password) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -371,9 +360,8 @@ TEST (fan, change) TEST (wallet, reopen_default_password) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); - ASSERT_FALSE (init); nano::kdf kdf{ nano::dev::network_params.kdf_work }; { nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -407,8 +395,7 @@ TEST (wallet, reopen_default_password) TEST (wallet, representative) { auto error (false); - nano::store::lmdb::env env (error, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (error); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (error, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -428,8 +415,7 @@ TEST (wallet, representative) TEST (wallet, serialize_json_empty) { auto error (false); - nano::store::lmdb::env env (error, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (error); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet1 (error, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -453,8 +439,7 @@ TEST (wallet, serialize_json_empty) TEST (wallet, serialize_json_one) { auto error (false); - nano::store::lmdb::env env (error, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (error); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet1 (error, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -482,8 +467,7 @@ TEST (wallet, serialize_json_one) TEST (wallet, serialize_json_password) { auto error (false); - nano::store::lmdb::env env (error, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (error); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet1 (error, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -515,8 +499,7 @@ TEST (wallet, serialize_json_password) TEST (wallet_store, move) { auto error (false); - nano::store::lmdb::env env (error, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (error); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet1 (error, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -672,8 +655,7 @@ TEST (wallet, insert_locked) TEST (wallet, deterministic_keys) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); @@ -715,8 +697,7 @@ TEST (wallet, deterministic_keys) TEST (wallet, reseed) { bool init; - nano::store::lmdb::env env (init, nano::unique_path () / "wallet.ldb"); - ASSERT_FALSE (init); + nano::store::lmdb::env env (nano::unique_path () / "wallet.ldb"); auto transaction (env.tx_begin_write ()); nano::kdf kdf{ nano::dev::network_params.kdf_work }; nano::wallet_store wallet (init, kdf, transaction, env, nano::dev::genesis_key.pub, 1, "0"); diff --git a/nano/node/wallet.cpp b/nano/node/wallet.cpp index a087da45..8563457f 100644 --- a/nano/node/wallet.cpp +++ b/nano/node/wallet.cpp @@ -1920,12 +1920,8 @@ auto nano::wallet_store::end (store::transaction const & transaction_a) -> itera } nano::mdb_wallets_store::mdb_wallets_store (std::filesystem::path const & path_a, nano::lmdb_config const & lmdb_config_a) : - environment (error, path_a, nano::store::lmdb::env::options::make ().set_config (lmdb_config_a).override_config_sync (nano::lmdb_config::sync_strategy::always).override_config_map_size (1ULL * 1024 * 1024 * 1024)) + environment (path_a, nano::store::lmdb::env::options::make ().set_config (lmdb_config_a).override_config_sync (nano::lmdb_config::sync_strategy::always).override_config_map_size (1ULL * 1024 * 1024 * 1024)) { - if (error) - { - throw std::runtime_error ("Failed to initialize wallet store: " + path_a.string ()); - } } nano::container_info nano::wallets::container_info () const diff --git a/nano/store/lmdb/lmdb.cpp b/nano/store/lmdb/lmdb.cpp index 06280793..9fe014e4 100644 --- a/nano/store/lmdb/lmdb.cpp +++ b/nano/store/lmdb/lmdb.cpp @@ -47,15 +47,10 @@ nano::store::lmdb::component::component (nano::logger & logger_a, std::filesyste database_path{ path_a }, mode{ mode_a }, logger{ logger_a }, - env (error, path_a, nano::store::lmdb::env::options::make ().set_config (lmdb_config_a).set_use_no_mem_init (true).set_read_only (mode_a == nano::store::open_mode::read_only)), + env (path_a, nano::store::lmdb::env::options::make ().set_config (lmdb_config_a).set_use_no_mem_init (true).set_read_only (mode_a == nano::store::open_mode::read_only)), mdb_txn_tracker (logger_a, txn_tracking_config_a, block_processor_batch_max_time_a), txn_tracking_enabled (txn_tracking_config_a.enable) { - if (error) - { - throw std::runtime_error ("Failed to initialize LMDB store: " + database_path.string ()); - } - logger.info (nano::log::type::lmdb, "Initializing ledger store: {}", database_path.string ()); debug_assert (path_a.filename () == "data.ldb"); @@ -125,7 +120,6 @@ nano::store::lmdb::component::component (nano::logger & logger_a, std::filesyste open_databases (transaction, 0); } } -} bool nano::store::lmdb::component::vacuum_after_upgrade (std::filesystem::path const & path_a, nano::lmdb_config const & lmdb_config_a) { @@ -147,16 +141,9 @@ bool nano::store::lmdb::component::vacuum_after_upgrade (std::filesystem::path c auto options = nano::store::lmdb::env::options::make () .set_config (lmdb_config_a) .set_use_no_mem_init (true); - env.init (error, path_a, options); - if (!error) - { - auto transaction (tx_begin_read ()); - open_databases (transaction, 0); - } - else - { - throw std::runtime_error ("Failed to reinitialize LMDB store after vacuum: " + path_a.string ()); - } + env.init (path_a, options); + auto transaction (tx_begin_read ()); + open_databases (transaction, 0); } else { diff --git a/nano/store/lmdb/lmdb_env.cpp b/nano/store/lmdb/lmdb_env.cpp index 1c491c68..77429675 100644 --- a/nano/store/lmdb/lmdb_env.cpp +++ b/nano/store/lmdb/lmdb_env.cpp @@ -5,13 +5,13 @@ #include -nano::store::lmdb::env::env (bool & error_a, std::filesystem::path const & path_a, nano::store::lmdb::env::options options_a) : +nano::store::lmdb::env::env (std::filesystem::path const & path_a, nano::store::lmdb::env::options options_a) : database_path{ path_a } { - init (error_a, path_a, options_a); + init (path_a, options_a); } -void nano::store::lmdb::env::init (bool & error_a, std::filesystem::path const & path_a, nano::store::lmdb::env::options options_a) +void nano::store::lmdb::env::init (std::filesystem::path const & path_a, nano::store::lmdb::env::options options_a) { debug_assert (path_a.extension () == ".ldb", "invalid filename extension for lmdb database file"); @@ -74,16 +74,15 @@ void nano::store::lmdb::env::init (bool & error_a, std::filesystem::path const & throw std::runtime_error (message); } release_assert (success (status4), error_string (status4)); - error_a = !success (status4); } else { - error_a = true; + throw std::runtime_error ("Could not create database directory: " + error_mkdir.message ()); } } else { - error_a = true; + throw std::runtime_error ("Invalid database path: path must have parent directory"); } } diff --git a/nano/store/lmdb/lmdb_env.hpp b/nano/store/lmdb/lmdb_env.hpp index 09dd7d65..217e5339 100644 --- a/nano/store/lmdb/lmdb_env.hpp +++ b/nano/store/lmdb/lmdb_env.hpp @@ -62,8 +62,8 @@ public: nano::lmdb_config config; }; - env (bool &, std::filesystem::path const &, env::options options_a = env::options::make ()); - void init (bool &, std::filesystem::path const &, env::options options_a = env::options::make ()); + env (std::filesystem::path const &, env::options options_a = env::options::make ()); + void init (std::filesystem::path const &, env::options options_a = env::options::make ()); ~env (); operator MDB_env * () const; store::read_transaction tx_begin_read (txn_callbacks callbacks = txn_callbacks{}) const;