Merge pull request #673

9218cad Fix cffc411c90 (Howard Chu)
8860b74 MDB_VL32 - increase max write txn size (Howard Chu)
02abe35 Use MDB_PREV_MULTIPLE (Howard Chu)
7a4755d Fixup after lmdb master resync (Howard Chu)
This commit is contained in:
Riccardo Spagni 2016-02-18 10:00:31 +02:00
commit 6a48d85047
No known key found for this signature in database
GPG key ID: 55432DF31CCD4FCD
3 changed files with 49 additions and 18 deletions

View file

@ -61,7 +61,7 @@ typedef MDB_ID *MDB_IDL;
* limiting factors: sizeof(ID), thread stack size * limiting factors: sizeof(ID), thread stack size
*/ */
#ifdef MDB_VL32 #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 #else
#define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */ #define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */
#endif #endif

View file

@ -764,7 +764,7 @@ void BlockchainLMDB::remove_tx_outputs(const crypto::hash& tx_hash, const transa
} }
else else
{ {
size_t num_elems = 0; mdb_size_t num_elems = 0;
mdb_cursor_count(cur, &num_elems); mdb_cursor_count(cur, &num_elems);
mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP); 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) else if (result)
throw0(DB_ERROR("DB error attempting to get an output")); 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_count(cur, &num_elems);
mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP); 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) else if (result)
throw0(DB_ERROR("DB error attempting to get number of outputs of an amount")); 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); mdb_cursor_count(cur, &num_elems);
TXN_POSTFIX_SUCCESS(); TXN_POSTFIX_SUCCESS();
@ -1873,7 +1873,7 @@ std::vector<uint64_t> BlockchainLMDB::get_tx_output_indices(const crypto::hash&
else if (result) else if (result)
throw0(DB_ERROR("DB error attempting to get an output")); 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_count(cur, &num_elems);
mdb_cursor_get(cur, &k, &v, MDB_FIRST_DUP); mdb_cursor_get(cur, &k, &v, MDB_FIRST_DUP);
@ -1925,7 +1925,7 @@ std::vector<uint64_t> BlockchainLMDB::get_tx_amount_output_indices(const crypto:
else if (result) else if (result)
throw0(DB_ERROR("DB error attempting to get an output")); 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_count(cur, &num_elems);
mdb_cursor_get(cur, &k, &v, MDB_FIRST_DUP); 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) else if (result)
throw0(DB_ERROR("DB error attempting to get an output")); 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_count(cur, &num_elems);
if (max <= 1 && num_elems <= max) if (max <= 1 && num_elems <= max)
throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but output not found")); 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"); LOG_PRINT_L1("Index: " << index << " Elems: " << num_elems << " partial results found for get_output_tx_and_index");
break; break;
} }
while (index >= curcount) if (!curcount && index > num_elems/2)
{ {
TIME_MEASURE_START(db1); mdb_cursor_get(cur, &k, &v, MDB_LAST_DUP);
if (mdb_cursor_get(cur, &k, &v, curcount == 0 ? MDB_GET_MULTIPLE : MDB_NEXT_MULTIPLE) != 0) 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 TIME_MEASURE_START(db1);
result = false; int count = v.mv_size / sizeof(uint64_t);
break; 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; int count = v.mv_size / sizeof(uint64_t);
curcount += count;
TIME_MEASURE_FINISH(db1); blockstart = curcount;
t_dbmul += db1; curcount += count;
TIME_MEASURE_FINISH(db1);
t_dbmul += db1;
}
} }
LOG_PRINT_L3("Records returned: " << curcount << " Index: " << index); LOG_PRINT_L3("Records returned: " << curcount << " Index: " << index);

View file

@ -33,7 +33,9 @@
#include "cryptonote_core/blockchain_storage.h" // in-memory DB #include "cryptonote_core/blockchain_storage.h" // in-memory DB
#include "blockchain_db/blockchain_db.h" #include "blockchain_db/blockchain_db.h"
#include "blockchain_db/lmdb/db_lmdb.h" #include "blockchain_db/lmdb/db_lmdb.h"
#if defined(BERKELEY_DB)
#include "blockchain_db/berkeleydb/db_bdb.h" #include "blockchain_db/berkeleydb/db_bdb.h"
#endif
using namespace cryptonote; using namespace cryptonote;