Use cursors in some remove functions
Helps when they're called repeatedly in one txn
This commit is contained in:
parent
118dd69dd5
commit
b2f1c58805
|
@ -625,6 +625,8 @@ void BlockchainLMDB::remove_block()
|
||||||
|
|
||||||
mdb_txn_cursors *m_cursors = &m_wcursors;
|
mdb_txn_cursors *m_cursors = &m_wcursors;
|
||||||
CURSOR(block_info)
|
CURSOR(block_info)
|
||||||
|
CURSOR(block_heights)
|
||||||
|
CURSOR(blocks)
|
||||||
MDB_val_copy<uint64_t> k(m_height - 1);
|
MDB_val_copy<uint64_t> k(m_height - 1);
|
||||||
MDB_val h = k;
|
MDB_val h = k;
|
||||||
if ((result = mdb_cursor_get(m_cur_block_info, (MDB_val *)&zerokval, &h, MDB_GET_BOTH)))
|
if ((result = mdb_cursor_get(m_cur_block_info, (MDB_val *)&zerokval, &h, MDB_GET_BOTH)))
|
||||||
|
@ -635,10 +637,14 @@ void BlockchainLMDB::remove_block()
|
||||||
blk_height bh = {bi->bi_hash, 0};
|
blk_height bh = {bi->bi_hash, 0};
|
||||||
h.mv_data = (void *)&bh;
|
h.mv_data = (void *)&bh;
|
||||||
h.mv_size = sizeof(bh);
|
h.mv_size = sizeof(bh);
|
||||||
if ((result = mdb_del(*m_write_txn, m_block_heights, (MDB_val *)&zerokval, &h)))
|
if ((result = mdb_cursor_get(m_cur_block_heights, (MDB_val *)&zerokval, &h, MDB_GET_BOTH)))
|
||||||
|
throw1(DB_ERROR(lmdb_error("Failed to locate block height by hash for removal: ", result).c_str()));
|
||||||
|
if ((result = mdb_cursor_del(m_cur_block_heights, 0)))
|
||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of block height by hash to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Failed to add removal of block height by hash to db transaction: ", result).c_str()));
|
||||||
|
|
||||||
if ((result = mdb_del(*m_write_txn, m_blocks, &k, NULL)))
|
if ((result = mdb_cursor_get(m_cur_blocks, &k, NULL, MDB_SET)))
|
||||||
|
throw1(DB_ERROR(lmdb_error("Failed to locate block for removal: ", result).c_str()));
|
||||||
|
if ((result = mdb_cursor_del(m_cur_blocks, 0)))
|
||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of block to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Failed to add removal of block to db transaction: ", result).c_str()));
|
||||||
|
|
||||||
if ((result = mdb_cursor_del(m_cur_block_info, 0)))
|
if ((result = mdb_cursor_del(m_cur_block_info, 0)))
|
||||||
|
@ -699,6 +705,8 @@ void BlockchainLMDB::remove_transaction_data(const crypto::hash& tx_hash, const
|
||||||
|
|
||||||
mdb_txn_cursors *m_cursors = &m_wcursors;
|
mdb_txn_cursors *m_cursors = &m_wcursors;
|
||||||
CURSOR(tx_indices)
|
CURSOR(tx_indices)
|
||||||
|
CURSOR(txs)
|
||||||
|
CURSOR(tx_outputs)
|
||||||
|
|
||||||
txindex ti = {tx_hash};
|
txindex ti = {tx_hash};
|
||||||
MDB_val val_h = {sizeof(ti), (void *)&ti};
|
MDB_val val_h = {sizeof(ti), (void *)&ti};
|
||||||
|
@ -709,16 +717,25 @@ void BlockchainLMDB::remove_transaction_data(const crypto::hash& tx_hash, const
|
||||||
uint64_t tx_index = tip->data.tx_index;
|
uint64_t tx_index = tip->data.tx_index;
|
||||||
MDB_val_copy<uint64_t> val_tx_index(tx_index);
|
MDB_val_copy<uint64_t> val_tx_index(tx_index);
|
||||||
|
|
||||||
if ((result = mdb_del(*m_write_txn, m_txs, &val_tx_index, NULL)))
|
if ((result = mdb_cursor_get(m_cur_txs, &val_tx_index, NULL, MDB_SET)))
|
||||||
|
throw1(DB_ERROR(lmdb_error("Failed to locate tx for removal: ", result).c_str()));
|
||||||
|
result = mdb_cursor_del(m_cur_txs, 0);
|
||||||
|
if (result)
|
||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of tx to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Failed to add removal of tx to db transaction: ", result).c_str()));
|
||||||
|
|
||||||
remove_tx_outputs(tx_index, tx);
|
remove_tx_outputs(tx_index, tx);
|
||||||
|
|
||||||
result = mdb_del(*m_write_txn, m_tx_outputs, &val_tx_index, NULL);
|
result = mdb_cursor_get(m_cur_tx_outputs, &val_tx_index, NULL, MDB_SET);
|
||||||
if (result == MDB_NOTFOUND)
|
if (result == MDB_NOTFOUND)
|
||||||
LOG_PRINT_L1("tx has no outputs to remove: " << tx_hash);
|
LOG_PRINT_L1("tx has no outputs to remove: " << tx_hash);
|
||||||
else if (result)
|
else if (result)
|
||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of tx outputs to db transaction: ", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Failed to locate tx outputs for removal: ", result).c_str()));
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = mdb_cursor_del(m_cur_tx_outputs, 0);
|
||||||
|
if (result)
|
||||||
|
throw1(DB_ERROR(lmdb_error("Failed to add removal of tx outputs to db transaction: ", result).c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
// Though other things could change, so long as earlier functions (like
|
// Though other things could change, so long as earlier functions (like
|
||||||
// remove_tx_outputs) need to do the lookup of tx hash -> tx index, don't
|
// remove_tx_outputs) need to do the lookup of tx hash -> tx index, don't
|
||||||
|
@ -906,11 +923,20 @@ void BlockchainLMDB::remove_spent_key(const crypto::key_image& k_image)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
|
mdb_txn_cursors *m_cursors = &m_wcursors;
|
||||||
|
|
||||||
|
CURSOR(spent_keys)
|
||||||
|
|
||||||
MDB_val k = {sizeof(k_image), (void *)&k_image};
|
MDB_val k = {sizeof(k_image), (void *)&k_image};
|
||||||
auto result = mdb_del(*m_write_txn, m_spent_keys, (MDB_val *)&zerokval, &k);
|
auto result = mdb_cursor_get(m_cur_spent_keys, (MDB_val *)&zerokval, &k, MDB_GET_BOTH);
|
||||||
if (result != 0 && result != MDB_NOTFOUND)
|
if (result != 0 && result != MDB_NOTFOUND)
|
||||||
throw1(DB_ERROR(lmdb_error("Error adding removal of key image to db transaction", result).c_str()));
|
throw1(DB_ERROR(lmdb_error("Error finding spent key to remove", result).c_str()));
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = mdb_cursor_del(m_cur_spent_keys, 0);
|
||||||
|
if (result)
|
||||||
|
throw1(DB_ERROR(lmdb_error("Error adding removal of key image to db transaction", result).c_str()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
blobdata BlockchainLMDB::output_to_blob(const tx_out& output) const
|
blobdata BlockchainLMDB::output_to_blob(const tx_out& output) const
|
||||||
|
|
Loading…
Reference in New Issue