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:
moneromooo-monero 2018-08-01 10:09:35 +00:00
parent 0dddfeacc9
commit b278b83860
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
4 changed files with 37 additions and 16 deletions

View File

@ -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"

View File

@ -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;
} }

View File

@ -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;

View File

@ -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 = {