aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_utilities
diff options
context:
space:
mode:
Diffstat (limited to 'src/blockchain_utilities')
-rw-r--r--src/blockchain_utilities/blockchain_export.cpp46
-rw-r--r--src/blockchain_utilities/blockchain_import.cpp174
-rw-r--r--src/blockchain_utilities/blockchain_utilities.h1
-rw-r--r--src/blockchain_utilities/blocksdat_file.h1
-rw-r--r--src/blockchain_utilities/bootstrap_file.cpp4
5 files changed, 44 insertions, 182 deletions
diff --git a/src/blockchain_utilities/blockchain_export.cpp b/src/blockchain_utilities/blockchain_export.cpp
index f145bc107..20eca09f2 100644
--- a/src/blockchain_utilities/blockchain_export.cpp
+++ b/src/blockchain_utilities/blockchain_export.cpp
@@ -31,10 +31,6 @@
#include "common/command_line.h"
#include "cryptonote_core/tx_pool.h"
#include "blockchain_db/blockchain_db.h"
-#include "blockchain_db/lmdb/db_lmdb.h"
-#if defined(BERKELEY_DB)
-#include "blockchain_db/berkeleydb/db_bdb.h"
-#endif
#include "blockchain_db/db_types.h"
#include "version.h"
@@ -44,17 +40,6 @@
namespace po = boost::program_options;
using namespace epee;
-std::string join_set_strings(const std::unordered_set<std::string>& db_types_all, const char* delim)
-{
- std::string result;
- std::ostringstream s;
- std::copy(db_types_all.begin(), db_types_all.end(), std::ostream_iterator<std::string>(s, delim));
- result = s.str();
- if (result.length() > 0)
- result.erase(result.end()-strlen(delim), result.end());
- return result;
-}
-
int main(int argc, char* argv[])
{
TRY_ENTRY();
@@ -63,10 +48,7 @@ int main(int argc, char* argv[])
std::string default_db_type = "lmdb";
- std::unordered_set<std::string> db_types_all = cryptonote::blockchain_db_types;
- db_types_all.insert("memory");
-
- std::string available_dbs = join_set_strings(db_types_all, ", ");
+ std::string available_dbs = cryptonote::blockchain_db_types(", ");
available_dbs = "available: " + available_dbs;
uint32_t log_level = 0;
@@ -144,18 +126,11 @@ int main(int argc, char* argv[])
m_config_folder = command_line::get_arg(vm, data_dir_arg);
std::string db_type = command_line::get_arg(vm, arg_database);
- if (db_types_all.count(db_type) == 0)
+ if (!cryptonote::blockchain_valid_db_type(db_type))
{
std::cerr << "Invalid database type: " << db_type << std::endl;
return 1;
}
-#if !defined(BERKELEY_DB)
- if (db_type == "berkeley")
- {
- LOG_ERROR("BerkeleyDB support disabled.");
- return false;
- }
-#endif
if (command_line::has_arg(vm, arg_output_file))
output_file_path = boost::filesystem::path(command_line::get_arg(vm, arg_output_file));
@@ -179,19 +154,8 @@ int main(int argc, char* argv[])
tx_memory_pool m_mempool(*core_storage);
core_storage = new Blockchain(m_mempool);
- int db_flags = 0;
-
- BlockchainDB* db = nullptr;
- if (db_type == "lmdb")
- {
- db_flags |= MDB_RDONLY;
- db = new BlockchainLMDB();
- }
-#if defined(BERKELEY_DB)
- else if (db_type == "berkeley")
- db = new BlockchainBDB();
-#endif
- else
+ BlockchainDB* db = new_db(db_type);
+ if (db == NULL)
{
LOG_ERROR("Attempted to use non-existent database type: " << db_type);
throw std::runtime_error("Attempting to use non-existent database type");
@@ -205,7 +169,7 @@ int main(int argc, char* argv[])
LOG_PRINT_L0("Loading blockchain from folder " << filename << " ...");
try
{
- db->open(filename, db_flags);
+ db->open(filename, DBF_RDONLY);
}
catch (const std::exception& e)
{
diff --git a/src/blockchain_utilities/blockchain_import.cpp b/src/blockchain_utilities/blockchain_import.cpp
index 6f908c799..635a70b10 100644
--- a/src/blockchain_utilities/blockchain_import.cpp
+++ b/src/blockchain_utilities/blockchain_import.cpp
@@ -42,8 +42,6 @@
#include "blockchain_db/db_types.h"
#include "cryptonote_core/cryptonote_core.h"
-#include <lmdb.h> // for db flag arguments
-
#undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "bcutil"
@@ -78,40 +76,16 @@ namespace po = boost::program_options;
using namespace cryptonote;
using namespace epee;
-
-std::string join_set_strings(const std::unordered_set<std::string>& db_types_all, const char* delim)
-{
- std::string result;
- std::ostringstream s;
- std::copy(db_types_all.begin(), db_types_all.end(), std::ostream_iterator<std::string>(s, delim));
- result = s.str();
- if (result.length() > 0)
- result.erase(result.end()-strlen(delim), result.end());
- return result;
-}
-
-// db_type: lmdb, berkeley
// db_mode: safe, fast, fastest
-int get_db_flags_from_mode(const std::string& db_type, const std::string& db_mode)
+int get_db_flags_from_mode(const std::string& db_mode)
{
- uint64_t BDB_FAST_MODE = 0;
- uint64_t BDB_FASTEST_MODE = 0;
- uint64_t BDB_SAFE_MODE = 0;
-
-#if defined(BERKELEY_DB)
- BDB_FAST_MODE = DB_TXN_WRITE_NOSYNC;
- BDB_FASTEST_MODE = DB_TXN_NOSYNC;
- BDB_SAFE_MODE = DB_TXN_SYNC;
-#endif
-
int db_flags = 0;
- bool islmdb = db_type == "lmdb";
if (db_mode == "safe")
- db_flags = islmdb ? MDB_NORDAHEAD : BDB_SAFE_MODE;
+ db_flags = DBF_SAFE;
else if (db_mode == "fast")
- db_flags = islmdb ? MDB_NOMETASYNC | MDB_NOSYNC | MDB_NORDAHEAD : BDB_FAST_MODE;
+ db_flags = DBF_FAST;
else if (db_mode == "fastest")
- db_flags = islmdb ? MDB_WRITEMAP | MDB_MAPASYNC | MDB_NORDAHEAD | MDB_NOMETASYNC | MDB_NOSYNC : BDB_FASTEST_MODE;
+ db_flags = DBF_FASTEST;
return db_flags;
}
@@ -132,14 +106,6 @@ int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int&
return 1;
}
-#if !defined(BERKELEY_DB)
- if (db_type == "berkeley")
- {
- MFATAL("BerkeleyDB support disabled.");
- return false;
- }
-#endif
-
std::string db_arg_str2 = db_args[1];
boost::split(db_args, db_arg_str2, boost::is_any_of(","));
@@ -155,51 +121,7 @@ int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int&
}
if (! db_mode.empty())
{
- db_flags = get_db_flags_from_mode(db_type, db_mode);
- }
- else
- {
- for (auto& it : db_args)
- {
- boost::algorithm::trim(it);
- if (it.empty())
- continue;
- if (db_type == "lmdb")
- {
- MINFO("LMDB flag: " << it);
- if (it == "nosync")
- db_flags |= MDB_NOSYNC;
- else if (it == "nometasync")
- db_flags |= MDB_NOMETASYNC;
- else if (it == "writemap")
- db_flags |= MDB_WRITEMAP;
- else if (it == "mapasync")
- db_flags |= MDB_MAPASYNC;
- else if (it == "nordahead")
- db_flags |= MDB_NORDAHEAD;
- else
- {
- std::cerr << "unrecognized database flag: " << it << ENDL;
- return 1;
- }
- }
-#if defined(BERKELEY_DB)
- else if (db_type == "berkeley")
- {
- if (it == "txn_write_nosync")
- db_flags = DB_TXN_WRITE_NOSYNC;
- else if (it == "txn_nosync")
- db_flags = DB_TXN_NOSYNC;
- else if (it == "txn_sync")
- db_flags = DB_TXN_SYNC;
- else
- {
- std::cerr << "unrecognized database flag: " << it << ENDL;
- return 1;
- }
- }
-#endif
- }
+ db_flags = get_db_flags_from_mode(db_mode);
}
return 0;
}
@@ -286,7 +208,8 @@ int check_flush(cryptonote::core &core, std::list<block_complete_entry> &blocks,
}
} // each download block
- core.cleanup_handle_incoming_blocks();
+ if (!core.cleanup_handle_incoming_blocks())
+ return 1;
blocks.clear();
return 0;
@@ -394,9 +317,9 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
MWARNING("WARNING: chunk_size " << chunk_size << " > BUFFER_SIZE " << BUFFER_SIZE);
throw std::runtime_error("Aborting: chunk size exceeds buffer size");
}
- if (chunk_size > 100000)
+ if (chunk_size > CHUNK_SIZE_WARNING_THRESHOLD)
{
- MINFO("NOTE: chunk_size " << chunk_size << " > 100000");
+ MINFO("NOTE: chunk_size " << chunk_size << " > " << CHUNK_SIZE_WARNING_THRESHOLD);
}
else if (chunk_size == 0) {
MFATAL("ERROR: chunk_size == 0");
@@ -404,9 +327,19 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
}
import_file.read(buffer_block, chunk_size);
if (! import_file) {
- MFATAL("ERROR: unexpected end of file: bytes read before error: "
- << import_file.gcount() << " of chunk_size " << chunk_size);
- return 2;
+ if (import_file.eof())
+ {
+ std::cout << refresh_string;
+ MINFO("End of file reached - file was truncated");
+ quit = 1;
+ break;
+ }
+ else
+ {
+ MFATAL("ERROR: unexpected end of file: bytes read before error: "
+ << import_file.gcount() << " of chunk_size " << chunk_size);
+ return 2;
+ }
}
bytes_read += chunk_size;
MDEBUG("Total bytes read: " << bytes_read);
@@ -472,7 +405,10 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
blocks.push_back({block, txs});
int ret = check_flush(core, blocks, false);
if (ret)
+ {
+ quit = 2; // make sure we don't commit partial block data
break;
+ }
}
else
{
@@ -580,12 +516,8 @@ int main(int argc, char* argv[])
epee::string_tools::set_module_name_and_folder(argv[0]);
std::string default_db_type = "lmdb";
- std::string default_db_engine_compiled = "blockchain_db";
-
- std::unordered_set<std::string> db_types_all = cryptonote::blockchain_db_types;
- db_types_all.insert("memory");
- std::string available_dbs = join_set_strings(db_types_all, ", ");
+ std::string available_dbs = cryptonote::blockchain_db_types(", ");
available_dbs = "available: " + available_dbs;
uint32_t log_level = 0;
@@ -731,7 +663,6 @@ int main(int argc, char* argv[])
std::string db_type;
- std::string db_engine_compiled;
int db_flags = 0;
int res = 0;
res = parse_db_arguments(db_arg_str, db_type, db_flags);
@@ -741,25 +672,12 @@ int main(int argc, char* argv[])
return 1;
}
- if (db_types_all.count(db_type) == 0)
+ if (!cryptonote::blockchain_valid_db_type(db_type))
{
std::cerr << "Invalid database type: " << db_type << std::endl;
return 1;
}
- if ((db_type == "lmdb")
-#if defined(BERKELEY_DB)
- || (db_type == "berkeley")
-#endif
- )
- {
- db_engine_compiled = "blockchain_db";
- }
- else
- {
- db_engine_compiled = "memory";
- }
-
MINFO("database: " << db_type);
MINFO("database flags: " << db_flags);
MINFO("verify: " << std::boolalpha << opt_verify << std::noboolalpha);
@@ -778,28 +696,12 @@ int main(int argc, char* argv[])
MINFO("bootstrap file path: " << import_file_path);
MINFO("database path: " << m_config_folder);
- try
- {
+ cryptonote::cryptonote_protocol_stub pr; //TODO: stub only for this kind of test, make real validation of relayed objects
+ cryptonote::core core(&pr);
- // fake_core needed for verification to work when enabled.
- //
- // NOTE: don't need fake_core method of doing things when we're going to call
- // BlockchainDB add_block() directly and have available the 3 block
- // properties to do so. Both ways work, but fake core isn't necessary in that
- // circumstance.
-
- if (db_type != "lmdb"
-#if defined(BERKELEY_DB)
- && db_type != "berkeley"
-#endif
- )
+ try
{
- std::cerr << "database type unrecognized" << ENDL;
- return 1;
- }
- cryptonote::cryptonote_protocol_stub pr; //TODO: stub only for this kind of test, make real validation of relayed objects
- cryptonote::core core(&pr);
core.disable_dns_checkpoints(true);
if (!core.init(vm, NULL))
{
@@ -827,23 +729,19 @@ int main(int argc, char* argv[])
import_from_file(core, import_file_path, block_stop);
+ // ensure db closed
+ // - transactions properly checked and handled
+ // - disk sync if needed
+ //
+ core.deinit();
}
catch (const DB_ERROR& e)
{
std::cout << std::string("Error loading blockchain db: ") + e.what() + " -- shutting down now" << ENDL;
+ core.deinit();
return 1;
}
- // destructors called at exit:
- //
- // ensure db closed
- // - transactions properly checked and handled
- // - disk sync if needed
- //
- // fake_core object's destructor is called when it goes out of scope. For an
- // LMDB fake_core, it calls Blockchain::deinit() on its object, which in turn
- // calls delete on its BlockchainDB derived class' object, which closes its
- // files.
return 0;
CATCH_ENTRY("Import error", 1);
diff --git a/src/blockchain_utilities/blockchain_utilities.h b/src/blockchain_utilities/blockchain_utilities.h
index af934bf29..6fb5e1131 100644
--- a/src/blockchain_utilities/blockchain_utilities.h
+++ b/src/blockchain_utilities/blockchain_utilities.h
@@ -34,6 +34,7 @@
// bounds checking is done before writing to buffer, but buffer size
// should be a sensible maximum
#define BUFFER_SIZE 1000000
+#define CHUNK_SIZE_WARNING_THRESHOLD 500000
#define NUM_BLOCKS_PER_CHUNK 1
#define BLOCKCHAIN_RAW "blockchain.raw"
diff --git a/src/blockchain_utilities/blocksdat_file.h b/src/blockchain_utilities/blocksdat_file.h
index 4e9d8173b..0a5913058 100644
--- a/src/blockchain_utilities/blocksdat_file.h
+++ b/src/blockchain_utilities/blocksdat_file.h
@@ -38,7 +38,6 @@
#include "cryptonote_basic/cryptonote_boost_serialization.h"
#include "cryptonote_core/blockchain.h"
#include "blockchain_db/blockchain_db.h"
-#include "blockchain_db/lmdb/db_lmdb.h"
#include <algorithm>
#include <cstdio>
diff --git a/src/blockchain_utilities/bootstrap_file.cpp b/src/blockchain_utilities/bootstrap_file.cpp
index d5bb37d93..2b1a5d6c7 100644
--- a/src/blockchain_utilities/bootstrap_file.cpp
+++ b/src/blockchain_utilities/bootstrap_file.cpp
@@ -436,10 +436,10 @@ uint64_t BootstrapFile::count_blocks(const std::string& import_file_path)
<< " height: " << h-1);
throw std::runtime_error("Aborting: chunk size exceeds buffer size");
}
- if (chunk_size > 100000)
+ if (chunk_size > CHUNK_SIZE_WARNING_THRESHOLD)
{
std::cout << refresh_string;
- MDEBUG("NOTE: chunk_size " << chunk_size << " > 100000" << " height: "
+ MDEBUG("NOTE: chunk_size " << chunk_size << " > " << CHUNK_SIZE_WARNING_THRESHOLD << " << height: "
<< h-1);
}
else if (chunk_size <= 0) {