BlockchainDB/LMDB: Refactor block-scope DB txn handling for add block

Move block-scope txn start and stop from BlockchainLMDB to BlockchainDB.
This commit is contained in:
warptangent 2016-02-08 08:32:36 -08:00
parent f3a6000094
commit fd46c96dce
No known key found for this signature in database
GPG key ID: 0E490BEBFBE4E92D
2 changed files with 10 additions and 20 deletions

View file

@ -99,6 +99,8 @@ uint64_t BlockchainDB::add_block( const block& blk
, const std::vector<transaction>& txs , const std::vector<transaction>& txs
) )
{ {
block_txn_start();
TIME_MEASURE_START(time1); TIME_MEASURE_START(time1);
crypto::hash blk_hash = get_block_hash(blk); crypto::hash blk_hash = get_block_hash(blk);
TIME_MEASURE_FINISH(time1); TIME_MEASURE_FINISH(time1);
@ -125,9 +127,15 @@ uint64_t BlockchainDB::add_block( const block& blk
TIME_MEASURE_FINISH(time1); TIME_MEASURE_FINISH(time1);
time_add_transaction += time1; time_add_transaction += time1;
// DB's new height based on this added block is only incremented after this
// function returns, so height() here returns the new previous height.
uint64_t prev_height = height();
block_txn_stop();
++num_calls; ++num_calls;
return height(); return prev_height;
} }
void BlockchainDB::pop_block(block& blk, std::vector<transaction>& txs) void BlockchainDB::pop_block(block& blk, std::vector<transaction>& txs)

View file

@ -2244,33 +2244,15 @@ uint64_t BlockchainLMDB::add_block(const block& blk, const size_t& block_size, c
} }
} }
mdb_txn_safe txn;
if (! m_batch_active)
{
if (auto mdb_res = mdb_txn_begin(m_env, NULL, 0, txn))
throw0(DB_ERROR(lmdb_error("Failed to create a transaction for the db: ", mdb_res).c_str()));
m_write_txn = &txn;
}
uint64_t num_outputs = m_num_outputs; uint64_t num_outputs = m_num_outputs;
try try
{ {
BlockchainDB::add_block(blk, block_size, cumulative_difficulty, coins_generated, txs); BlockchainDB::add_block(blk, block_size, cumulative_difficulty, coins_generated, txs);
if (! m_batch_active)
{
m_write_txn = NULL;
TIME_MEASURE_START(time1);
txn.commit();
TIME_MEASURE_FINISH(time1);
time_commit1 += time1;
}
} }
catch (...) catch (...)
{ {
m_num_outputs = num_outputs; m_num_outputs = num_outputs;
if (! m_batch_active) block_txn_abort();
m_write_txn = NULL;
throw; throw;
} }