mirror of
https://github.com/monero-project/monero.git
synced 2024-11-17 16:27:39 +00:00
Merge pull request #5448
d009f6dd
rpc: fix get_block_hashes.bin from wallet on pruned blockchain (moneromooo-monero)bb0ef5b1
blockchain: lock the blockchain while pruning (moneromooo-monero)
This commit is contained in:
commit
68d131615e
4 changed files with 18 additions and 14 deletions
|
@ -2285,7 +2285,7 @@ bool Blockchain::get_transactions(const t_ids_container& txs_ids, t_tx_container
|
||||||
// Find the split point between us and foreign blockchain and return
|
// Find the split point between us and foreign blockchain and return
|
||||||
// (by reference) the most recent common block hash along with up to
|
// (by reference) the most recent common block hash along with up to
|
||||||
// BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT additional (more recent) hashes.
|
// BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT additional (more recent) hashes.
|
||||||
bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const
|
bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height, bool clip_pruned) const
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||||
|
@ -2298,9 +2298,13 @@ bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qbloc
|
||||||
|
|
||||||
db_rtxn_guard rtxn_guard(m_db);
|
db_rtxn_guard rtxn_guard(m_db);
|
||||||
current_height = get_current_blockchain_height();
|
current_height = get_current_blockchain_height();
|
||||||
const uint32_t pruning_seed = get_blockchain_pruning_seed();
|
uint64_t stop_height = current_height;
|
||||||
start_height = tools::get_next_unpruned_block_height(start_height, current_height, pruning_seed);
|
if (clip_pruned)
|
||||||
uint64_t stop_height = tools::get_next_pruned_block_height(start_height, current_height, pruning_seed);
|
{
|
||||||
|
const uint32_t pruning_seed = get_blockchain_pruning_seed();
|
||||||
|
start_height = tools::get_next_unpruned_block_height(start_height, current_height, pruning_seed);
|
||||||
|
stop_height = tools::get_next_pruned_block_height(start_height, current_height, pruning_seed);
|
||||||
|
}
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
hashes.reserve(std::min((size_t)(stop_height - start_height), (size_t)BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT));
|
hashes.reserve(std::min((size_t)(stop_height - start_height), (size_t)BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT));
|
||||||
for(size_t i = start_height; i < stop_height && count < BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT; i++, count++)
|
for(size_t i = start_height; i < stop_height && count < BLOCKS_IDS_SYNCHRONIZING_DEFAULT_COUNT; i++, count++)
|
||||||
|
@ -2316,7 +2320,7 @@ bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qbloc
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||||
|
|
||||||
bool result = find_blockchain_supplement(qblock_ids, resp.m_block_ids, resp.start_height, resp.total_height);
|
bool result = find_blockchain_supplement(qblock_ids, resp.m_block_ids, resp.start_height, resp.total_height, true);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
cryptonote::difficulty_type wide_cumulative_difficulty = m_db->get_block_cumulative_difficulty(resp.total_height - 1);
|
cryptonote::difficulty_type wide_cumulative_difficulty = m_db->get_block_cumulative_difficulty(resp.total_height - 1);
|
||||||
|
@ -3894,6 +3898,10 @@ leave:
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
bool Blockchain::prune_blockchain(uint32_t pruning_seed)
|
bool Blockchain::prune_blockchain(uint32_t pruning_seed)
|
||||||
{
|
{
|
||||||
|
m_tx_pool.lock();
|
||||||
|
epee::misc_utils::auto_scope_leave_caller unlocker = epee::misc_utils::create_scope_leave_handler([&](){m_tx_pool.unlock();});
|
||||||
|
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||||
|
|
||||||
return m_db->prune_blockchain(pruning_seed);
|
return m_db->prune_blockchain(pruning_seed);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
|
@ -394,10 +394,11 @@ namespace cryptonote
|
||||||
* @param hashes the hashes to be returned, return-by-reference
|
* @param hashes the hashes to be returned, return-by-reference
|
||||||
* @param start_height the start height, return-by-reference
|
* @param start_height the start height, return-by-reference
|
||||||
* @param current_height the current blockchain height, return-by-reference
|
* @param current_height the current blockchain height, return-by-reference
|
||||||
|
* @param clip_pruned whether to constrain results to unpruned data
|
||||||
*
|
*
|
||||||
* @return true if a block found in common, else false
|
* @return true if a block found in common, else false
|
||||||
*/
|
*/
|
||||||
bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height) const;
|
bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, std::vector<crypto::hash>& hashes, uint64_t& start_height, uint64_t& current_height, bool clip_pruned) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get recent block hashes for a foreign chain
|
* @brief get recent block hashes for a foreign chain
|
||||||
|
|
|
@ -433,17 +433,12 @@ namespace cryptonote
|
||||||
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_HASHES_FAST>(invoke_http_mode::BIN, "/gethashes.bin", req, res, r))
|
if (use_bootstrap_daemon_if_necessary<COMMAND_RPC_GET_HASHES_FAST>(invoke_http_mode::BIN, "/gethashes.bin", req, res, r))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
NOTIFY_RESPONSE_CHAIN_ENTRY::request resp;
|
res.start_height = req.start_height;
|
||||||
|
if(!m_core.get_blockchain_storage().find_blockchain_supplement(req.block_ids, res.m_block_ids, res.start_height, res.current_height, false))
|
||||||
resp.start_height = req.start_height;
|
|
||||||
if(!m_core.find_blockchain_supplement(req.block_ids, resp))
|
|
||||||
{
|
{
|
||||||
res.status = "Failed";
|
res.status = "Failed";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
res.current_height = resp.total_height;
|
|
||||||
res.start_height = resp.start_height;
|
|
||||||
res.m_block_ids = std::move(resp.m_block_ids);
|
|
||||||
|
|
||||||
res.status = CORE_RPC_STATUS_OK;
|
res.status = CORE_RPC_STATUS_OK;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -141,7 +141,7 @@ namespace rpc
|
||||||
|
|
||||||
auto& chain = m_core.get_blockchain_storage();
|
auto& chain = m_core.get_blockchain_storage();
|
||||||
|
|
||||||
if (!chain.find_blockchain_supplement(req.known_hashes, res.hashes, res.start_height, res.current_height))
|
if (!chain.find_blockchain_supplement(req.known_hashes, res.hashes, res.start_height, res.current_height, false))
|
||||||
{
|
{
|
||||||
res.status = Message::STATUS_FAILED;
|
res.status = Message::STATUS_FAILED;
|
||||||
res.error_details = "Blockchain::find_blockchain_supplement() returned false";
|
res.error_details = "Blockchain::find_blockchain_supplement() returned false";
|
||||||
|
|
Loading…
Reference in a new issue