mirror of
https://github.com/monero-project/monero.git
synced 2024-12-22 19:49:30 +00:00
Fix blockchain_import wedge on exception in cleanup_handle_incoming_blocks
This commit is contained in:
parent
0ffad5a359
commit
cf4aa65316
5 changed files with 47 additions and 15 deletions
|
@ -2604,6 +2604,16 @@ void BlockchainLMDB::batch_commit()
|
|||
memset(&m_wcursors, 0, sizeof(m_wcursors));
|
||||
}
|
||||
|
||||
void BlockchainLMDB::cleanup_batch()
|
||||
{
|
||||
// for destruction of batch transaction
|
||||
m_write_txn = nullptr;
|
||||
delete m_write_batch_txn;
|
||||
m_write_batch_txn = nullptr;
|
||||
m_batch_active = false;
|
||||
memset(&m_wcursors, 0, sizeof(m_wcursors));
|
||||
}
|
||||
|
||||
void BlockchainLMDB::batch_stop()
|
||||
{
|
||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||
|
@ -2618,15 +2628,18 @@ void BlockchainLMDB::batch_stop()
|
|||
check_open();
|
||||
LOG_PRINT_L3("batch transaction: committing...");
|
||||
TIME_MEASURE_START(time1);
|
||||
m_write_txn->commit();
|
||||
TIME_MEASURE_FINISH(time1);
|
||||
time_commit1 += time1;
|
||||
// for destruction of batch transaction
|
||||
m_write_txn = nullptr;
|
||||
delete m_write_batch_txn;
|
||||
m_write_batch_txn = nullptr;
|
||||
m_batch_active = false;
|
||||
memset(&m_wcursors, 0, sizeof(m_wcursors));
|
||||
try
|
||||
{
|
||||
m_write_txn->commit();
|
||||
TIME_MEASURE_FINISH(time1);
|
||||
time_commit1 += time1;
|
||||
cleanup_batch();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
cleanup_batch();
|
||||
throw;
|
||||
}
|
||||
LOG_PRINT_L3("batch transaction: end");
|
||||
}
|
||||
|
||||
|
|
|
@ -368,6 +368,9 @@ private:
|
|||
// migrate from DB version 0 to 1
|
||||
void migrate_0_1();
|
||||
|
||||
void cleanup_batch();
|
||||
|
||||
private:
|
||||
MDB_env* m_env;
|
||||
|
||||
MDB_dbi m_blocks;
|
||||
|
|
|
@ -208,7 +208,8 @@ int check_flush(cryptonote::core &core, std::list<block_complete_entry> &blocks,
|
|||
}
|
||||
|
||||
} // each download block
|
||||
core.cleanup_handle_incoming_blocks();
|
||||
if (!core.cleanup_handle_incoming_blocks())
|
||||
return 1;
|
||||
|
||||
blocks.clear();
|
||||
return 0;
|
||||
|
@ -394,7 +395,10 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
|||
blocks.push_back({block, txs});
|
||||
int ret = check_flush(core, blocks, false);
|
||||
if (ret)
|
||||
{
|
||||
quit = 2; // make sure we don't commit partial block data
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -3582,12 +3582,23 @@ void Blockchain::block_longhash_worker(uint64_t height, const std::vector<block>
|
|||
//------------------------------------------------------------------
|
||||
bool Blockchain::cleanup_handle_incoming_blocks(bool force_sync)
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
MTRACE("Blockchain::" << __func__);
|
||||
CRITICAL_REGION_BEGIN(m_blockchain_lock);
|
||||
TIME_MEASURE_START(t1);
|
||||
|
||||
m_db->batch_stop();
|
||||
if (m_sync_counter > 0)
|
||||
try
|
||||
{
|
||||
m_db->batch_stop();
|
||||
success = true;
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
MERROR("Exception in cleanup_handle_incoming_blocks: " << e.what());
|
||||
}
|
||||
|
||||
if (success && m_sync_counter > 0)
|
||||
{
|
||||
if (force_sync)
|
||||
{
|
||||
|
@ -3622,7 +3633,7 @@ bool Blockchain::cleanup_handle_incoming_blocks(bool force_sync)
|
|||
CRITICAL_REGION_END();
|
||||
m_tx_pool.unlock();
|
||||
|
||||
return true;
|
||||
return success;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
|
|
@ -1068,12 +1068,13 @@ namespace cryptonote
|
|||
//-----------------------------------------------------------------------------------------------
|
||||
bool core::cleanup_handle_incoming_blocks(bool force_sync)
|
||||
{
|
||||
bool success = false;
|
||||
try {
|
||||
m_blockchain_storage.cleanup_handle_incoming_blocks(force_sync);
|
||||
success = m_blockchain_storage.cleanup_handle_incoming_blocks(force_sync);
|
||||
}
|
||||
catch (...) {}
|
||||
m_incoming_tx_lock.unlock();
|
||||
return true;
|
||||
return success;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue