blockchain_import: Add mode argument representing multiple DB flags

These modes match those optionally provided as part of the daemon's
--db-type argument.

Argument after the # is interpreted as a composite mode if there's only
one (no comma separated arguments).

Sample usage:

blockchain_import --database lmdb#fastest

blockchain_import --database berkeley#fastest

Multiple specific DB flags are still supported, e.g.

blockchain_import --database lmdb#nosync,nordahead

blockchain_import --database berkeley#txn_nosync
This commit is contained in:
warptangent 2016-02-14 13:04:38 -08:00
parent cffc411c90
commit 1aa8a9d26f
No known key found for this signature in database
GPG key ID: 0E490BEBFBE4E92D

View file

@ -78,6 +78,31 @@ using namespace cryptonote;
using namespace epee; 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) int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int& db_flags)
{ {
std::vector<std::string> db_args; 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; 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]; std::string db_arg_str2 = db_args[1];
boost::split(db_args, db_arg_str2, boost::is_any_of(",")); 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 (db_modes.count(db_args[0]) > 0)
if (it.empty())
continue;
if (db_type == "lmdb")
{ {
LOG_PRINT_L1("LMDB flag: " << it); db_mode = db_args[0];
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 (! db_mode.empty())
{
db_flags = get_db_flags_from_mode(db_type, db_mode);
}
else
{
for (auto& it : db_args)
{ {
if (it == "txn_write_nosync") boost::algorithm::trim(it);
db_flags = DB_TXN_WRITE_NOSYNC; if (it.empty())
else if (it == "txn_nosync") continue;
db_flags = DB_TXN_NOSYNC; if (db_type == "lmdb")
else if (it == "txn_sync")
db_flags = DB_TXN_SYNC;
else
{ {
std::cerr << "unrecognized database flag: " << it << ENDL; LOG_PRINT_L1("LMDB flag: " << it);
return 1; 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 #endif
} }