mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-27 21:33:27 +01:00
Merge pull request #673
9218cad
Fixcffc411c90
(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:
commit
6a48d85047
2
external/db_drivers/liblmdb/midl.h
vendored
2
external/db_drivers/liblmdb/midl.h
vendored
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user