mirror of
https://github.com/monero-project/monero.git
synced 2024-12-28 03:29:25 -05:00
db_lmdb: save some string copies for readonly db keys/values
This commit is contained in:
parent
bf31447e9b
commit
99fbe1008b
@ -85,6 +85,10 @@ inline void throw1(const T &e)
|
|||||||
|
|
||||||
#define MDB_val_set(var, val) MDB_val var = {sizeof(val), (void *)&val}
|
#define MDB_val_set(var, val) MDB_val var = {sizeof(val), (void *)&val}
|
||||||
|
|
||||||
|
#define MDB_val_sized(var, val) MDB_val var = {val.size(), (void *)val.data()}
|
||||||
|
|
||||||
|
#define MDB_val_str(var, val) MDB_val var = {strlen(val) + 1, (void *)val}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct MDB_val_copy: public MDB_val
|
struct MDB_val_copy: public MDB_val
|
||||||
{
|
{
|
||||||
@ -714,7 +718,8 @@ void BlockchainLMDB::add_block(const block& blk, size_t block_weight, const diff
|
|||||||
CURSOR(block_info)
|
CURSOR(block_info)
|
||||||
|
|
||||||
// this call to mdb_cursor_put will change height()
|
// this call to mdb_cursor_put will change height()
|
||||||
MDB_val_copy<blobdata> blob(block_to_blob(blk));
|
cryptonote::blobdata block_blob(block_to_blob(blk));
|
||||||
|
MDB_val_sized(blob, block_blob);
|
||||||
result = mdb_cursor_put(m_cur_blocks, &key, &blob, MDB_APPEND);
|
result = mdb_cursor_put(m_cur_blocks, &key, &blob, MDB_APPEND);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to add block blob to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add block blob to db transaction: ", result).c_str()));
|
||||||
@ -828,7 +833,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
|
|||||||
throw0(DB_ERROR(lmdb_error("Failed to add tx data to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add tx data to db transaction: ", result).c_str()));
|
||||||
|
|
||||||
cryptonote::blobdata blob = tx_to_blob(tx);
|
cryptonote::blobdata blob = tx_to_blob(tx);
|
||||||
MDB_val_copy<blobdata> blobval(blob);
|
MDB_val_sized(blobval, blob);
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
binary_archive<true> ba(ss);
|
binary_archive<true> ba(ss);
|
||||||
@ -836,7 +841,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
|
|||||||
if (!r)
|
if (!r)
|
||||||
throw0(DB_ERROR("Failed to serialize pruned tx"));
|
throw0(DB_ERROR("Failed to serialize pruned tx"));
|
||||||
std::string pruned = ss.str();
|
std::string pruned = ss.str();
|
||||||
MDB_val_copy<blobdata> pruned_blob(pruned);
|
MDB_val_sized(pruned_blob, pruned);
|
||||||
result = mdb_cursor_put(m_cur_txs_pruned, &val_tx_id, &pruned_blob, MDB_APPEND);
|
result = mdb_cursor_put(m_cur_txs_pruned, &val_tx_id, &pruned_blob, MDB_APPEND);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to add pruned tx blob to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add pruned tx blob to db transaction: ", result).c_str()));
|
||||||
@ -844,7 +849,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
|
|||||||
if (pruned.size() > blob.size())
|
if (pruned.size() > blob.size())
|
||||||
throw0(DB_ERROR("pruned tx size is larger than tx size"));
|
throw0(DB_ERROR("pruned tx size is larger than tx size"));
|
||||||
cryptonote::blobdata prunable(blob.data() + pruned.size(), blob.size() - pruned.size());
|
cryptonote::blobdata prunable(blob.data() + pruned.size(), blob.size() - pruned.size());
|
||||||
MDB_val_copy<blobdata> prunable_blob(prunable);
|
MDB_val_sized(prunable_blob, prunable);
|
||||||
result = mdb_cursor_put(m_cur_txs_prunable, &val_tx_id, &prunable_blob, MDB_APPEND);
|
result = mdb_cursor_put(m_cur_txs_prunable, &val_tx_id, &prunable_blob, MDB_APPEND);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to add prunable tx blob to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add prunable tx blob to db transaction: ", result).c_str()));
|
||||||
@ -1331,7 +1336,7 @@ void BlockchainLMDB::open(const std::string& filename, const int db_flags)
|
|||||||
|
|
||||||
bool compatible = true;
|
bool compatible = true;
|
||||||
|
|
||||||
MDB_val_copy<const char*> k("version");
|
MDB_val_str(k, "version");
|
||||||
MDB_val v;
|
MDB_val v;
|
||||||
auto get_result = mdb_get(txn, m_properties, &k, &v);
|
auto get_result = mdb_get(txn, m_properties, &k, &v);
|
||||||
if(get_result == MDB_SUCCESS)
|
if(get_result == MDB_SUCCESS)
|
||||||
@ -1379,7 +1384,7 @@ void BlockchainLMDB::open(const std::string& filename, const int db_flags)
|
|||||||
// only write version on an empty DB
|
// only write version on an empty DB
|
||||||
if (m_height == 0)
|
if (m_height == 0)
|
||||||
{
|
{
|
||||||
MDB_val_copy<const char*> k("version");
|
MDB_val_str(k, "version");
|
||||||
MDB_val_copy<uint32_t> v(VERSION);
|
MDB_val_copy<uint32_t> v(VERSION);
|
||||||
auto put_result = mdb_put(txn, m_properties, &k, &v, 0);
|
auto put_result = mdb_put(txn, m_properties, &k, &v, 0);
|
||||||
if (put_result != MDB_SUCCESS)
|
if (put_result != MDB_SUCCESS)
|
||||||
@ -1476,7 +1481,7 @@ void BlockchainLMDB::reset()
|
|||||||
throw0(DB_ERROR(lmdb_error("Failed to drop m_properties: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to drop m_properties: ", result).c_str()));
|
||||||
|
|
||||||
// init with current version
|
// init with current version
|
||||||
MDB_val_copy<const char*> k("version");
|
MDB_val_str(k, "version");
|
||||||
MDB_val_copy<uint32_t> v(VERSION);
|
MDB_val_copy<uint32_t> v(VERSION);
|
||||||
if (auto result = mdb_put(txn, m_properties, &k, &v, 0))
|
if (auto result = mdb_put(txn, m_properties, &k, &v, 0))
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to write version to database: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to write version to database: ", result).c_str()));
|
||||||
@ -1608,7 +1613,7 @@ void BlockchainLMDB::add_txpool_tx(const crypto::hash &txid, const cryptonote::b
|
|||||||
else
|
else
|
||||||
throw1(DB_ERROR(lmdb_error("Error adding txpool tx metadata to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Error adding txpool tx metadata to db transaction: ", result).c_str()));
|
||||||
}
|
}
|
||||||
MDB_val_copy<cryptonote::blobdata> blob_val(blob);
|
MDB_val_sized(blob_val, blob);
|
||||||
if (auto result = mdb_cursor_put(m_cur_txpool_blob, &k, &blob_val, MDB_NODUPDATA)) {
|
if (auto result = mdb_cursor_put(m_cur_txpool_blob, &k, &blob_val, MDB_NODUPDATA)) {
|
||||||
if (result == MDB_KEYEXIST)
|
if (result == MDB_KEYEXIST)
|
||||||
throw1(DB_ERROR("Attempting to add txpool tx blob that's already in the db"));
|
throw1(DB_ERROR("Attempting to add txpool tx blob that's already in the db"));
|
||||||
@ -4047,7 +4052,7 @@ void BlockchainLMDB::migrate_0_1()
|
|||||||
uint32_t version = 1;
|
uint32_t version = 1;
|
||||||
v.mv_data = (void *)&version;
|
v.mv_data = (void *)&version;
|
||||||
v.mv_size = sizeof(version);
|
v.mv_size = sizeof(version);
|
||||||
MDB_val_copy<const char *> vk("version");
|
MDB_val_str(vk, "version");
|
||||||
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
||||||
@ -4189,7 +4194,7 @@ void BlockchainLMDB::migrate_1_2()
|
|||||||
uint32_t version = 2;
|
uint32_t version = 2;
|
||||||
v.mv_data = (void *)&version;
|
v.mv_data = (void *)&version;
|
||||||
v.mv_size = sizeof(version);
|
v.mv_size = sizeof(version);
|
||||||
MDB_val_copy<const char *> vk("version");
|
MDB_val_str(vk, "version");
|
||||||
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
||||||
@ -4324,7 +4329,7 @@ void BlockchainLMDB::migrate_2_3()
|
|||||||
uint32_t version = 3;
|
uint32_t version = 3;
|
||||||
v.mv_data = (void *)&version;
|
v.mv_data = (void *)&version;
|
||||||
v.mv_size = sizeof(version);
|
v.mv_size = sizeof(version);
|
||||||
MDB_val_copy<const char *> vk("version");
|
MDB_val_str(vk, "version");
|
||||||
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
result = mdb_txn_begin(m_env, NULL, 0, txn);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", result).c_str()));
|
||||||
|
Loading…
Reference in New Issue
Block a user