mirror of
https://github.com/oxen-io/oxen-core.git
synced 2023-12-14 02:22:56 +01:00
LMDB - code improvements
Various code improvements to LMDB code (no logic changes): - compile less code by moving the cursor macros (which are used often) into local functions - removes the TXN_POSTFIX_RDONLY macro because it does exactly nothing - remove useless `inline` from various functions in C++ only has one purpose: to tell the compiler that it's okay to have multiple definitions (and just throw the extra away when linking). It is not used by any modern C++ compiler to actually decide when to inline, and so has no use in a .cpp file. (Suspect this was written by a C programmer who doesn't fully understand C++). - Remove the C `typedef struct blah { ... } blah;` idiom which has no purpose in C++. - Use inheritance on the nearly-duplicate `mdb_block_info_{1,2,3} structs rather than repeating all the field in each one. This also removed a completely unneeded offsetof into them that was being used to avoid having to learn C++. (Also adds a static_assert in case anyone ever changes some contained type and breaks things). - Fix bi_weight comment about why it is really uin64_t - Add a missing method `override`. - Replace "22" buried in the code with a constant indicating what it is for. (Oh, reader, you wanted to know what it's used for? It's the number of different databases allowed in the LMDB) - Move `m_cur_whatever` macros into the .cpp file, and avoid using them in any code we've added in loki. These are incredibly useless macros: they are basically just defined to slightly shorten a name. I'm guessing that, at some point, these members got moved and rather than fix the remaining code someone defined a bunch of macros to deal with the rename. Yuck. (Getting rid of *all* of them (i.e. replacing all `m_cur_whatever` with `m_cursors->whatever` would be preferable, but would make future merge conflicts more painful, so I left the macros as is for the upstream databases but removed our service_node_data one.) - Rename `mdb_txn_cursors` members to drop the leading `m_txc_` prefix. When the struct is nothing more than a POD collection of values the prefix makes no sense at all. This allows us the write `m_cursors->service_node_data` instead of `m_cursors->m_txc_service_node_data` (or the horrible macro, above, which seems designed to just macro around this naming horror).
This commit is contained in:
parent
d6f5468345
commit
446173a3d2
2 changed files with 119 additions and 216 deletions
|
@ -52,10 +52,6 @@
|
||||||
#define LOKI_DEFAULT_LOG_CATEGORY "blockchain.db.lmdb"
|
#define LOKI_DEFAULT_LOG_CATEGORY "blockchain.db.lmdb"
|
||||||
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
#define MISALIGNED_OK 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using epee::string_tools::pod_to_hex;
|
using epee::string_tools::pod_to_hex;
|
||||||
using namespace crypto;
|
using namespace crypto;
|
||||||
|
|
||||||
|
@ -63,9 +59,10 @@ enum struct lmdb_version
|
||||||
{
|
{
|
||||||
v4 = 4,
|
v4 = 4,
|
||||||
v5, // alt_block_data_1_t => alt_block_data_t: Alt block data has boolean for if the block was checkpointed
|
v5, // alt_block_data_1_t => alt_block_data_t: Alt block data has boolean for if the block was checkpointed
|
||||||
|
_count
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr lmdb_version VERSION = lmdb_version::v5; // Increase when the DB structure changes
|
constexpr lmdb_version VERSION = tools::enum_top<lmdb_version>;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
@ -80,14 +77,14 @@ struct pre_rct_output_data_t
|
||||||
static_assert(sizeof(pre_rct_output_data_t) == sizeof(crypto::public_key) + 2*sizeof(uint64_t), "pre_ct_output_data_t has unexpected padding");
|
static_assert(sizeof(pre_rct_output_data_t) == sizeof(crypto::public_key) + 2*sizeof(uint64_t), "pre_ct_output_data_t has unexpected padding");
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void throw0(const T &e)
|
void throw0(const T &e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0(e.what());
|
LOG_PRINT_L0(e.what());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void throw1(const T &e)
|
void throw1(const T &e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1(e.what());
|
LOG_PRINT_L1(e.what());
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -244,6 +241,7 @@ const char* const LMDB_SERVICE_NODE_DATA = "service_node_data";
|
||||||
|
|
||||||
const char* const LMDB_PROPERTIES = "properties";
|
const char* const LMDB_PROPERTIES = "properties";
|
||||||
|
|
||||||
|
constexpr unsigned int LMDB_DB_COUNT = 22; // Should agree with the number of db's above
|
||||||
|
|
||||||
const char zerokey[8] = {0};
|
const char zerokey[8] = {0};
|
||||||
const MDB_val zerokval = { sizeof(zerokey), (void *)zerokey };
|
const MDB_val zerokval = { sizeof(zerokey), (void *)zerokey };
|
||||||
|
@ -254,73 +252,87 @@ const std::string lmdb_error(const std::string& error_string, int mdb_res)
|
||||||
return full_string;
|
return full_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void lmdb_db_open(MDB_txn* txn, const char* name, int flags, MDB_dbi& dbi, const std::string& error_string)
|
void lmdb_db_open(MDB_txn* txn, const char* name, int flags, MDB_dbi& dbi, const std::string& error_string)
|
||||||
{
|
{
|
||||||
if (auto res = mdb_dbi_open(txn, name, flags, &dbi))
|
if (auto res = mdb_dbi_open(txn, name, flags, &dbi))
|
||||||
throw0(cryptonote::DB_OPEN_FAILURE((lmdb_error(error_string + " : ", res) + std::string(" - you may want to start with --db-salvage")).c_str()));
|
throw0(cryptonote::DB_OPEN_FAILURE((lmdb_error(error_string + " : ", res) + std::string(" - you may want to start with --db-salvage")).c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setup_cursor(const MDB_dbi& db, MDB_cursor*& cursor, MDB_txn* txn)
|
||||||
|
{
|
||||||
|
if (!cursor) {
|
||||||
|
int result = mdb_cursor_open(txn, db, &cursor);
|
||||||
|
if (result)
|
||||||
|
throw0(cryptonote::DB_ERROR(lmdb_error("Failed to open cursor: ", result)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup_rcursor(const MDB_dbi& db, MDB_cursor*& cursor, MDB_txn* txn, bool& rflag, bool using_wcursor)
|
||||||
|
{
|
||||||
|
if (!cursor) {
|
||||||
|
setup_cursor(db, cursor, txn);
|
||||||
|
if (!using_wcursor)
|
||||||
|
rflag = true;
|
||||||
|
} else if (!using_wcursor && !rflag) {
|
||||||
|
int result = mdb_cursor_renew(txn, cursor);
|
||||||
|
if (result)
|
||||||
|
throw0(cryptonote::DB_ERROR(lmdb_error("Failed to renew cursor: ", result)));
|
||||||
|
rflag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
#define CURSOR(name) \
|
#define CURSOR(name) setup_cursor(m_##name, m_cursors->name, *m_write_txn);
|
||||||
if (!m_cur_ ## name) { \
|
|
||||||
int result = mdb_cursor_open(*m_write_txn, m_ ## name, &m_cur_ ## name); \
|
|
||||||
if (result) \
|
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to open cursor: ", result).c_str())); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RCURSOR(name) \
|
#define RCURSOR(name) setup_rcursor(m_##name, m_cursors->name, m_txn, m_tinfo->m_ti_rflags.m_rf_##name, m_cursors == &m_wcursors);
|
||||||
if (!m_cur_ ## name) { \
|
|
||||||
int result = mdb_cursor_open(m_txn, m_ ## name, (MDB_cursor **)&m_cur_ ## name); \
|
#define m_cur_blocks m_cursors->blocks
|
||||||
if (result) \
|
#define m_cur_block_heights m_cursors->block_heights
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to open cursor: ", result).c_str())); \
|
#define m_cur_block_info m_cursors->block_info
|
||||||
if (m_cursors != &m_wcursors) \
|
#define m_cur_output_txs m_cursors->output_txs
|
||||||
m_tinfo->m_ti_rflags.m_rf_ ## name = true; \
|
#define m_cur_output_amounts m_cursors->output_amounts
|
||||||
} else if (m_cursors != &m_wcursors && !m_tinfo->m_ti_rflags.m_rf_ ## name) { \
|
#define m_cur_output_blacklist m_cursors->output_blacklist
|
||||||
int result = mdb_cursor_renew(m_txn, m_cur_ ## name); \
|
#define m_cur_txs m_cursors->txs
|
||||||
if (result) \
|
#define m_cur_txs_pruned m_cursors->txs_pruned
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to renew cursor: ", result).c_str())); \
|
#define m_cur_txs_prunable m_cursors->txs_prunable
|
||||||
m_tinfo->m_ti_rflags.m_rf_ ## name = true; \
|
#define m_cur_txs_prunable_hash m_cursors->txs_prunable_hash
|
||||||
}
|
#define m_cur_txs_prunable_tip m_cursors->txs_prunable_tip
|
||||||
|
#define m_cur_tx_indices m_cursors->tx_indices
|
||||||
|
#define m_cur_tx_outputs m_cursors->tx_outputs
|
||||||
|
#define m_cur_spent_keys m_cursors->spent_keys
|
||||||
|
#define m_cur_txpool_meta m_cursors->txpool_meta
|
||||||
|
#define m_cur_txpool_blob m_cursors->txpool_blob
|
||||||
|
#define m_cur_alt_blocks m_cursors->alt_blocks
|
||||||
|
#define m_cur_hf_versions m_cursors->hf_versions
|
||||||
|
#define m_cur_properties m_cursors->properties
|
||||||
|
|
||||||
namespace cryptonote
|
namespace cryptonote
|
||||||
{
|
{
|
||||||
|
|
||||||
typedef struct mdb_block_info_1
|
struct mdb_block_info_1
|
||||||
{
|
{
|
||||||
uint64_t bi_height;
|
uint64_t bi_height;
|
||||||
uint64_t bi_timestamp;
|
uint64_t bi_timestamp;
|
||||||
uint64_t bi_coins;
|
uint64_t bi_coins;
|
||||||
uint64_t bi_weight; // a size_t really but we need 32-bit compat
|
uint64_t bi_weight; // a size_t really but we need to keep this struct padding-free
|
||||||
difficulty_type bi_diff;
|
difficulty_type bi_diff;
|
||||||
crypto::hash bi_hash;
|
crypto::hash bi_hash;
|
||||||
} mdb_block_info_1;
|
};
|
||||||
|
|
||||||
typedef struct mdb_block_info_2
|
struct mdb_block_info_2 : mdb_block_info_1
|
||||||
{
|
{
|
||||||
uint64_t bi_height;
|
|
||||||
uint64_t bi_timestamp;
|
|
||||||
uint64_t bi_coins;
|
|
||||||
uint64_t bi_weight; // a size_t really but we need 32-bit compat
|
|
||||||
difficulty_type bi_diff;
|
|
||||||
crypto::hash bi_hash;
|
|
||||||
uint64_t bi_cum_rct;
|
uint64_t bi_cum_rct;
|
||||||
} mdb_block_info_2;
|
};
|
||||||
|
|
||||||
typedef struct mdb_block_info_3
|
struct mdb_block_info_3 : mdb_block_info_2
|
||||||
{
|
{
|
||||||
uint64_t bi_height;
|
|
||||||
uint64_t bi_timestamp;
|
|
||||||
uint64_t bi_coins;
|
|
||||||
uint64_t bi_weight; // a size_t really but we need 32-bit compat
|
|
||||||
difficulty_type bi_diff;
|
|
||||||
crypto::hash bi_hash;
|
|
||||||
uint64_t bi_cum_rct;
|
|
||||||
uint64_t bi_long_term_block_weight;
|
uint64_t bi_long_term_block_weight;
|
||||||
} mdb_block_info_3;
|
};
|
||||||
|
|
||||||
typedef mdb_block_info_3 mdb_block_info;
|
static_assert(sizeof(mdb_block_info_3) == sizeof(mdb_block_info_1) + 16, "unexpected mdb_block_info struct sizes");
|
||||||
|
|
||||||
|
using mdb_block_info = mdb_block_info_3;
|
||||||
|
|
||||||
struct blk_checkpoint_header
|
struct blk_checkpoint_header
|
||||||
{
|
{
|
||||||
|
@ -358,7 +370,7 @@ std::atomic_flag mdb_txn_safe::creation_gate = ATOMIC_FLAG_INIT;
|
||||||
|
|
||||||
mdb_threadinfo::~mdb_threadinfo()
|
mdb_threadinfo::~mdb_threadinfo()
|
||||||
{
|
{
|
||||||
MDB_cursor **cur = &m_ti_rcursors.m_txc_blocks;
|
MDB_cursor **cur = &m_ti_rcursors.blocks;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
for (i=0; i<sizeof(mdb_txn_cursors)/sizeof(MDB_cursor *); i++)
|
for (i=0; i<sizeof(mdb_txn_cursors)/sizeof(MDB_cursor *); i++)
|
||||||
if (cur[i])
|
if (cur[i])
|
||||||
|
@ -487,7 +499,7 @@ void lmdb_resized(MDB_env *env)
|
||||||
mdb_txn_safe::allow_new_txns();
|
mdb_txn_safe::allow_new_txns();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int lmdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **txn)
|
int lmdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **txn)
|
||||||
{
|
{
|
||||||
int res = mdb_txn_begin(env, parent, flags, txn);
|
int res = mdb_txn_begin(env, parent, flags, txn);
|
||||||
if (res == MDB_MAP_RESIZED) {
|
if (res == MDB_MAP_RESIZED) {
|
||||||
|
@ -497,7 +509,7 @@ inline int lmdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int lmdb_txn_renew(MDB_txn *txn)
|
int lmdb_txn_renew(MDB_txn *txn)
|
||||||
{
|
{
|
||||||
int res = mdb_txn_renew(txn);
|
int res = mdb_txn_renew(txn);
|
||||||
if (res == MDB_MAP_RESIZED) {
|
if (res == MDB_MAP_RESIZED) {
|
||||||
|
@ -507,7 +519,7 @@ inline int lmdb_txn_renew(MDB_txn *txn)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void BlockchainLMDB::check_open() const
|
void BlockchainLMDB::check_open() const
|
||||||
{
|
{
|
||||||
if (!m_open)
|
if (!m_open)
|
||||||
throw0(DB_ERROR("DB operation attempted on a not-open DB instance"));
|
throw0(DB_ERROR("DB operation attempted on a not-open DB instance"));
|
||||||
|
@ -1338,7 +1350,7 @@ void BlockchainLMDB::open(const std::string& filename, cryptonote::network_type
|
||||||
// set up lmdb environment
|
// set up lmdb environment
|
||||||
if ((result = mdb_env_create(&m_env)))
|
if ((result = mdb_env_create(&m_env)))
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to create lmdb environment: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to create lmdb environment: ", result).c_str()));
|
||||||
if ((result = mdb_env_set_maxdbs(m_env, 22)))
|
if ((result = mdb_env_set_maxdbs(m_env, LMDB_DB_COUNT)))
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to set max number of dbs: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to set max number of dbs: ", result).c_str()));
|
||||||
|
|
||||||
int threads = tools::get_max_concurrency();
|
int threads = tools::get_max_concurrency();
|
||||||
|
@ -1675,16 +1687,13 @@ void BlockchainLMDB::unlock()
|
||||||
check_open();
|
check_open();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TXN_PREFIX(flags); \
|
#define TXN_PREFIX(flags) \
|
||||||
mdb_txn_safe auto_txn; \
|
mdb_txn_safe auto_txn; \
|
||||||
mdb_txn_safe* txn_ptr = &auto_txn; \
|
mdb_txn_safe* txn_ptr = &auto_txn; \
|
||||||
if (m_batch_active) \
|
if (m_batch_active) \
|
||||||
txn_ptr = m_write_txn; \
|
txn_ptr = m_write_txn; \
|
||||||
else \
|
else if (auto mdb_res = lmdb_txn_begin(m_env, NULL, flags, auto_txn)) \
|
||||||
{ \
|
throw0(DB_ERROR(lmdb_error(std::string("Failed to create a transaction for the db in ")+__FUNCTION__+": ", mdb_res)));
|
||||||
if (auto mdb_res = lmdb_txn_begin(m_env, NULL, flags, auto_txn)) \
|
|
||||||
throw0(DB_ERROR(lmdb_error(std::string("Failed to create a transaction for the db in ")+__FUNCTION__+": ", mdb_res).c_str())); \
|
|
||||||
} \
|
|
||||||
|
|
||||||
#define TXN_PREFIX_RDONLY() \
|
#define TXN_PREFIX_RDONLY() \
|
||||||
MDB_txn *m_txn; \
|
MDB_txn *m_txn; \
|
||||||
|
@ -1693,7 +1702,6 @@ void BlockchainLMDB::unlock()
|
||||||
bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); \
|
bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); \
|
||||||
if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get(); \
|
if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get(); \
|
||||||
else auto_txn.uncheck()
|
else auto_txn.uncheck()
|
||||||
#define TXN_POSTFIX_RDONLY()
|
|
||||||
|
|
||||||
#define TXN_POSTFIX_SUCCESS() \
|
#define TXN_POSTFIX_SUCCESS() \
|
||||||
do { \
|
do { \
|
||||||
|
@ -1819,7 +1827,6 @@ uint64_t BlockchainLMDB::get_txpool_tx_count(bool include_unrelayed_txes) const
|
||||||
++num_entries;
|
++num_entries;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return num_entries;
|
return num_entries;
|
||||||
}
|
}
|
||||||
|
@ -1836,7 +1843,6 @@ bool BlockchainLMDB::txpool_has_tx(const crypto::hash& txid) const
|
||||||
auto result = mdb_cursor_get(m_cur_txpool_meta, &k, NULL, MDB_SET);
|
auto result = mdb_cursor_get(m_cur_txpool_meta, &k, NULL, MDB_SET);
|
||||||
if (result != 0 && result != MDB_NOTFOUND)
|
if (result != 0 && result != MDB_NOTFOUND)
|
||||||
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return result != MDB_NOTFOUND;
|
return result != MDB_NOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1887,7 +1893,6 @@ bool BlockchainLMDB::get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta
|
||||||
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
|
||||||
|
|
||||||
meta = *(const txpool_tx_meta_t*)v.mv_data;
|
meta = *(const txpool_tx_meta_t*)v.mv_data;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1908,7 +1913,6 @@ bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::bl
|
||||||
throw1(DB_ERROR(lmdb_error("Error finding txpool tx blob: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Error finding txpool tx blob: ", result).c_str()));
|
||||||
|
|
||||||
bd.assign(reinterpret_cast<const char*>(v.mv_data), v.mv_size);
|
bd.assign(reinterpret_cast<const char*>(v.mv_data), v.mv_size);
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1938,7 +1942,6 @@ uint32_t BlockchainLMDB::get_blockchain_pruning_seed() const
|
||||||
throw0(DB_ERROR("Failed to retrieve or create pruning seed: unexpected value size"));
|
throw0(DB_ERROR("Failed to retrieve or create pruning seed: unexpected value size"));
|
||||||
uint32_t pruning_seed;
|
uint32_t pruning_seed;
|
||||||
memcpy(&pruning_seed, v.mv_data, sizeof(pruning_seed));
|
memcpy(&pruning_seed, v.mv_data, sizeof(pruning_seed));
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return pruning_seed;
|
return pruning_seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2251,8 +2254,6 @@ bool BlockchainLMDB::for_all_txpool_txes(std::function<bool(const crypto::hash&,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2358,8 +2359,6 @@ bool BlockchainLMDB::for_all_alt_blocks(std::function<bool(const crypto::hash&,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2390,7 +2389,6 @@ bool BlockchainLMDB::block_exists(const crypto::hash& h, uint64_t *height) const
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2419,7 +2417,6 @@ uint64_t BlockchainLMDB::get_block_height(const crypto::hash& h) const
|
||||||
|
|
||||||
blk_height *bhp = (blk_height *)key.mv_data;
|
blk_height *bhp = (blk_height *)key.mv_data;
|
||||||
uint64_t ret = bhp->bh_height;
|
uint64_t ret = bhp->bh_height;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2453,8 +2450,6 @@ cryptonote::blobdata BlockchainLMDB::get_block_blob_from_height(const uint64_t&
|
||||||
blobdata bd;
|
blobdata bd;
|
||||||
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return bd;
|
return bd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2477,7 +2472,6 @@ uint64_t BlockchainLMDB::get_block_timestamp(const uint64_t& height) const
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
uint64_t ret = bi->bi_timestamp;
|
uint64_t ret = bi->bi_timestamp;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2539,7 +2533,6 @@ std::vector<uint64_t> BlockchainLMDB::get_block_cumulative_rct_outputs(const std
|
||||||
prev_height = height;
|
prev_height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2577,11 +2570,10 @@ size_t BlockchainLMDB::get_block_weight(const uint64_t& height) const
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
size_t ret = bi->bi_weight;
|
size_t ret = bi->bi_weight;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint64_t> BlockchainLMDB::get_block_info_64bit_fields(uint64_t start_height, size_t count, off_t offset) const
|
std::vector<uint64_t> BlockchainLMDB::get_block_info_64bit_fields(uint64_t start_height, size_t count, uint64_t (*extract)(const void* bi_data)) const
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
|
@ -2627,11 +2619,9 @@ std::vector<uint64_t> BlockchainLMDB::get_block_info_64bit_fields(uint64_t start
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve block_info from the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve block_info from the db: ", result).c_str()));
|
||||||
}
|
}
|
||||||
const mdb_block_info *bi = ((const mdb_block_info *)v.mv_data) + (height - range_begin);
|
ret.push_back(extract(static_cast<const mdb_block_info *>(v.mv_data) + (height - range_begin)));
|
||||||
ret.push_back(*(const uint64_t*)(((const char*)bi) + offset));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2653,7 +2643,6 @@ uint64_t BlockchainLMDB::get_max_block_size()
|
||||||
throw0(DB_ERROR("Failed to retrieve or create max block size: unexpected value size"));
|
throw0(DB_ERROR("Failed to retrieve or create max block size: unexpected value size"));
|
||||||
uint64_t max_block_size;
|
uint64_t max_block_size;
|
||||||
memcpy(&max_block_size, v.mv_data, sizeof(max_block_size));
|
memcpy(&max_block_size, v.mv_data, sizeof(max_block_size));
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return max_block_size;
|
return max_block_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2686,15 +2675,16 @@ void BlockchainLMDB::add_max_block_size(uint64_t sz)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to set max_block_size: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to set max_block_size: ", result).c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<uint64_t> BlockchainLMDB::get_block_weights(uint64_t start_height, size_t count) const
|
std::vector<uint64_t> BlockchainLMDB::get_block_weights(uint64_t start_height, size_t count) const
|
||||||
{
|
{
|
||||||
return get_block_info_64bit_fields(start_height, count, offsetof(mdb_block_info, bi_weight));
|
return get_block_info_64bit_fields(start_height, count,
|
||||||
|
[](const void* bi) { return static_cast<const mdb_block_info *>(bi)->bi_weight; });
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint64_t> BlockchainLMDB::get_long_term_block_weights(uint64_t start_height, size_t count) const
|
std::vector<uint64_t> BlockchainLMDB::get_long_term_block_weights(uint64_t start_height, size_t count) const
|
||||||
{
|
{
|
||||||
return get_block_info_64bit_fields(start_height, count, offsetof(mdb_block_info, bi_long_term_block_weight));
|
return get_block_info_64bit_fields(start_height, count,
|
||||||
|
[](const void* bi) { return static_cast<const mdb_block_info *>(bi)->bi_long_term_block_weight; });
|
||||||
}
|
}
|
||||||
|
|
||||||
difficulty_type BlockchainLMDB::get_block_cumulative_difficulty(const uint64_t& height) const
|
difficulty_type BlockchainLMDB::get_block_cumulative_difficulty(const uint64_t& height) const
|
||||||
|
@ -2716,7 +2706,6 @@ difficulty_type BlockchainLMDB::get_block_cumulative_difficulty(const uint64_t&
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
difficulty_type ret = bi->bi_diff;
|
difficulty_type ret = bi->bi_diff;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2756,7 +2745,6 @@ uint64_t BlockchainLMDB::get_block_already_generated_coins(const uint64_t& heigh
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
uint64_t ret = bi->bi_coins;
|
uint64_t ret = bi->bi_coins;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2779,7 +2767,6 @@ uint64_t BlockchainLMDB::get_block_long_term_weight(const uint64_t& height) cons
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
uint64_t ret = bi->bi_long_term_block_weight;
|
uint64_t ret = bi->bi_long_term_block_weight;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2802,7 +2789,6 @@ crypto::hash BlockchainLMDB::get_block_hash_from_height(const uint64_t& height)
|
||||||
|
|
||||||
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
mdb_block_info *bi = (mdb_block_info *)result.mv_data;
|
||||||
crypto::hash ret = bi->bi_hash;
|
crypto::hash ret = bi->bi_hash;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2921,8 +2907,6 @@ bool BlockchainLMDB::tx_exists(const crypto::hash& h) const
|
||||||
TIME_MEASURE_FINISH(time1);
|
TIME_MEASURE_FINISH(time1);
|
||||||
time_tx_exists += time1;
|
time_tx_exists += time1;
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
if (! tx_found)
|
if (! tx_found)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1("transaction with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
|
LOG_PRINT_L1("transaction with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
|
||||||
|
@ -2951,8 +2935,6 @@ bool BlockchainLMDB::tx_exists(const crypto::hash& h, uint64_t& tx_id) const
|
||||||
tx_id = tip->data.tx_id;
|
tx_id = tip->data.tx_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (get_result == MDB_NOTFOUND)
|
if (get_result == MDB_NOTFOUND)
|
||||||
{
|
{
|
||||||
|
@ -2983,7 +2965,6 @@ uint64_t BlockchainLMDB::get_tx_unlock_time(const crypto::hash& h) const
|
||||||
|
|
||||||
txindex *tip = (txindex *)v.mv_data;
|
txindex *tip = (txindex *)v.mv_data;
|
||||||
uint64_t ret = tip->data.unlock_time;
|
uint64_t ret = tip->data.unlock_time;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3018,8 +2999,6 @@ bool BlockchainLMDB::get_tx_blob(const crypto::hash& h, cryptonote::blobdata &bd
|
||||||
bd.assign(reinterpret_cast<char*>(result0.mv_data), result0.mv_size);
|
bd.assign(reinterpret_cast<char*>(result0.mv_data), result0.mv_size);
|
||||||
bd.append(reinterpret_cast<char*>(result1.mv_data), result1.mv_size);
|
bd.append(reinterpret_cast<char*>(result1.mv_data), result1.mv_size);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3048,8 +3027,6 @@ bool BlockchainLMDB::get_pruned_tx_blob(const crypto::hash& h, cryptonote::blobd
|
||||||
|
|
||||||
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3078,8 +3055,6 @@ bool BlockchainLMDB::get_prunable_tx_blob(const crypto::hash& h, cryptonote::blo
|
||||||
|
|
||||||
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
bd.assign(reinterpret_cast<char*>(result.mv_data), result.mv_size);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3108,8 +3083,6 @@ bool BlockchainLMDB::get_prunable_tx_hash(const crypto::hash& tx_hash, crypto::h
|
||||||
|
|
||||||
prunable_hash = *(const crypto::hash*)result.mv_data;
|
prunable_hash = *(const crypto::hash*)result.mv_data;
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3125,8 +3098,6 @@ uint64_t BlockchainLMDB::get_tx_count() const
|
||||||
if ((result = mdb_stat(m_txn, m_txs_pruned, &db_stats)))
|
if ((result = mdb_stat(m_txn, m_txs_pruned, &db_stats)))
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to query m_txs_pruned: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to query m_txs_pruned: ", result).c_str()));
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return db_stats.ms_entries;
|
return db_stats.ms_entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3165,7 +3136,6 @@ std::vector<uint64_t> BlockchainLMDB::get_tx_block_heights(const std::vector<cry
|
||||||
else
|
else
|
||||||
result.push_back(reinterpret_cast<txindex *>(v.mv_data)->data.block_id);
|
result.push_back(reinterpret_cast<txindex *>(v.mv_data)->data.block_id);
|
||||||
}
|
}
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3188,8 +3158,6 @@ uint64_t BlockchainLMDB::get_num_outputs(const uint64_t& amount) const
|
||||||
else if (result != MDB_NOTFOUND)
|
else if (result != MDB_NOTFOUND)
|
||||||
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"));
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return num_elems;
|
return num_elems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3223,7 +3191,6 @@ output_data_t BlockchainLMDB::get_output_key(const uint64_t& amount, const uint6
|
||||||
if (include_commitmemt)
|
if (include_commitmemt)
|
||||||
ret.commitment = rct::zeroCommit(amount);
|
ret.commitment = rct::zeroCommit(amount);
|
||||||
}
|
}
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3246,7 +3213,6 @@ tx_out_index BlockchainLMDB::get_output_tx_and_index_from_global(const uint64_t&
|
||||||
outtx *ot = (outtx *)v.mv_data;
|
outtx *ot = (outtx *)v.mv_data;
|
||||||
tx_out_index ret = tx_out_index(ot->tx_hash, ot->local_index);
|
tx_out_index ret = tx_out_index(ot->tx_hash, ot->local_index);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3302,7 +3268,6 @@ std::vector<std::vector<uint64_t>> BlockchainLMDB::get_tx_amount_output_indices(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return amount_output_indices_set;
|
return amount_output_indices_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3319,7 +3284,6 @@ bool BlockchainLMDB::has_key_image(const crypto::key_image& img) const
|
||||||
MDB_val k = {sizeof(img), (void *)&img};
|
MDB_val k = {sizeof(img), (void *)&img};
|
||||||
ret = (mdb_cursor_get(m_cur_spent_keys, (MDB_val *)&zerokval, &k, MDB_GET_BOTH) == 0);
|
ret = (mdb_cursor_get(m_cur_spent_keys, (MDB_val *)&zerokval, &k, MDB_GET_BOTH) == 0);
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3351,8 +3315,6 @@ bool BlockchainLMDB::for_all_key_images(std::function<bool(const crypto::key_ima
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3402,8 +3364,6 @@ bool BlockchainLMDB::for_blocks_range(const uint64_t& h1, const uint64_t& h2, st
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3464,8 +3424,6 @@ bool BlockchainLMDB::for_all_transactions(std::function<bool(const crypto::hash&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3499,8 +3457,6 @@ bool BlockchainLMDB::for_all_outputs(std::function<bool(uint64_t amount, const c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3539,8 +3495,6 @@ bool BlockchainLMDB::for_all_outputs(uint64_t amount, const std::function<bool(u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3896,7 +3850,7 @@ void BlockchainLMDB::update_block_checkpoint(checkpoint_t const &checkpoint)
|
||||||
MDB_val value = {};
|
MDB_val value = {};
|
||||||
value.mv_size = actual_bytes_used;
|
value.mv_size = actual_bytes_used;
|
||||||
value.mv_data = buffer;
|
value.mv_data = buffer;
|
||||||
int ret = mdb_cursor_put(m_cur_block_checkpoints, &key, &value, 0);
|
int ret = mdb_cursor_put(m_cursors->block_checkpoints, &key, &value, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to update block checkpoint in db transaction: ", ret).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to update block checkpoint in db transaction: ", ret).c_str()));
|
||||||
}
|
}
|
||||||
|
@ -3911,10 +3865,10 @@ void BlockchainLMDB::remove_block_checkpoint(uint64_t height)
|
||||||
|
|
||||||
MDB_val_set(key, height);
|
MDB_val_set(key, height);
|
||||||
MDB_val value = {};
|
MDB_val value = {};
|
||||||
int ret = mdb_cursor_get(m_cur_block_checkpoints, &key, &value, MDB_SET_KEY);
|
int ret = mdb_cursor_get(m_cursors->block_checkpoints, &key, &value, MDB_SET_KEY);
|
||||||
if (ret == MDB_SUCCESS)
|
if (ret == MDB_SUCCESS)
|
||||||
{
|
{
|
||||||
ret = mdb_cursor_del(m_cur_block_checkpoints, 0);
|
ret = mdb_cursor_del(m_cursors->block_checkpoints, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to delete block checkpoint: ", ret).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to delete block checkpoint: ", ret).c_str()));
|
||||||
}
|
}
|
||||||
|
@ -3950,13 +3904,12 @@ bool BlockchainLMDB::get_block_checkpoint_internal(uint64_t height, checkpoint_t
|
||||||
|
|
||||||
MDB_val_set(key, height);
|
MDB_val_set(key, height);
|
||||||
MDB_val value = {};
|
MDB_val value = {};
|
||||||
int ret = mdb_cursor_get(m_cur_block_checkpoints, &key, &value, op);
|
int ret = mdb_cursor_get(m_cursors->block_checkpoints, &key, &value, op);
|
||||||
if (ret == MDB_SUCCESS)
|
if (ret == MDB_SUCCESS)
|
||||||
{
|
{
|
||||||
checkpoint = convert_mdb_val_to_checkpoint(value);
|
checkpoint = convert_mdb_val_to_checkpoint(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
if (ret != MDB_SUCCESS && ret != MDB_NOTFOUND)
|
if (ret != MDB_SUCCESS && ret != MDB_NOTFOUND)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to get block checkpoint: ", ret).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to get block checkpoint: ", ret).c_str()));
|
||||||
|
|
||||||
|
@ -4035,7 +3988,7 @@ std::vector<checkpoint_t> BlockchainLMDB::get_checkpoints_range(uint64_t start,
|
||||||
RCURSOR(block_checkpoints);
|
RCURSOR(block_checkpoints);
|
||||||
|
|
||||||
MDB_val_set(key, first_checkpoint.height);
|
MDB_val_set(key, first_checkpoint.height);
|
||||||
int ret = mdb_cursor_get(m_cur_block_checkpoints, &key, nullptr, MDB_SET_KEY);
|
int ret = mdb_cursor_get(m_cursors->block_checkpoints, &key, nullptr, MDB_SET_KEY);
|
||||||
if (ret != MDB_SUCCESS)
|
if (ret != MDB_SUCCESS)
|
||||||
throw0(DB_ERROR(lmdb_error("Unexpected failure to get checkpoint we just queried: ", ret).c_str()));
|
throw0(DB_ERROR(lmdb_error("Unexpected failure to get checkpoint we just queried: ", ret).c_str()));
|
||||||
|
|
||||||
|
@ -4047,7 +4000,7 @@ std::vector<checkpoint_t> BlockchainLMDB::get_checkpoints_range(uint64_t start,
|
||||||
for (; result.size() < num_desired_checkpoints;)
|
for (; result.size() < num_desired_checkpoints;)
|
||||||
{
|
{
|
||||||
MDB_val value = {};
|
MDB_val value = {};
|
||||||
ret = mdb_cursor_get(m_cur_block_checkpoints, nullptr, &value, op);
|
ret = mdb_cursor_get(m_cursors->block_checkpoints, nullptr, &value, op);
|
||||||
|
|
||||||
if (ret == MDB_NOTFOUND) break;
|
if (ret == MDB_NOTFOUND) break;
|
||||||
if (ret != MDB_SUCCESS)
|
if (ret != MDB_SUCCESS)
|
||||||
|
@ -4060,8 +4013,6 @@ std::vector<checkpoint_t> BlockchainLMDB::get_checkpoints_range(uint64_t start,
|
||||||
result.push_back(checkpoint);
|
result.push_back(checkpoint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -4110,8 +4061,6 @@ void BlockchainLMDB::get_output_tx_and_index_from_global(const std::vector<uint6
|
||||||
const outtx *ot = (const outtx *)v.mv_data;
|
const outtx *ot = (const outtx *)v.mv_data;
|
||||||
tx_out_indices.push_back(tx_out_index(ot->tx_hash, ot->local_index));
|
tx_out_indices.push_back(tx_out_index(ot->tx_hash, ot->local_index));
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockchainLMDB::get_output_key(const epee::span<const uint64_t> &amounts, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs, bool allow_partial) const
|
void BlockchainLMDB::get_output_key(const epee::span<const uint64_t> &amounts, const std::vector<uint64_t> &offsets, std::vector<output_data_t> &outputs, bool allow_partial) const
|
||||||
|
@ -4163,8 +4112,6 @@ void BlockchainLMDB::get_output_key(const epee::span<const uint64_t> &amounts, c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
TIME_MEASURE_FINISH(db3);
|
TIME_MEASURE_FINISH(db3);
|
||||||
LOG_PRINT_L3("db3: " << db3);
|
LOG_PRINT_L3("db3: " << db3);
|
||||||
}
|
}
|
||||||
|
@ -4293,8 +4240,6 @@ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return histogram;
|
return histogram;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4340,8 +4285,6 @@ bool BlockchainLMDB::get_output_distribution(uint64_t amount, uint64_t from_heig
|
||||||
distribution[n] += distribution[n - 1];
|
distribution[n] += distribution[n - 1];
|
||||||
base = 0;
|
base = 0;
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4384,7 +4327,6 @@ bool BlockchainLMDB::get_output_blacklist(std::vector<uint64_t> &blacklist) cons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4463,7 +4405,6 @@ uint8_t BlockchainLMDB::get_hard_fork_version(uint64_t height) const
|
||||||
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve a hard fork version at height " + boost::lexical_cast<std::string>(height) + " from the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve a hard fork version at height " + boost::lexical_cast<std::string>(height) + " from the db: ", result).c_str()));
|
||||||
|
|
||||||
uint8_t ret = *(const uint8_t*)val_ret.mv_data;
|
uint8_t ret = *(const uint8_t*)val_ret.mv_data;
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4528,7 +4469,6 @@ bool BlockchainLMDB::get_alt_block(const crypto::hash &blkid, alt_block_data_t *
|
||||||
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve alternate block " + epee::string_tools::pod_to_hex(blkid) + " from the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Error attempting to retrieve alternate block " + epee::string_tools::pod_to_hex(blkid) + " from the db: ", result).c_str()));
|
||||||
if (!read_alt_block_data_from_mdb_val(v, data, block, checkpoint))
|
if (!read_alt_block_data_from_mdb_val(v, data, block, checkpoint))
|
||||||
throw0(DB_ERROR("Record size is less than expected"));
|
throw0(DB_ERROR("Record size is less than expected"));
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4567,7 +4507,6 @@ uint64_t BlockchainLMDB::get_alt_block_count()
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to query m_alt_blocks: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to query m_alt_blocks: ", result).c_str()));
|
||||||
count = db_stats.ms_entries;
|
count = db_stats.ms_entries;
|
||||||
}
|
}
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5507,17 +5446,11 @@ void BlockchainLMDB::migrate_2_3()
|
||||||
}
|
}
|
||||||
else if (result)
|
else if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to get a record from block_info: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to get a record from block_info: ", result).c_str()));
|
||||||
const mdb_block_info_1 *bi_old = (const mdb_block_info_1*)v.mv_data;
|
|
||||||
mdb_block_info_2 bi;
|
mdb_block_info_2 bi;
|
||||||
bi.bi_height = bi_old->bi_height;
|
static_cast<mdb_block_info_1 &>(bi) = *static_cast<const mdb_block_info_1*>(v.mv_data);
|
||||||
bi.bi_timestamp = bi_old->bi_timestamp;
|
if (bi.bi_height >= distribution.size())
|
||||||
bi.bi_coins = bi_old->bi_coins;
|
|
||||||
bi.bi_weight = bi_old->bi_weight;
|
|
||||||
bi.bi_diff = bi_old->bi_diff;
|
|
||||||
bi.bi_hash = bi_old->bi_hash;
|
|
||||||
if (bi_old->bi_height >= distribution.size())
|
|
||||||
throw0(DB_ERROR("Bad height in block_info record"));
|
throw0(DB_ERROR("Bad height in block_info record"));
|
||||||
bi.bi_cum_rct = distribution[bi_old->bi_height];
|
bi.bi_cum_rct = distribution[bi.bi_height];
|
||||||
MDB_val_set(nv, bi);
|
MDB_val_set(nv, bi);
|
||||||
result = mdb_cursor_put(c_cur, (MDB_val *)&zerokval, &nv, MDB_APPENDDUP);
|
result = mdb_cursor_put(c_cur, (MDB_val *)&zerokval, &nv, MDB_APPENDDUP);
|
||||||
if (result)
|
if (result)
|
||||||
|
@ -5626,7 +5559,6 @@ void BlockchainLMDB::migrate_3_4()
|
||||||
for (uint64_t output_index : outputs[0])
|
for (uint64_t output_index : outputs[0])
|
||||||
global_output_indexes.push_back(output_index);
|
global_output_indexes.push_back(output_index);
|
||||||
}
|
}
|
||||||
TXN_POSTFIX_RDONLY();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mdb_txn_cursors *m_cursors = &m_wcursors;
|
mdb_txn_cursors *m_cursors = &m_wcursors;
|
||||||
|
@ -5715,15 +5647,8 @@ void BlockchainLMDB::migrate_3_4()
|
||||||
}
|
}
|
||||||
else if (result)
|
else if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to get a record from block_info: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to get a record from block_info: ", result).c_str()));
|
||||||
const mdb_block_info_2 *bi_old = (const mdb_block_info_2*)v.mv_data;
|
|
||||||
mdb_block_info_3 bi;
|
mdb_block_info_3 bi;
|
||||||
bi.bi_height = bi_old->bi_height;
|
static_cast<mdb_block_info_2 &>(bi) = *static_cast<const mdb_block_info_2*>(v.mv_data);
|
||||||
bi.bi_timestamp = bi_old->bi_timestamp;
|
|
||||||
bi.bi_coins = bi_old->bi_coins;
|
|
||||||
bi.bi_weight = bi_old->bi_weight;
|
|
||||||
bi.bi_diff = bi_old->bi_diff;
|
|
||||||
bi.bi_hash = bi_old->bi_hash;
|
|
||||||
bi.bi_cum_rct = bi_old->bi_cum_rct;
|
|
||||||
|
|
||||||
// get block major version to determine which rule is in place
|
// get block major version to determine which rule is in place
|
||||||
if (!past_long_term_weight)
|
if (!past_long_term_weight)
|
||||||
|
@ -5916,7 +5841,7 @@ void BlockchainLMDB::set_service_node_data(const std::string& data, bool long_te
|
||||||
MDB_val_set(k, key);
|
MDB_val_set(k, key);
|
||||||
MDB_val_sized(blob, data);
|
MDB_val_sized(blob, data);
|
||||||
int result;
|
int result;
|
||||||
result = mdb_cursor_put(m_cur_service_node_data, &k, &blob, 0);
|
result = mdb_cursor_put(m_cursors->service_node_data, &k, &blob, 0);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to add service node data to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add service node data to db transaction: ", result).c_str()));
|
||||||
}
|
}
|
||||||
|
@ -5934,7 +5859,7 @@ bool BlockchainLMDB::get_service_node_data(std::string& data, bool long_term)
|
||||||
MDB_val_set(k, key);
|
MDB_val_set(k, key);
|
||||||
MDB_val v;
|
MDB_val v;
|
||||||
|
|
||||||
int result = mdb_cursor_get(m_cur_service_node_data, &k, &v, MDB_SET_KEY);
|
int result = mdb_cursor_get(m_cursors->service_node_data, &k, &v, MDB_SET_KEY);
|
||||||
if (result != MDB_SUCCESS)
|
if (result != MDB_SUCCESS)
|
||||||
{
|
{
|
||||||
if (result == MDB_NOTFOUND)
|
if (result == MDB_NOTFOUND)
|
||||||
|
@ -5968,9 +5893,9 @@ void BlockchainLMDB::clear_service_node_data()
|
||||||
{
|
{
|
||||||
MDB_val_set(k, key);
|
MDB_val_set(k, key);
|
||||||
int result;
|
int result;
|
||||||
if ((result = mdb_cursor_get(m_cur_service_node_data, &k, NULL, MDB_SET)))
|
if ((result = mdb_cursor_get(m_cursors->service_node_data, &k, NULL, MDB_SET)))
|
||||||
return;
|
return;
|
||||||
if ((result = mdb_cursor_del(m_cur_service_node_data, 0)))
|
if ((result = mdb_cursor_del(m_cursors->service_node_data, 0)))
|
||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of service node data to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Failed to add removal of service node data to db transaction: ", result).c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,66 +40,44 @@
|
||||||
namespace cryptonote
|
namespace cryptonote
|
||||||
{
|
{
|
||||||
|
|
||||||
typedef struct txindex {
|
struct txindex {
|
||||||
crypto::hash key;
|
crypto::hash key;
|
||||||
tx_data_t data;
|
tx_data_t data;
|
||||||
} txindex;
|
};
|
||||||
|
|
||||||
typedef struct mdb_txn_cursors
|
struct mdb_txn_cursors
|
||||||
{
|
{
|
||||||
MDB_cursor *m_txc_blocks;
|
MDB_cursor *blocks;
|
||||||
MDB_cursor *m_txc_block_heights;
|
MDB_cursor *block_heights;
|
||||||
MDB_cursor *m_txc_block_info;
|
MDB_cursor *block_info;
|
||||||
MDB_cursor *m_txc_block_checkpoints;
|
MDB_cursor *block_checkpoints;
|
||||||
|
|
||||||
MDB_cursor *m_txc_output_txs;
|
MDB_cursor *output_txs;
|
||||||
MDB_cursor *m_txc_output_amounts;
|
MDB_cursor *output_amounts;
|
||||||
|
|
||||||
MDB_cursor *m_txc_txs;
|
MDB_cursor *txs;
|
||||||
MDB_cursor *m_txc_txs_pruned;
|
MDB_cursor *txs_pruned;
|
||||||
MDB_cursor *m_txc_txs_prunable;
|
MDB_cursor *txs_prunable;
|
||||||
MDB_cursor *m_txc_txs_prunable_hash;
|
MDB_cursor *txs_prunable_hash;
|
||||||
MDB_cursor *m_txc_txs_prunable_tip;
|
MDB_cursor *txs_prunable_tip;
|
||||||
MDB_cursor *m_txc_tx_indices;
|
MDB_cursor *tx_indices;
|
||||||
MDB_cursor *m_txc_tx_outputs;
|
MDB_cursor *tx_outputs;
|
||||||
|
|
||||||
MDB_cursor *m_txc_spent_keys;
|
MDB_cursor *spent_keys;
|
||||||
|
|
||||||
MDB_cursor *m_txc_txpool_meta;
|
MDB_cursor *txpool_meta;
|
||||||
MDB_cursor *m_txc_txpool_blob;
|
MDB_cursor *txpool_blob;
|
||||||
|
|
||||||
MDB_cursor *m_txc_alt_blocks;
|
MDB_cursor *alt_blocks;
|
||||||
|
|
||||||
MDB_cursor *m_txc_hf_versions;
|
MDB_cursor *hf_versions;
|
||||||
|
|
||||||
MDB_cursor *m_txc_service_node_data;
|
MDB_cursor *service_node_data;
|
||||||
MDB_cursor *m_txc_output_blacklist;
|
MDB_cursor *output_blacklist;
|
||||||
MDB_cursor *m_txc_properties;
|
MDB_cursor *properties;
|
||||||
} mdb_txn_cursors;
|
};
|
||||||
|
|
||||||
#define m_cur_blocks m_cursors->m_txc_blocks
|
struct mdb_rflags
|
||||||
#define m_cur_block_heights m_cursors->m_txc_block_heights
|
|
||||||
#define m_cur_block_info m_cursors->m_txc_block_info
|
|
||||||
#define m_cur_block_checkpoints m_cursors->m_txc_block_checkpoints
|
|
||||||
#define m_cur_output_txs m_cursors->m_txc_output_txs
|
|
||||||
#define m_cur_output_amounts m_cursors->m_txc_output_amounts
|
|
||||||
#define m_cur_output_blacklist m_cursors->m_txc_output_blacklist
|
|
||||||
#define m_cur_txs m_cursors->m_txc_txs
|
|
||||||
#define m_cur_txs_pruned m_cursors->m_txc_txs_pruned
|
|
||||||
#define m_cur_txs_prunable m_cursors->m_txc_txs_prunable
|
|
||||||
#define m_cur_txs_prunable_hash m_cursors->m_txc_txs_prunable_hash
|
|
||||||
#define m_cur_txs_prunable_tip m_cursors->m_txc_txs_prunable_tip
|
|
||||||
#define m_cur_tx_indices m_cursors->m_txc_tx_indices
|
|
||||||
#define m_cur_tx_outputs m_cursors->m_txc_tx_outputs
|
|
||||||
#define m_cur_spent_keys m_cursors->m_txc_spent_keys
|
|
||||||
#define m_cur_txpool_meta m_cursors->m_txc_txpool_meta
|
|
||||||
#define m_cur_txpool_blob m_cursors->m_txc_txpool_blob
|
|
||||||
#define m_cur_alt_blocks m_cursors->m_txc_alt_blocks
|
|
||||||
#define m_cur_hf_versions m_cursors->m_txc_hf_versions
|
|
||||||
#define m_cur_service_node_data m_cursors->m_txc_service_node_data
|
|
||||||
#define m_cur_properties m_cursors->m_txc_properties
|
|
||||||
|
|
||||||
typedef struct mdb_rflags
|
|
||||||
{
|
{
|
||||||
bool m_rf_txn;
|
bool m_rf_txn;
|
||||||
bool m_rf_blocks;
|
bool m_rf_blocks;
|
||||||
|
@ -123,16 +101,16 @@ typedef struct mdb_rflags
|
||||||
bool m_rf_hf_versions;
|
bool m_rf_hf_versions;
|
||||||
bool m_rf_service_node_data;
|
bool m_rf_service_node_data;
|
||||||
bool m_rf_properties;
|
bool m_rf_properties;
|
||||||
} mdb_rflags;
|
};
|
||||||
|
|
||||||
typedef struct mdb_threadinfo
|
struct mdb_threadinfo
|
||||||
{
|
{
|
||||||
MDB_txn *m_ti_rtxn; // per-thread read txn
|
MDB_txn *m_ti_rtxn; // per-thread read txn
|
||||||
mdb_txn_cursors m_ti_rcursors; // per-thread read cursors
|
mdb_txn_cursors m_ti_rcursors; // per-thread read cursors
|
||||||
mdb_rflags m_ti_rflags; // per-thread read state
|
mdb_rflags m_ti_rflags; // per-thread read state
|
||||||
|
|
||||||
~mdb_threadinfo();
|
~mdb_threadinfo();
|
||||||
} mdb_threadinfo;
|
};
|
||||||
|
|
||||||
struct mdb_txn_safe
|
struct mdb_txn_safe
|
||||||
{
|
{
|
||||||
|
@ -428,9 +406,9 @@ private:
|
||||||
|
|
||||||
uint64_t get_database_size() const override;
|
uint64_t get_database_size() const override;
|
||||||
|
|
||||||
std::vector<uint64_t> get_block_info_64bit_fields(uint64_t start_height, size_t count, off_t offset) const;
|
std::vector<uint64_t> get_block_info_64bit_fields(uint64_t start_height, size_t count, uint64_t (*extract)(const void* mdb_block_info)) const;
|
||||||
|
|
||||||
uint64_t get_max_block_size();
|
uint64_t get_max_block_size() override;
|
||||||
void add_max_block_size(uint64_t sz) override;
|
void add_max_block_size(uint64_t sz) override;
|
||||||
|
|
||||||
// fix up anything that may be wrong due to past bugs
|
// fix up anything that may be wrong due to past bugs
|
||||||
|
|
Loading…
Reference in a new issue