mirror of
https://github.com/monero-project/monero.git
synced 2026-01-17 19:37:30 +09:00
Merge pull request #10257
d8d3cf9 p2p: fix race causing dropped connections during sync (j-berman)
This commit is contained in:
commit
9dff86103e
@ -728,13 +728,13 @@ crypto::hash Blockchain::get_tail_id() const
|
|||||||
* powers of 2 less recent from there, so 13, 17, 25, etc...
|
* powers of 2 less recent from there, so 13, 17, 25, etc...
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
bool Blockchain::get_short_chain_history(std::list<crypto::hash>& ids) const
|
bool Blockchain::get_short_chain_history(std::list<crypto::hash>& ids, uint64_t& current_height) const
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
uint64_t current_multiplier = 1;
|
uint64_t current_multiplier = 1;
|
||||||
uint64_t sz = m_db->height();
|
uint64_t sz = current_height = m_db->height();
|
||||||
|
|
||||||
if(!sz)
|
if(!sz)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -445,10 +445,11 @@ namespace cryptonote
|
|||||||
* powers of 2 less recent from there, so 13, 17, 25, etc...
|
* powers of 2 less recent from there, so 13, 17, 25, etc...
|
||||||
*
|
*
|
||||||
* @param ids return-by-reference list to put the resulting hashes in
|
* @param ids return-by-reference list to put the resulting hashes in
|
||||||
|
* @param current_height the current blockchain height, return-by-reference
|
||||||
*
|
*
|
||||||
* @return true
|
* @return true
|
||||||
*/
|
*/
|
||||||
bool get_short_chain_history(std::list<crypto::hash>& ids) const;
|
bool get_short_chain_history(std::list<crypto::hash>& ids, uint64_t& current_height) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get recent block hashes for a foreign chain
|
* @brief get recent block hashes for a foreign chain
|
||||||
|
|||||||
@ -1536,9 +1536,9 @@ namespace cryptonote
|
|||||||
return m_mempool.get_pool_for_rpc(tx_infos, key_image_infos);
|
return m_mempool.get_pool_for_rpc(tx_infos, key_image_infos);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::get_short_chain_history(std::list<crypto::hash>& ids) const
|
bool core::get_short_chain_history(std::list<crypto::hash>& ids, uint64_t& current_height) const
|
||||||
{
|
{
|
||||||
return m_blockchain_storage.get_short_chain_history(ids);
|
return m_blockchain_storage.get_short_chain_history(ids, current_height);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NOTIFY_RESPONSE_GET_OBJECTS::request& rsp, cryptonote_connection_context& context)
|
bool core::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, NOTIFY_RESPONSE_GET_OBJECTS::request& rsp, cryptonote_connection_context& context)
|
||||||
|
|||||||
@ -580,7 +580,7 @@ namespace cryptonote
|
|||||||
*
|
*
|
||||||
* @note see Blockchain::get_short_chain_history
|
* @note see Blockchain::get_short_chain_history
|
||||||
*/
|
*/
|
||||||
bool get_short_chain_history(std::list<crypto::hash>& ids) const;
|
bool get_short_chain_history(std::list<crypto::hash>& ids, uint64_t& current_height) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @copydoc Blockchain::find_blockchain_supplement(const std::list<crypto::hash>&, NOTIFY_RESPONSE_CHAIN_ENTRY::request&) const
|
* @copydoc Blockchain::find_blockchain_supplement(const std::list<crypto::hash>&, NOTIFY_RESPONSE_CHAIN_ENTRY::request&) const
|
||||||
|
|||||||
@ -274,8 +274,7 @@ namespace cryptonote
|
|||||||
{
|
{
|
||||||
NOTIFY_REQUEST_CHAIN::request r = {};
|
NOTIFY_REQUEST_CHAIN::request r = {};
|
||||||
context.m_needed_objects.clear();
|
context.m_needed_objects.clear();
|
||||||
context.m_expect_height = m_core.get_current_blockchain_height();
|
m_core.get_short_chain_history(r.block_ids, context.m_expect_height);
|
||||||
m_core.get_short_chain_history(r.block_ids);
|
|
||||||
handler_request_blocks_history( r.block_ids ); // change the limit(?), sleep(?)
|
handler_request_blocks_history( r.block_ids ); // change the limit(?), sleep(?)
|
||||||
r.prune = m_sync_pruned_blocks;
|
r.prune = m_sync_pruned_blocks;
|
||||||
context.m_last_request_time = boost::posix_time::microsec_clock::universal_time();
|
context.m_last_request_time = boost::posix_time::microsec_clock::universal_time();
|
||||||
@ -730,8 +729,7 @@ namespace cryptonote
|
|||||||
context.m_needed_objects.clear();
|
context.m_needed_objects.clear();
|
||||||
context.m_state = cryptonote_connection_context::state_synchronizing;
|
context.m_state = cryptonote_connection_context::state_synchronizing;
|
||||||
NOTIFY_REQUEST_CHAIN::request r = {};
|
NOTIFY_REQUEST_CHAIN::request r = {};
|
||||||
context.m_expect_height = m_core.get_current_blockchain_height();
|
m_core.get_short_chain_history(r.block_ids, context.m_expect_height);
|
||||||
m_core.get_short_chain_history(r.block_ids);
|
|
||||||
handler_request_blocks_history( r.block_ids ); // change the limit(?), sleep(?)
|
handler_request_blocks_history( r.block_ids ); // change the limit(?), sleep(?)
|
||||||
r.prune = m_sync_pruned_blocks;
|
r.prune = m_sync_pruned_blocks;
|
||||||
context.m_last_request_time = boost::posix_time::microsec_clock::universal_time();
|
context.m_last_request_time = boost::posix_time::microsec_clock::universal_time();
|
||||||
@ -2340,8 +2338,7 @@ skip:
|
|||||||
{//we have to fetch more objects ids, request blockchain entry
|
{//we have to fetch more objects ids, request blockchain entry
|
||||||
|
|
||||||
NOTIFY_REQUEST_CHAIN::request r = {};
|
NOTIFY_REQUEST_CHAIN::request r = {};
|
||||||
context.m_expect_height = m_core.get_current_blockchain_height();
|
m_core.get_short_chain_history(r.block_ids, context.m_expect_height);
|
||||||
m_core.get_short_chain_history(r.block_ids);
|
|
||||||
CHECK_AND_ASSERT_MES(!r.block_ids.empty(), false, "Short chain history is empty");
|
CHECK_AND_ASSERT_MES(!r.block_ids.empty(), false, "Short chain history is empty");
|
||||||
|
|
||||||
// we'll want to start off from where we are on that peer, which may not be added yet
|
// we'll want to start off from where we are on that peer, which may not be added yet
|
||||||
@ -2477,7 +2474,7 @@ skip:
|
|||||||
int t_cryptonote_protocol_handler<t_core>::handle_response_chain_entry(int command, NOTIFY_RESPONSE_CHAIN_ENTRY::request& arg, cryptonote_connection_context& context)
|
int t_cryptonote_protocol_handler<t_core>::handle_response_chain_entry(int command, NOTIFY_RESPONSE_CHAIN_ENTRY::request& arg, cryptonote_connection_context& context)
|
||||||
{
|
{
|
||||||
MLOG_P2P_MESSAGE("Received NOTIFY_RESPONSE_CHAIN_ENTRY: m_block_ids.size()=" << arg.m_block_ids.size()
|
MLOG_P2P_MESSAGE("Received NOTIFY_RESPONSE_CHAIN_ENTRY: m_block_ids.size()=" << arg.m_block_ids.size()
|
||||||
<< ", m_start_height=" << arg.start_height << ", m_total_height=" << arg.total_height);
|
<< ", m_start_height=" << arg.start_height << ", m_total_height=" << arg.total_height << ", expect height=" << context.m_expect_height);
|
||||||
MLOG_PEER_STATE("received chain");
|
MLOG_PEER_STATE("received chain");
|
||||||
|
|
||||||
if (context.m_expect_response != NOTIFY_RESPONSE_CHAIN_ENTRY::ID)
|
if (context.m_expect_response != NOTIFY_RESPONSE_CHAIN_ENTRY::ID)
|
||||||
|
|||||||
@ -56,7 +56,7 @@ public:
|
|||||||
void set_target_blockchain_height(uint64_t) {}
|
void set_target_blockchain_height(uint64_t) {}
|
||||||
bool init(const boost::program_options::variables_map& vm) {return true ;}
|
bool init(const boost::program_options::variables_map& vm) {return true ;}
|
||||||
bool deinit(){return true;}
|
bool deinit(){return true;}
|
||||||
bool get_short_chain_history(std::list<crypto::hash>& ids) const { return true; }
|
bool get_short_chain_history(std::list<crypto::hash>& ids, uint64_t& current_height) const { return true; }
|
||||||
bool have_block(const crypto::hash& id, int *where = NULL) const {return false;}
|
bool have_block(const crypto::hash& id, int *where = NULL) const {return false;}
|
||||||
bool have_block_unlocked(const crypto::hash& id, int *where = NULL) const {return false;}
|
bool have_block_unlocked(const crypto::hash& id, int *where = NULL) const {return false;}
|
||||||
void get_blockchain_top(uint64_t& height, crypto::hash& top_id)const{height=0;top_id=crypto::null_hash;}
|
void get_blockchain_top(uint64_t& height, crypto::hash& top_id)const{height=0;top_id=crypto::null_hash;}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user