mirror of
https://github.com/monero-project/monero.git
synced 2025-07-24 20:55:21 -04:00
Steps toward multiple dbs available -- working
There will need to be some more refactoring for these changes to be considered complete/correct, but for now it's working. new daemon cli argument "--db-type", works for LMDB and BerkeleyDB. A good deal of refactoring is also present in this commit, namely Blockchain no longer instantiates BlockchainDB, but rather is passed a pointer to an already-instantiated BlockchainDB on init().
This commit is contained in:
parent
874f48bc82
commit
7b14d4a17f
13 changed files with 146 additions and 58 deletions
|
@ -39,7 +39,6 @@
|
|||
#include "tx_pool.h"
|
||||
#include "blockchain.h"
|
||||
#include "blockchain_db/blockchain_db.h"
|
||||
#include "blockchain_db/lmdb/db_lmdb.h"
|
||||
#include "cryptonote_format_utils.h"
|
||||
#include "cryptonote_boost_serialization.h"
|
||||
#include "cryptonote_config.h"
|
||||
|
@ -65,8 +64,7 @@ using epee::string_tools::pod_to_hex;
|
|||
DISABLE_VS_WARNINGS(4267)
|
||||
|
||||
//------------------------------------------------------------------
|
||||
// TODO: initialize m_db with a concrete implementation of BlockchainDB
|
||||
Blockchain::Blockchain(tx_memory_pool& tx_pool):m_db(), m_tx_pool(tx_pool), m_current_block_cumul_sz_limit(0), m_is_in_checkpoint_zone(false), m_is_blockchain_storing(false), m_testnet(false), m_enforce_dns_checkpoints(false)
|
||||
Blockchain::Blockchain(tx_memory_pool& tx_pool):m_db(), m_tx_pool(tx_pool), m_current_block_cumul_sz_limit(0), m_is_in_checkpoint_zone(false), m_is_blockchain_storing(false), m_enforce_dns_checkpoints(false)
|
||||
{
|
||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||
}
|
||||
|
@ -226,43 +224,24 @@ uint64_t Blockchain::get_current_blockchain_height() const
|
|||
//------------------------------------------------------------------
|
||||
//FIXME: possibly move this into the constructor, to avoid accidentally
|
||||
// dereferencing a null BlockchainDB pointer
|
||||
bool Blockchain::init(const std::string& config_folder, const bool testnet, const int db_flags)
|
||||
bool Blockchain::init(BlockchainDB* db, const bool testnet)
|
||||
{
|
||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||
|
||||
// TODO: make this configurable
|
||||
m_db = new BlockchainLMDB();
|
||||
|
||||
m_config_folder = config_folder;
|
||||
m_testnet = testnet;
|
||||
|
||||
boost::filesystem::path folder(m_config_folder);
|
||||
|
||||
folder /= m_db->get_db_name();
|
||||
|
||||
LOG_PRINT_L0("Loading blockchain from folder " << folder.c_str() << " ...");
|
||||
|
||||
const std::string filename = folder.string();
|
||||
try
|
||||
if (db == nullptr)
|
||||
{
|
||||
m_db->open(filename, db_flags);
|
||||
LOG_ERROR("Attempted to init Blockchain with null DB");
|
||||
return false;
|
||||
}
|
||||
catch (const DB_OPEN_FAILURE& e)
|
||||
if (!db->is_open())
|
||||
{
|
||||
LOG_PRINT_L0("No blockchain file found, attempting to create one.");
|
||||
try
|
||||
{
|
||||
m_db->create(filename);
|
||||
}
|
||||
catch (const DB_CREATE_FAILURE& db_create_error)
|
||||
{
|
||||
LOG_PRINT_L0("Unable to create BlockchainDB! This is not good...");
|
||||
//TODO: make sure whatever calls this handles the return value properly
|
||||
return false;
|
||||
}
|
||||
LOG_ERROR("Attempted to init Blockchain with unopened DB");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_db = db;
|
||||
|
||||
// if the blockchain is new, add the genesis block
|
||||
// this feels kinda kludgy to do it this way, but can be looked at later.
|
||||
// TODO: add function to create and store genesis block,
|
||||
|
|
|
@ -81,7 +81,7 @@ namespace cryptonote
|
|||
|
||||
Blockchain(tx_memory_pool& tx_pool);
|
||||
|
||||
bool init(const std::string& config_folder, const bool testnet = false, const int db_flags = 0);
|
||||
bool init(BlockchainDB* db, const bool testnet = false);
|
||||
bool deinit();
|
||||
|
||||
void set_checkpoints(checkpoints&& chk_pts) { m_checkpoints = chk_pts; }
|
||||
|
@ -180,11 +180,9 @@ namespace cryptonote
|
|||
outputs_container m_outputs;
|
||||
|
||||
|
||||
std::string m_config_folder;
|
||||
checkpoints m_checkpoints;
|
||||
std::atomic<bool> m_is_in_checkpoint_zone;
|
||||
std::atomic<bool> m_is_blockchain_storing;
|
||||
bool m_testnet;
|
||||
bool m_enforce_dns_checkpoints;
|
||||
|
||||
bool switch_to_alternative_blockchain(std::list<blocks_ext_by_hash::iterator>& alt_chain, bool discard_disconnected_chain);
|
||||
|
|
|
@ -44,6 +44,9 @@ using namespace epee;
|
|||
#include <csignal>
|
||||
#include "daemon/command_line_args.h"
|
||||
#include "cryptonote_core/checkpoints_create.h"
|
||||
#include "blockchain_db/blockchain_db.h"
|
||||
#include "blockchain_db/lmdb/db_lmdb.h"
|
||||
#include "blockchain_db/berkeleydb/db_bdb.h"
|
||||
|
||||
DISABLE_VS_WARNINGS(4355)
|
||||
|
||||
|
@ -194,7 +197,45 @@ namespace cryptonote
|
|||
r = m_mempool.init(m_config_folder);
|
||||
CHECK_AND_ASSERT_MES(r, false, "Failed to initialize memory pool");
|
||||
|
||||
#if BLOCKCHAIN_DB == DB_LMDB
|
||||
std::string db_type = command_line::get_arg(vm, daemon_args::arg_db_type);
|
||||
|
||||
BlockchainDB* db = nullptr;
|
||||
if (db_type == "lmdb")
|
||||
{
|
||||
db = new BlockchainLMDB();
|
||||
}
|
||||
else if (db_type == "berkeley")
|
||||
{
|
||||
db = new BlockchainBDB();
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR("Attempted to use non-existant database type");
|
||||
return false;
|
||||
}
|
||||
|
||||
boost::filesystem::path folder(m_config_folder);
|
||||
|
||||
folder /= db->get_db_name();
|
||||
|
||||
LOG_PRINT_L0("Loading blockchain from folder " << folder.c_str() << " ...");
|
||||
|
||||
const std::string filename = folder.string();
|
||||
try
|
||||
{
|
||||
db->open(filename);
|
||||
}
|
||||
catch (const DB_ERROR& e)
|
||||
{
|
||||
LOG_PRINT_L0("Error opening database: " << e.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
r = m_blockchain_storage.init(db, m_testnet);
|
||||
#else
|
||||
r = m_blockchain_storage.init(m_config_folder, m_testnet);
|
||||
#endif
|
||||
CHECK_AND_ASSERT_MES(r, false, "Failed to initialize blockchain storage");
|
||||
|
||||
// load json & DNS checkpoints, and verify them
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue