aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/blockchain_utilities/blockchain_import.cpp113
1 files changed, 82 insertions, 31 deletions
diff --git a/src/blockchain_utilities/blockchain_import.cpp b/src/blockchain_utilities/blockchain_import.cpp
index 965b01f1d..8506bd045 100644
--- a/src/blockchain_utilities/blockchain_import.cpp
+++ b/src/blockchain_utilities/blockchain_import.cpp
@@ -78,6 +78,31 @@ using namespace cryptonote;
using namespace epee;
+// 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)
+{
+ 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;
+ else if (db_mode == "fast")
+ db_flags = islmdb ? MDB_NOMETASYNC | MDB_NOSYNC | MDB_NORDAHEAD : BDB_FAST_MODE;
+ else if (db_mode == "fastest")
+ db_flags = islmdb ? MDB_WRITEMAP | MDB_MAPASYNC | MDB_NORDAHEAD | MDB_NOMETASYNC | MDB_NOSYNC : BDB_FASTEST_MODE;
+ return db_flags;
+}
+
int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int& db_flags)
{
std::vector<std::string> db_args;
@@ -95,45 +120,71 @@ 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")
+ {
+ LOG_ERROR("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(","));
- for (auto& it : db_args)
+
+ // optionally use a composite mode instead of individual flags
+ const std::unordered_set<std::string> db_modes {"safe", "fast", "fastest"};
+ std::string db_mode;
+ if (db_args.size() == 1)
{
- boost::algorithm::trim(it);
- if (it.empty())
- continue;
- if (db_type == "lmdb")
+ if (db_modes.count(db_args[0]) > 0)
+ {
+ db_mode = db_args[0];
+ }
+ }
+ if (! db_mode.empty())
+ {
+ db_flags = get_db_flags_from_mode(db_type, db_mode);
+ }
+ else
+ {
+ for (auto& it : db_args)
{
- LOG_PRINT_L1("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
+ boost::algorithm::trim(it);
+ if (it.empty())
+ continue;
+ if (db_type == "lmdb")
{
- std::cerr << "unrecognized database flag: " << it << ENDL;
- return 1;
+ LOG_PRINT_L1("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
+ else if (db_type == "berkeley")
{
- std::cerr << "unrecognized database flag: " << it << ENDL;
- return 1;
+ 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
}