From f934b81703eedbc152f07a90a179847f9cc3caea Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Fri, 12 Jul 2013 16:40:59 -0400 Subject: Several bug fixes in newly refactored code. --- node/Topology.cpp | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'node/Topology.cpp') diff --git a/node/Topology.cpp b/node/Topology.cpp index 5fd9939d..de65de3b 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -25,6 +25,7 @@ * LLC. Start here: http://www.zerotier.com/ */ +#include #include "Topology.hpp" #include "NodeConfig.hpp" @@ -145,23 +146,32 @@ SharedPtr Topology::getPeer(const Address &zta) return SharedPtr(); } -SharedPtr Topology::getBestSupernode(const Address *avoid,unsigned int avoidCount) const +SharedPtr Topology::getBestSupernode(const Address *avoid,unsigned int avoidCount,bool strictAvoid) const { SharedPtr bestSupernode; - unsigned long bestSupernodeLatency = 0xffff; + unsigned int bestSupernodeLatency = 0xffff; uint64_t now = Utils::now(); Mutex::Lock _l(_supernodes_m); + if (_supernodePeers.empty()) + return bestSupernode; + for(std::vector< SharedPtr >::const_iterator sn=_supernodePeers.begin();sn!=_supernodePeers.end();) { for(unsigned int i=0;iaddress()) goto skip_and_try_next_supernode; } - if ((*sn)->hasActiveDirectPath(now)) { // only consider those that responded to pings + if ((*sn)->hasActiveDirectPath(now)) { unsigned int l = (*sn)->latency(); - if ((l)&&(l <= bestSupernodeLatency)) { - bestSupernodeLatency = l; + if (bestSupernode) { + if ((l)&&(l < bestSupernodeLatency)) { + bestSupernodeLatency = l; + bestSupernode = *sn; + } + } else { + if (l) + bestSupernodeLatency = l; bestSupernode = *sn; } } @@ -169,14 +179,20 @@ skip_and_try_next_supernode: ++sn; } - if (bestSupernode) + if ((bestSupernode)||(strictAvoid)) return bestSupernode; for(std::vector< SharedPtr >::const_iterator sn=_supernodePeers.begin();sn!=_supernodePeers.end();++sn) { - if ((*sn)->hasActiveDirectPath(now)) { // only consider those that responded to pings + if ((*sn)->hasActiveDirectPath(now)) { unsigned int l = (*sn)->latency(); - if ((l)&&(l <= bestSupernodeLatency)) { - bestSupernodeLatency = l; + if (bestSupernode) { + if ((l)&&(l < bestSupernodeLatency)) { + bestSupernodeLatency = l; + bestSupernode = *sn; + } + } else { + if (l) + bestSupernodeLatency = l; bestSupernode = *sn; } } @@ -185,16 +201,7 @@ skip_and_try_next_supernode: if (bestSupernode) return bestSupernode; - uint64_t bestSupernodeLastDirectReceive = 0; - for(std::vector< SharedPtr >::const_iterator sn=_supernodePeers.begin();sn!=_supernodePeers.end();++sn) { - uint64_t l = (*sn)->lastDirectReceive(); - if (l > bestSupernodeLastDirectReceive) { - bestSupernodeLastDirectReceive = l; - bestSupernode = *sn; - } - } - - return bestSupernode; + return _supernodePeers[Utils::randomInt() % _supernodePeers.size()]; } void Topology::clean() -- cgit v1.2.3