aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2016-12-04 22:22:07 +0200
committerRiccardo Spagni <ric@spagni.net>2016-12-04 22:22:07 +0200
commit98150be7d84493ce62fe9958751a7a0bb84144eb (patch)
treec48ebda6fdb17195bad0dd8eb7a0417c8a19fab9
parentMerge pull request #1385 (diff)
parentp2p: possibly fix crash in relay_blocks (diff)
downloadmonero-98150be7d84493ce62fe9958751a7a0bb84144eb.tar.xz
Merge pull request #1389
4adde042 p2p: possibly fix crash in relay_blocks (moneromooo-monero)
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler.inl37
-rw-r--r--src/p2p/net_node.h1
-rw-r--r--src/p2p/net_node.inl17
-rw-r--r--src/p2p/net_node_common.h5
4 files changed, 43 insertions, 17 deletions
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index 65377f990..35266fc7c 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -1092,21 +1092,36 @@ namespace cryptonote
std::list<blobdata> fluffy_txs;
fluffy_arg.b = arg.b;
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)
- {
- LOG_PRINT_YELLOW("PEER SUPPORTS FLUFFY BLOCKS - RELAYING THIN/COMPACT WHATEVER BLOCK", LOG_LEVEL_1);
- return post_notify<NOTIFY_NEW_FLUFFY_BLOCK>(fluffy_arg, cntxt);
- }
- else
+ if (peer_id && exclude_context.m_connection_id != context.m_connection_id)
{
- LOG_PRINT_YELLOW("PEER DOESN'T SUPPORT FLUFFY BLOCKS - RELAYING FULL BLOCK", LOG_LEVEL_1);
- return post_notify<NOTIFY_NEW_BLOCK>(arg, cntxt);
+ if(m_core.get_testnet() && (support_flags & P2P_SUPPORT_FLAG_FLUFFY_BLOCKS))
+ {
+ LOG_PRINT_CCONTEXT_YELLOW("PEER SUPPORTS FLUFFY BLOCKS - RELAYING THIN/COMPACT WHATEVER BLOCK", LOG_LEVEL_1);
+ fluffyConnections.push_back(context.m_connection_id);
+ }
+ else
+ {
+ 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;
}
//------------------------------------------------------------------------------------------------------------------------
diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h
index 619bad40f..cc6a486d3 100644
--- a/src/p2p/net_node.h
+++ b/src/p2p/net_node.h
@@ -172,6 +172,7 @@ namespace nodetool
virtual void on_connection_close(p2p_connection_context& context);
virtual void callback(p2p_connection_context& context);
//----------------- 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 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);
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index b5bfc2979..5efd6da13 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -1242,6 +1242,16 @@ namespace nodetool
}
//-----------------------------------------------------------------------------------
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)
{
std::list<boost::uuids::uuid> connections;
@@ -1251,12 +1261,7 @@ namespace nodetool
connections.push_back(cntxt.m_connection_id);
return true;
});
-
- BOOST_FOREACH(const auto& c_id, connections)
- {
- m_net_server.get_config_object().notify(command, data_buff, c_id);
- }
- return true;
+ return relay_notify_to_list(command, data_buff, connections);
}
//-----------------------------------------------------------------------------------
template<class t_payload_net_handler>
diff --git a/src/p2p/net_node_common.h b/src/p2p/net_node_common.h
index 846c07779..69bee890c 100644
--- a/src/p2p/net_node_common.h
+++ b/src/p2p/net_node_common.h
@@ -43,6 +43,7 @@ namespace nodetool
template<class t_connection_context>
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 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;
@@ -59,6 +60,10 @@ namespace nodetool
template<class 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)
{
return false;