p2p: possibly fix crash in relay_blocks
This commit is contained in:
parent
c36cb54340
commit
4adde0423b
4 changed files with 43 additions and 17 deletions
|
@ -1093,20 +1093,35 @@ namespace cryptonote
|
||||||
fluffy_arg.b = arg.b;
|
fluffy_arg.b = arg.b;
|
||||||
fluffy_arg.b.txs = fluffy_txs;
|
fluffy_arg.b.txs = fluffy_txs;
|
||||||
|
|
||||||
m_p2p->for_each_connection([this, &arg, &fluffy_arg](connection_context& cntxt, nodetool::peerid_type peer_id, uint32_t support_flags)
|
// pre-serialize them
|
||||||
|
std::string fullBlob, fluffyBlob;
|
||||||
|
epee::serialization::store_t_to_binary(arg, fullBlob);
|
||||||
|
epee::serialization::store_t_to_binary(fluffy_arg, fluffyBlob);
|
||||||
|
|
||||||
|
// sort peers between fluffy ones and others
|
||||||
|
std::list<boost::uuids::uuid> fullConnections, fluffyConnections;
|
||||||
|
m_p2p->for_each_connection([this, &arg, &fluffy_arg, &exclude_context, &fullConnections, &fluffyConnections](connection_context& context, nodetool::peerid_type peer_id, uint32_t support_flags)
|
||||||
{
|
{
|
||||||
if(m_core.get_testnet() && support_flags & P2P_SUPPORT_FLAG_FLUFFY_BLOCKS)
|
if (peer_id && exclude_context.m_connection_id != context.m_connection_id)
|
||||||
{
|
{
|
||||||
LOG_PRINT_YELLOW("PEER SUPPORTS FLUFFY BLOCKS - RELAYING THIN/COMPACT WHATEVER BLOCK", LOG_LEVEL_1);
|
if(m_core.get_testnet() && (support_flags & P2P_SUPPORT_FLAG_FLUFFY_BLOCKS))
|
||||||
return post_notify<NOTIFY_NEW_FLUFFY_BLOCK>(fluffy_arg, cntxt);
|
{
|
||||||
}
|
LOG_PRINT_CCONTEXT_YELLOW("PEER SUPPORTS FLUFFY BLOCKS - RELAYING THIN/COMPACT WHATEVER BLOCK", LOG_LEVEL_1);
|
||||||
else
|
fluffyConnections.push_back(context.m_connection_id);
|
||||||
{
|
}
|
||||||
LOG_PRINT_YELLOW("PEER DOESN'T SUPPORT FLUFFY BLOCKS - RELAYING FULL BLOCK", LOG_LEVEL_1);
|
else
|
||||||
return post_notify<NOTIFY_NEW_BLOCK>(arg, cntxt);
|
{
|
||||||
|
LOG_PRINT_CCONTEXT_YELLOW("PEER DOESN'T SUPPORT FLUFFY BLOCKS - RELAYING FULL BLOCK", LOG_LEVEL_1);
|
||||||
|
fullConnections.push_back(context.m_connection_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// send fluffy ones first, we want to encourage people to run that
|
||||||
|
m_p2p->relay_notify_to_list(NOTIFY_NEW_FLUFFY_BLOCK::ID, fluffyBlob, fluffyConnections);
|
||||||
|
m_p2p->relay_notify_to_list(NOTIFY_NEW_BLOCK::ID, fullBlob, fullConnections);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -172,6 +172,7 @@ namespace nodetool
|
||||||
virtual void on_connection_close(p2p_connection_context& context);
|
virtual void on_connection_close(p2p_connection_context& context);
|
||||||
virtual void callback(p2p_connection_context& context);
|
virtual void callback(p2p_connection_context& context);
|
||||||
//----------------- i_p2p_endpoint -------------------------------------------------------------
|
//----------------- i_p2p_endpoint -------------------------------------------------------------
|
||||||
|
virtual bool relay_notify_to_list(int command, const std::string& data_buff, const std::list<boost::uuids::uuid> &connections);
|
||||||
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context);
|
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context);
|
||||||
virtual bool invoke_command_to_peer(int command, const std::string& req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context);
|
virtual bool invoke_command_to_peer(int command, const std::string& req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context);
|
||||||
virtual bool invoke_notify_to_peer(int command, const std::string& req_buff, const epee::net_utils::connection_context_base& context);
|
virtual bool invoke_notify_to_peer(int command, const std::string& req_buff, const epee::net_utils::connection_context_base& context);
|
||||||
|
|
|
@ -1242,6 +1242,16 @@ namespace nodetool
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------
|
||||||
template<class t_payload_net_handler>
|
template<class t_payload_net_handler>
|
||||||
|
bool node_server<t_payload_net_handler>::relay_notify_to_list(int command, const std::string& data_buff, const std::list<boost::uuids::uuid> &connections)
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(const auto& c_id, connections)
|
||||||
|
{
|
||||||
|
m_net_server.get_config_object().notify(command, data_buff, c_id);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
template<class t_payload_net_handler>
|
||||||
bool node_server<t_payload_net_handler>::relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)
|
bool node_server<t_payload_net_handler>::relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)
|
||||||
{
|
{
|
||||||
std::list<boost::uuids::uuid> connections;
|
std::list<boost::uuids::uuid> connections;
|
||||||
|
@ -1251,12 +1261,7 @@ namespace nodetool
|
||||||
connections.push_back(cntxt.m_connection_id);
|
connections.push_back(cntxt.m_connection_id);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
return relay_notify_to_list(command, data_buff, connections);
|
||||||
BOOST_FOREACH(const auto& c_id, connections)
|
|
||||||
{
|
|
||||||
m_net_server.get_config_object().notify(command, data_buff, c_id);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------
|
||||||
template<class t_payload_net_handler>
|
template<class t_payload_net_handler>
|
||||||
|
|
|
@ -43,6 +43,7 @@ namespace nodetool
|
||||||
template<class t_connection_context>
|
template<class t_connection_context>
|
||||||
struct i_p2p_endpoint
|
struct i_p2p_endpoint
|
||||||
{
|
{
|
||||||
|
virtual bool relay_notify_to_list(int command, const std::string& data_buff, const std::list<boost::uuids::uuid>& connections)=0;
|
||||||
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)=0;
|
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)=0;
|
||||||
virtual bool invoke_command_to_peer(int command, const std::string& req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context)=0;
|
virtual bool invoke_command_to_peer(int command, const std::string& req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context)=0;
|
||||||
virtual bool invoke_notify_to_peer(int command, const std::string& req_buff, const epee::net_utils::connection_context_base& context)=0;
|
virtual bool invoke_notify_to_peer(int command, const std::string& req_buff, const epee::net_utils::connection_context_base& context)=0;
|
||||||
|
@ -59,6 +60,10 @@ namespace nodetool
|
||||||
template<class t_connection_context>
|
template<class t_connection_context>
|
||||||
struct p2p_endpoint_stub: public i_p2p_endpoint<t_connection_context>
|
struct p2p_endpoint_stub: public i_p2p_endpoint<t_connection_context>
|
||||||
{
|
{
|
||||||
|
virtual bool relay_notify_to_list(int command, const std::string& data_buff, const std::list<boost::uuids::uuid>& connections)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)
|
virtual bool relay_notify_to_all(int command, const std::string& data_buff, const epee::net_utils::connection_context_base& context)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue