blockchain_converter: Add support for resume from last block

Add option "--resume <on|off>" where default is on.
This commit is contained in:
warptangent 2015-03-22 12:33:50 -07:00
parent 488080326c
commit dbdcf11778
No known key found for this signature in database
GPG Key ID: 0E490BEBFBE4E92D

View File

@ -44,14 +44,19 @@
#include "version.h" #include "version.h"
#include <iostream> #include <iostream>
namespace
{
// CONFIG // CONFIG
static bool opt_batch = true; bool opt_batch = true;
static bool opt_testnet = false; bool opt_resume = true;
bool opt_testnet = false;
// number of blocks per batch transaction // number of blocks per batch transaction
// adjustable through command-line argument according to available RAM // adjustable through command-line argument according to available RAM
static uint64_t db_batch_size = 20000; uint64_t db_batch_size = 20000;
}
namespace po = boost::program_options; namespace po = boost::program_options;
@ -113,11 +118,14 @@ int main(int argc, char* argv[])
const command_line::arg_descriptor<bool> arg_batch = {"batch", const command_line::arg_descriptor<bool> arg_batch = {"batch",
"Batch transactions for faster import", true}; "Batch transactions for faster import", true};
const command_line::arg_descriptor<bool> arg_resume = {"resume",
"Resume from current height if output database already exists", true};
// call add_options() directly for these arguments since command_line helpers // call add_options() directly for these arguments since command_line helpers
// support only boolean switch, not boolean argument // support only boolean switch, not boolean argument
desc_cmd_sett.add_options() desc_cmd_sett.add_options()
(arg_batch.name, make_semantic(arg_batch), arg_batch.description) (arg_batch.name, make_semantic(arg_batch), arg_batch.description)
(arg_resume.name, make_semantic(arg_resume), arg_resume.description)
; ;
po::options_description desc_options("Allowed options"); po::options_description desc_options("Allowed options");
@ -137,6 +145,7 @@ int main(int argc, char* argv[])
int log_level = command_line::get_arg(vm, arg_log_level); int log_level = command_line::get_arg(vm, arg_log_level);
opt_batch = command_line::get_arg(vm, arg_batch); opt_batch = command_line::get_arg(vm, arg_batch);
opt_resume = command_line::get_arg(vm, arg_resume);
db_batch_size = command_line::get_arg(vm, arg_batch_size); db_batch_size = command_line::get_arg(vm, arg_batch_size);
if (command_line::get_arg(vm, command_line::arg_help)) if (command_line::get_arg(vm, command_line::arg_help))
@ -178,23 +187,41 @@ int main(int argc, char* argv[])
{ {
LOG_PRINT_L0("batch: " << std::boolalpha << opt_batch << std::noboolalpha); LOG_PRINT_L0("batch: " << std::boolalpha << opt_batch << std::noboolalpha);
} }
LOG_PRINT_L0("resume: " << std::boolalpha << opt_resume << std::noboolalpha);
LOG_PRINT_L0("testnet: " << std::boolalpha << opt_testnet << std::noboolalpha); LOG_PRINT_L0("testnet: " << std::boolalpha << opt_testnet << std::noboolalpha);
fake_core c(src_folder, opt_testnet); fake_core c(src_folder, opt_testnet);
height = c.m_storage.get_current_blockchain_height(); height = c.m_storage.get_current_blockchain_height();
if (! num_blocks || num_blocks > height)
end_block = height - 1;
else
end_block = start_block + num_blocks - 1;
BlockchainDB *blockchain; BlockchainDB *blockchain;
blockchain = new BlockchainLMDB(opt_batch); blockchain = new BlockchainLMDB(opt_batch);
dest_folder /= blockchain->get_db_name(); dest_folder /= blockchain->get_db_name();
LOG_PRINT_L0("Source blockchain: " << src_folder); LOG_PRINT_L0("Source blockchain: " << src_folder);
LOG_PRINT_L0("Dest blockchain: " << dest_folder.string()); LOG_PRINT_L0("Dest blockchain: " << dest_folder.string());
LOG_PRINT_L0("Opening LMDB: " << dest_folder.string()); LOG_PRINT_L0("Opening dest blockchain (BlockchainDB " << blockchain->get_db_name() << ")");
blockchain->open(dest_folder.string()); blockchain->open(dest_folder.string());
LOG_PRINT_L0("Source blockchain height: " << height);
LOG_PRINT_L0("Dest blockchain height: " << blockchain->height());
if (opt_resume)
// next block number to add is same as current height
start_block = blockchain->height();
if (! num_blocks || (start_block + num_blocks > height))
end_block = height - 1;
else
end_block = start_block + num_blocks - 1;
LOG_PRINT_L0("start height: " << start_block+1 << " stop height: " <<
end_block+1);
if (start_block > end_block)
{
LOG_PRINT_L0("Finished: no blocks to add");
delete blockchain;
return 0;
}
if (opt_batch) if (opt_batch)
blockchain->batch_start(); blockchain->batch_start();
@ -247,7 +274,7 @@ int main(int argc, char* argv[])
catch (const std::exception& e) catch (const std::exception& e)
{ {
std::cout << ENDL; std::cout << ENDL;
std::cerr << "Error adding block to new blockchain: " << e.what() << ENDL; std::cerr << "Error adding block " << i << " to new blockchain: " << e.what() << ENDL;
delete blockchain; delete blockchain;
return 2; return 2;
} }