mirror of
https://git.wownero.com/wownero/wownero.git
synced 2024-08-15 01:03:23 +00:00
core: sync database based on bytes added, not blocks added
Blocks have a very wide range, whereas actual size is the relevant quantity to consider when syncing
This commit is contained in:
parent
0dddfeacc9
commit
b278b83860
4 changed files with 37 additions and 16 deletions
|
@ -87,8 +87,8 @@ const command_line::arg_descriptor<std::string> arg_db_type = {
|
||||||
};
|
};
|
||||||
const command_line::arg_descriptor<std::string> arg_db_sync_mode = {
|
const command_line::arg_descriptor<std::string> arg_db_sync_mode = {
|
||||||
"db-sync-mode"
|
"db-sync-mode"
|
||||||
, "Specify sync option, using format [safe|fast|fastest]:[sync|async]:[nblocks_per_sync]."
|
, "Specify sync option, using format [safe|fast|fastest]:[sync|async]:[<nblocks_per_sync>[blocks]|<nbytes_per_sync>[bytes]]."
|
||||||
, "fast:async:1000"
|
, "fast:async:250000000bytes"
|
||||||
};
|
};
|
||||||
const command_line::arg_descriptor<bool> arg_db_salvage = {
|
const command_line::arg_descriptor<bool> arg_db_salvage = {
|
||||||
"db-salvage"
|
"db-salvage"
|
||||||
|
|
|
@ -156,7 +156,7 @@ static const struct {
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
Blockchain::Blockchain(tx_memory_pool& tx_pool) :
|
Blockchain::Blockchain(tx_memory_pool& tx_pool) :
|
||||||
m_db(), m_tx_pool(tx_pool), m_hardfork(NULL), m_timestamps_and_difficulties_height(0), m_current_block_cumul_sz_limit(0), m_current_block_cumul_sz_median(0),
|
m_db(), m_tx_pool(tx_pool), m_hardfork(NULL), m_timestamps_and_difficulties_height(0), m_current_block_cumul_sz_limit(0), m_current_block_cumul_sz_median(0),
|
||||||
m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_blocks_per_sync(1), m_db_sync_mode(db_async), m_db_default_sync(false), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0), m_cancel(false),
|
m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_sync_on_blocks(true), m_db_sync_threshold(1), m_db_sync_mode(db_async), m_db_default_sync(false), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0), m_bytes_to_sync(0), m_cancel(false),
|
||||||
m_difficulty_for_next_block_top_hash(crypto::null_hash),
|
m_difficulty_for_next_block_top_hash(crypto::null_hash),
|
||||||
m_difficulty_for_next_block(1)
|
m_difficulty_for_next_block(1)
|
||||||
{
|
{
|
||||||
|
@ -3877,11 +3877,13 @@ bool Blockchain::cleanup_handle_incoming_blocks(bool force_sync)
|
||||||
store_blockchain();
|
store_blockchain();
|
||||||
m_sync_counter = 0;
|
m_sync_counter = 0;
|
||||||
}
|
}
|
||||||
else if (m_db_blocks_per_sync && m_sync_counter >= m_db_blocks_per_sync)
|
else if (m_db_sync_threshold && ((m_db_sync_on_blocks && m_sync_counter >= m_db_sync_threshold) || (!m_db_sync_on_blocks && m_bytes_to_sync >= m_db_sync_threshold)))
|
||||||
{
|
{
|
||||||
|
MDEBUG("Sync threshold met, syncing");
|
||||||
if(m_db_sync_mode == db_async)
|
if(m_db_sync_mode == db_async)
|
||||||
{
|
{
|
||||||
m_sync_counter = 0;
|
m_sync_counter = 0;
|
||||||
|
m_bytes_to_sync = 0;
|
||||||
m_async_service.dispatch(boost::bind(&Blockchain::store_blockchain, this));
|
m_async_service.dispatch(boost::bind(&Blockchain::store_blockchain, this));
|
||||||
}
|
}
|
||||||
else if(m_db_sync_mode == db_sync)
|
else if(m_db_sync_mode == db_sync)
|
||||||
|
@ -4071,6 +4073,7 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::vector<block_complete
|
||||||
bytes += tx_blob.size();
|
bytes += tx_blob.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_bytes_to_sync += bytes;
|
||||||
while (!(stop_batch = m_db->batch_start(blocks_entry.size(), bytes))) {
|
while (!(stop_batch = m_db->batch_start(blocks_entry.size(), bytes))) {
|
||||||
m_blockchain_lock.unlock();
|
m_blockchain_lock.unlock();
|
||||||
m_tx_pool.unlock();
|
m_tx_pool.unlock();
|
||||||
|
@ -4419,7 +4422,7 @@ bool Blockchain::for_all_txpool_txes(std::function<bool(const crypto::hash&, con
|
||||||
return m_db->for_all_txpool_txes(f, include_blob, include_unrelayed_txes);
|
return m_db->for_all_txpool_txes(f, include_blob, include_unrelayed_txes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Blockchain::set_user_options(uint64_t maxthreads, uint64_t blocks_per_sync, blockchain_db_sync_mode sync_mode, bool fast_sync)
|
void Blockchain::set_user_options(uint64_t maxthreads, bool sync_on_blocks, uint64_t sync_threshold, blockchain_db_sync_mode sync_mode, bool fast_sync)
|
||||||
{
|
{
|
||||||
if (sync_mode == db_defaultsync)
|
if (sync_mode == db_defaultsync)
|
||||||
{
|
{
|
||||||
|
@ -4428,7 +4431,8 @@ void Blockchain::set_user_options(uint64_t maxthreads, uint64_t blocks_per_sync,
|
||||||
}
|
}
|
||||||
m_db_sync_mode = sync_mode;
|
m_db_sync_mode = sync_mode;
|
||||||
m_fast_sync = fast_sync;
|
m_fast_sync = fast_sync;
|
||||||
m_db_blocks_per_sync = blocks_per_sync;
|
m_db_sync_on_blocks = sync_on_blocks;
|
||||||
|
m_db_sync_threshold = sync_threshold;
|
||||||
m_max_prepare_blocks_threads = maxthreads;
|
m_max_prepare_blocks_threads = maxthreads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -729,11 +729,12 @@ namespace cryptonote
|
||||||
* @brief sets various performance options
|
* @brief sets various performance options
|
||||||
*
|
*
|
||||||
* @param maxthreads max number of threads when preparing blocks for addition
|
* @param maxthreads max number of threads when preparing blocks for addition
|
||||||
* @param blocks_per_sync number of blocks to cache before syncing to database
|
* @param sync_on_blocks whether to sync based on blocks or bytes
|
||||||
|
* @param sync_threshold number of blocks/bytes to cache before syncing to database
|
||||||
* @param sync_mode the ::blockchain_db_sync_mode to use
|
* @param sync_mode the ::blockchain_db_sync_mode to use
|
||||||
* @param fast_sync sync using built-in block hashes as trusted
|
* @param fast_sync sync using built-in block hashes as trusted
|
||||||
*/
|
*/
|
||||||
void set_user_options(uint64_t maxthreads, uint64_t blocks_per_sync,
|
void set_user_options(uint64_t maxthreads, bool sync_on_blocks, uint64_t sync_threshold,
|
||||||
blockchain_db_sync_mode sync_mode, bool fast_sync);
|
blockchain_db_sync_mode sync_mode, bool fast_sync);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1017,11 +1018,13 @@ namespace cryptonote
|
||||||
bool m_fast_sync;
|
bool m_fast_sync;
|
||||||
bool m_show_time_stats;
|
bool m_show_time_stats;
|
||||||
bool m_db_default_sync;
|
bool m_db_default_sync;
|
||||||
uint64_t m_db_blocks_per_sync;
|
bool m_db_sync_on_blocks;
|
||||||
|
uint64_t m_db_sync_threshold;
|
||||||
uint64_t m_max_prepare_blocks_threads;
|
uint64_t m_max_prepare_blocks_threads;
|
||||||
uint64_t m_fake_pow_calc_time;
|
uint64_t m_fake_pow_calc_time;
|
||||||
uint64_t m_fake_scan_time;
|
uint64_t m_fake_scan_time;
|
||||||
uint64_t m_sync_counter;
|
uint64_t m_sync_counter;
|
||||||
|
uint64_t m_bytes_to_sync;
|
||||||
std::vector<uint64_t> m_timestamps;
|
std::vector<uint64_t> m_timestamps;
|
||||||
std::vector<difficulty_type> m_difficulties;
|
std::vector<difficulty_type> m_difficulties;
|
||||||
uint64_t m_timestamps_and_difficulties_height;
|
uint64_t m_timestamps_and_difficulties_height;
|
||||||
|
|
|
@ -439,9 +439,10 @@ namespace cryptonote
|
||||||
MGINFO("Loading blockchain from folder " << folder.string() << " ...");
|
MGINFO("Loading blockchain from folder " << folder.string() << " ...");
|
||||||
|
|
||||||
const std::string filename = folder.string();
|
const std::string filename = folder.string();
|
||||||
// default to fast:async:1
|
// default to fast:async:1 if overridden
|
||||||
blockchain_db_sync_mode sync_mode = db_defaultsync;
|
blockchain_db_sync_mode sync_mode = db_defaultsync;
|
||||||
uint64_t blocks_per_sync = 1;
|
bool sync_on_blocks = true;
|
||||||
|
uint64_t sync_threshold = 1;
|
||||||
|
|
||||||
if (m_nettype == FAKECHAIN)
|
if (m_nettype == FAKECHAIN)
|
||||||
{
|
{
|
||||||
|
@ -491,7 +492,7 @@ namespace cryptonote
|
||||||
else if(options[0] == "fastest")
|
else if(options[0] == "fastest")
|
||||||
{
|
{
|
||||||
db_flags = DBF_FASTEST;
|
db_flags = DBF_FASTEST;
|
||||||
blocks_per_sync = 1000; // default to fastest:async:1000
|
sync_threshold = 1000; // default to fastest:async:1000
|
||||||
sync_mode = db_sync_mode_is_default ? db_defaultsync : db_async;
|
sync_mode = db_sync_mode_is_default ? db_defaultsync : db_async;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -509,9 +510,22 @@ namespace cryptonote
|
||||||
if(options.size() >= 3 && !safemode)
|
if(options.size() >= 3 && !safemode)
|
||||||
{
|
{
|
||||||
char *endptr;
|
char *endptr;
|
||||||
uint64_t bps = strtoull(options[2].c_str(), &endptr, 0);
|
uint64_t threshold = strtoull(options[2].c_str(), &endptr, 0);
|
||||||
if (*endptr == '\0')
|
if (*endptr == '\0' || !strcmp(endptr, "blocks"))
|
||||||
blocks_per_sync = bps;
|
{
|
||||||
|
sync_on_blocks = true;
|
||||||
|
sync_threshold = threshold;
|
||||||
|
}
|
||||||
|
else if (!strcmp(endptr, "bytes"))
|
||||||
|
{
|
||||||
|
sync_on_blocks = false;
|
||||||
|
sync_threshold = threshold;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERROR("Invalid db sync mode: " << options[2]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (db_salvage)
|
if (db_salvage)
|
||||||
|
@ -528,7 +542,7 @@ namespace cryptonote
|
||||||
}
|
}
|
||||||
|
|
||||||
m_blockchain_storage.set_user_options(blocks_threads,
|
m_blockchain_storage.set_user_options(blocks_threads,
|
||||||
blocks_per_sync, sync_mode, fast_sync);
|
sync_on_blocks, sync_threshold, sync_mode, fast_sync);
|
||||||
|
|
||||||
const std::pair<uint8_t, uint64_t> regtest_hard_forks[3] = {std::make_pair(1, 0), std::make_pair(Blockchain::get_hard_fork_heights(MAINNET).back().version, 1), std::make_pair(0, 0)};
|
const std::pair<uint8_t, uint64_t> regtest_hard_forks[3] = {std::make_pair(1, 0), std::make_pair(Blockchain::get_hard_fork_heights(MAINNET).back().version, 1), std::make_pair(0, 0)};
|
||||||
const cryptonote::test_options regtest_test_options = {
|
const cryptonote::test_options regtest_test_options = {
|
||||||
|
|
Loading…
Reference in a new issue