mirror of
https://github.com/monero-project/monero.git
synced 2025-12-22 07:10:46 -08:00
Use actual batch size for resize estimates
And optimize import startup: Remember start_height position during initial count_blocks pass to avoid having to reread entire file again to arrive at start_height
This commit is contained in:
@@ -230,11 +230,22 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
return false;
|
||||
}
|
||||
|
||||
uint64_t start_height = 1, seek_height;
|
||||
if (opt_resume)
|
||||
start_height = core.get_blockchain_storage().get_current_blockchain_height();
|
||||
|
||||
seek_height = start_height;
|
||||
BootstrapFile bootstrap;
|
||||
streampos pos;
|
||||
// BootstrapFile bootstrap(import_file_path);
|
||||
uint64_t total_source_blocks = bootstrap.count_blocks(import_file_path);
|
||||
uint64_t total_source_blocks = bootstrap.count_blocks(import_file_path, pos, seek_height);
|
||||
MINFO("bootstrap file last block number: " << total_source_blocks-1 << " (zero-based height) total blocks: " << total_source_blocks);
|
||||
|
||||
if (total_source_blocks-1 <= start_height)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << ENDL;
|
||||
std::cout << "Preparing to read blocks..." << ENDL;
|
||||
std::cout << ENDL;
|
||||
@@ -259,11 +270,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
block b;
|
||||
transaction tx;
|
||||
int quit = 0;
|
||||
uint64_t bytes_read = 0;
|
||||
|
||||
uint64_t start_height = 1;
|
||||
if (opt_resume)
|
||||
start_height = core.get_blockchain_storage().get_current_blockchain_height();
|
||||
uint64_t bytes_read;
|
||||
|
||||
// Note that a new blockchain will start with block number 0 (total blocks: 1)
|
||||
// due to genesis block being added at initialization.
|
||||
@@ -280,18 +287,35 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
|
||||
bool use_batch = opt_batch && !opt_verify;
|
||||
|
||||
if (use_batch)
|
||||
core.get_blockchain_storage().get_db().batch_start(db_batch_size);
|
||||
|
||||
MINFO("Reading blockchain from bootstrap file...");
|
||||
std::cout << ENDL;
|
||||
|
||||
std::list<block_complete_entry> blocks;
|
||||
|
||||
// Within the loop, we skip to start_height before we start adding.
|
||||
// TODO: Not a bottleneck, but we can use what's done in count_blocks() and
|
||||
// only do the chunk size reads, skipping the chunk content reads until we're
|
||||
// at start_height.
|
||||
// Skip to start_height before we start adding.
|
||||
{
|
||||
bool q2 = false;
|
||||
import_file.seekg(pos);
|
||||
bytes_read = bootstrap.count_bytes(import_file, start_height-seek_height, h, q2);
|
||||
if (q2)
|
||||
{
|
||||
quit = 2;
|
||||
goto quitting;
|
||||
}
|
||||
h = start_height;
|
||||
}
|
||||
|
||||
if (use_batch)
|
||||
{
|
||||
uint64_t bytes, h2;
|
||||
bool q2;
|
||||
pos = import_file.tellg();
|
||||
bytes = bootstrap.count_bytes(import_file, db_batch_size, h2, q2);
|
||||
if (import_file.eof())
|
||||
import_file.clear();
|
||||
import_file.seekg(pos);
|
||||
core.get_blockchain_storage().get_db().batch_start(db_batch_size, bytes);
|
||||
}
|
||||
while (! quit)
|
||||
{
|
||||
uint32_t chunk_size;
|
||||
@@ -344,11 +368,6 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
bytes_read += chunk_size;
|
||||
MDEBUG("Total bytes read: " << bytes_read);
|
||||
|
||||
if (h + NUM_BLOCKS_PER_CHUNK < start_height + 1)
|
||||
{
|
||||
h += NUM_BLOCKS_PER_CHUNK;
|
||||
continue;
|
||||
}
|
||||
if (h > block_stop)
|
||||
{
|
||||
std::cout << refresh_string << "block " << h-1
|
||||
@@ -456,11 +475,16 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
{
|
||||
if ((h-1) % db_batch_size == 0)
|
||||
{
|
||||
uint64_t bytes, h2;
|
||||
bool q2;
|
||||
std::cout << refresh_string;
|
||||
// zero-based height
|
||||
std::cout << ENDL << "[- batch commit at height " << h-1 << " -]" << ENDL;
|
||||
core.get_blockchain_storage().get_db().batch_stop();
|
||||
core.get_blockchain_storage().get_db().batch_start(db_batch_size);
|
||||
pos = import_file.tellg();
|
||||
bytes = bootstrap.count_bytes(import_file, db_batch_size, h2, q2);
|
||||
import_file.seekg(pos);
|
||||
core.get_blockchain_storage().get_db().batch_start(db_batch_size, bytes);
|
||||
std::cout << ENDL;
|
||||
core.get_blockchain_storage().get_db().show_stats();
|
||||
}
|
||||
@@ -477,6 +501,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
||||
}
|
||||
} // while
|
||||
|
||||
quitting:
|
||||
import_file.close();
|
||||
|
||||
if (opt_verify)
|
||||
|
||||
Reference in New Issue
Block a user