diff --git a/external/db_drivers/liblmdb/midl.h b/external/db_drivers/liblmdb/midl.h index ed1d75e3..e16aa0c3 100644 --- a/external/db_drivers/liblmdb/midl.h +++ b/external/db_drivers/liblmdb/midl.h @@ -61,7 +61,7 @@ typedef MDB_ID *MDB_IDL; * limiting factors: sizeof(ID), thread stack size */ #ifdef MDB_VL32 -#define MDB_IDL_LOGN 10 /* DB_SIZE is 2^10, UM_SIZE is 2^11 */ +#define MDB_IDL_LOGN 14 /* DB_SIZE is 2^14, UM_SIZE is 2^15 */ #else #define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */ #endif diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp index 5119be3f..b43d5742 100644 --- a/src/blockchain_db/lmdb/db_lmdb.cpp +++ b/src/blockchain_db/lmdb/db_lmdb.cpp @@ -764,7 +764,7 @@ void BlockchainLMDB::remove_tx_outputs(const crypto::hash& tx_hash, const transa } else { - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP); @@ -848,7 +848,7 @@ void BlockchainLMDB::remove_amount_output_index(const uint64_t amount, const uin else if (result) throw0(DB_ERROR("DB error attempting to get an output")); - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP); @@ -1777,7 +1777,7 @@ uint64_t BlockchainLMDB::get_num_outputs(const uint64_t& amount) const else if (result) throw0(DB_ERROR("DB error attempting to get number of outputs of an amount")); - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); TXN_POSTFIX_SUCCESS(); @@ -1873,7 +1873,7 @@ std::vector BlockchainLMDB::get_tx_output_indices(const crypto::hash& else if (result) throw0(DB_ERROR("DB error attempting to get an output")); - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); mdb_cursor_get(cur, &k, &v, MDB_FIRST_DUP); @@ -1925,7 +1925,7 @@ std::vector BlockchainLMDB::get_tx_amount_output_indices(const crypto: else if (result) throw0(DB_ERROR("DB error attempting to get an output")); - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); mdb_cursor_get(cur, &k, &v, MDB_FIRST_DUP); @@ -2441,7 +2441,7 @@ void BlockchainLMDB::get_output_global_indices(const uint64_t& amount, const std else if (result) throw0(DB_ERROR("DB error attempting to get an output")); - size_t num_elems = 0; + mdb_size_t num_elems = 0; mdb_cursor_count(cur, &num_elems); if (max <= 1 && num_elems <= max) throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but output not found")); @@ -2475,22 +2475,51 @@ void BlockchainLMDB::get_output_global_indices(const uint64_t& amount, const std LOG_PRINT_L1("Index: " << index << " Elems: " << num_elems << " partial results found for get_output_tx_and_index"); break; } - while (index >= curcount) + if (!curcount && index > num_elems/2) { - TIME_MEASURE_START(db1); - if (mdb_cursor_get(cur, &k, &v, curcount == 0 ? MDB_GET_MULTIPLE : MDB_NEXT_MULTIPLE) != 0) + mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP); + mdb_cursor_get(cur, &k, &v, MDB_PREV); /* kludge to unset C_EOF */ + mdb_cursor_get(cur, &k, &v, MDB_NEXT); + mdb_cursor_get(cur, &k, &v, MDB_GET_MULTIPLE); + + curcount = num_elems; + while(1) { - // allow partial results - result = false; - break; + TIME_MEASURE_START(db1); + int count = v.mv_size / sizeof(uint64_t); + curcount -= count; + if (curcount > index) + { + mdb_cursor_get(cur, &k, &v, MDB_PREV_MULTIPLE); + } else + { + blockstart = curcount; + curcount += count; + break; + } + TIME_MEASURE_FINISH(db1); + t_dbmul += db1; } - int count = v.mv_size / sizeof(uint64_t); + } else + { + while (index >= curcount) + { + TIME_MEASURE_START(db1); + if (mdb_cursor_get(cur, &k, &v, curcount == 0 ? MDB_GET_MULTIPLE : MDB_NEXT_MULTIPLE) != 0) + { + // allow partial results + result = false; + break; + } - blockstart = curcount; - curcount += count; - TIME_MEASURE_FINISH(db1); - t_dbmul += db1; + int count = v.mv_size / sizeof(uint64_t); + + blockstart = curcount; + curcount += count; + TIME_MEASURE_FINISH(db1); + t_dbmul += db1; + } } LOG_PRINT_L3("Records returned: " << curcount << " Index: " << index); diff --git a/src/blockchain_utilities/fake_core.h b/src/blockchain_utilities/fake_core.h index 20a3361b..2fb5031d 100644 --- a/src/blockchain_utilities/fake_core.h +++ b/src/blockchain_utilities/fake_core.h @@ -33,7 +33,9 @@ #include "cryptonote_core/blockchain_storage.h" // in-memory DB #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 using namespace cryptonote;