diff --git a/nano/node/nodeconfig.cpp b/nano/node/nodeconfig.cpp index 47a1b6041..8ad44af1a 100644 --- a/nano/node/nodeconfig.cpp +++ b/nano/node/nodeconfig.cpp @@ -537,7 +537,7 @@ nano::error nano::node_config::deserialize_toml (nano::tomlconfig & toml) toml.get ("allow_local_peers", allow_local_peers); toml.get (signature_checker_threads_key, signature_checker_threads); - database_backend = get_database_backend (toml); + database_backend = get_config_backend (toml); if (toml.has_key ("lmdb")) { @@ -661,9 +661,9 @@ void nano::node_config::deserialize_address (std::string const & entry_a, std::v } } -std::string nano::node_config::serialize_database_backend (nano::database_backend mode_a) const +std::string nano::node_config::serialize_database_backend (nano::database_backend backend) const { - switch (mode_a) + switch (backend) { case nano::database_backend::rocksdb: return "rocksdb"; @@ -673,23 +673,50 @@ std::string nano::node_config::serialize_database_backend (nano::database_backen debug_assert (false); } -nano::database_backend nano::node_config::get_database_backend (nano::tomlconfig & toml) +std::optional nano::node_config::deserialize_database_backend (std::string backend_str) const +{ + if (backend_str == "rocksdb") + return database_backend::rocksdb; + if (backend_str == "lmdb") + return database_backend::lmdb; + return std::nullopt; +} + +nano::database_backend nano::node_config::get_config_backend (nano::tomlconfig & toml) { if (toml.has_key ("database_backend")) { - auto backend_string (toml.get ("database_backend")); - if (backend_string == "rocksdb") - return database_backend::rocksdb; - if (backend_string == "lmdb") - return database_backend::lmdb; - - toml.get_error ().set ("Unknown database_backend type: " + backend_string); + auto backend_str = (toml.get ("database_backend")); + auto backend = deserialize_database_backend (backend_str); + if (backend.has_value ()) + { + return backend.value (); + } + toml.get_error ().set ("Unknown database_backend type: " + backend_str); return nano::database_backend::lmdb; } // Default to LMDB return nano::database_backend::lmdb; } +nano::database_backend nano::node_config::get_default_backend () +{ + auto backend_str = nano::env::get ("BACKEND"); + + if (backend_str.has_value ()) + { + auto backend = deserialize_database_backend (backend_str.value ()); + if (backend.has_value ()) + { + std::cerr << "Database backend overridden by BACKEND environment variable: " << *backend_str << std::endl; + return backend.value (); + } + + std::cerr << "Unknown database backend in BACKEND environment variable: " << *backend_str << std::endl; + } + return database_backend::lmdb; +} + nano::account nano::node_config::random_representative () const { debug_assert (!preconfigured_representatives.empty ()); diff --git a/nano/node/nodeconfig.hpp b/nano/node/nodeconfig.hpp index bb25bf965..c976362fd 100644 --- a/nano/node/nodeconfig.hpp +++ b/nano/node/nodeconfig.hpp @@ -139,7 +139,7 @@ public: uint64_t max_pruning_depth{ 0 }; nano::rocksdb_config rocksdb_config; nano::lmdb_config lmdb_config; - nano::database_backend database_backend{ std::string (std::getenv ("BACKEND") ? std::getenv ("BACKEND") : "") == "rocksdb" ? nano::database_backend::rocksdb : nano::database_backend::lmdb }; + nano::database_backend database_backend{ get_default_backend () }; bool enable_upnp{ true }; std::size_t max_ledger_notifications{ 8 }; @@ -164,7 +164,9 @@ public: /** Entry is ignored if it cannot be parsed as a valid address:port */ void deserialize_address (std::string const &, std::vector> &) const; std::string serialize_database_backend (nano::database_backend) const; - nano::database_backend get_database_backend (nano::tomlconfig & toml); + std::optional deserialize_database_backend (std::string backend_str) const; + nano::database_backend get_config_backend (nano::tomlconfig & toml); + nano::database_backend get_default_backend (); private: static std::optional env_io_threads ();