Ping supernodes on surface change, and also reset TCP flag.

This commit is contained in:
Adam Ierymenko 2015-02-02 17:02:23 -08:00
parent b7148c107d
commit eeed31b396
3 changed files with 16 additions and 8 deletions

View File

@ -468,12 +468,7 @@ Node::ReasonForTermination Node::run()
}
if (resynchronize) {
/* Send NOP to all peers on resynchronize, directly to supernodes and
* indirectly to regular nodes (to trigger RENDEZVOUS). Also clear
* learned paths since they're likely no longer valid, and close
* TCP sockets since they're also likely invalid. */
RR->sm->closeTcpSockets();
RR->topology->eachPeer(Topology::ResetActivePeers(RR,now));
} else {
/* Periodically check for changes in our local multicast subscriptions
* and broadcast those changes to directly connected peers. */

View File

@ -258,7 +258,7 @@ void Topology::clean(uint64_t now)
}
}
bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress)
bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress,uint64_t now)
{
Mutex::Lock _l(_lock);
@ -266,10 +266,20 @@ bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress
return false;
if (_surface.update(mirroredAddress)) {
// Clear non-fixed paths for all peers
// Clear non-fixed paths for all peers -- will force reconnect on next activity
for(std::map< Address,SharedPtr<Peer> >::const_iterator ap(_activePeers.begin());ap!=_activePeers.end();++ap)
ap->second->clearPaths(false);
// Reset TCP tunneling if our global addressing has changed
if (!mirroredAddress.isLinkLocal())
(const_cast <RuntimeEnvironment *>(RR))->tcpTunnelingEnabled = false;
// Ping supernodes now (other than the one we might have just heard from)
for(std::vector< SharedPtr<Peer> >::const_iterator sn(_supernodePeers.begin());sn!=_supernodePeers.end();++sn) {
if (remotePeer != *sn)
(*sn)->sendPing(RR,now);
}
return true;
}

View File

@ -298,6 +298,7 @@ public:
/**
* Function object to forget direct links to active peers and then ping them indirectly
*/
/*
class ResetActivePeers
{
public:
@ -332,6 +333,7 @@ public:
std::vector<Address> _supernodeAddresses;
const RuntimeEnvironment *RR;
};
*/
/**
* Function object to collect peers with any known direct path
@ -364,8 +366,9 @@ public:
*
* @param remotePeer Remote peer address
* @param mirroredAddress Real-world network address the remote peer told us we have
* @param now Current time
*/
bool updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress);
bool updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress,uint64_t now);
/**
* Validate a root topology dictionary against the identities specified in Defaults