summaryrefslogtreecommitdiff
path: root/node/Cluster.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-27 14:37:38 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-27 14:37:38 -0700
commit40976c02a42b8e9078519f92a7c7412b8464e9bc (patch)
tree3d158bfbe6b830c0b1076ef1b419d5fcb45f1ffb /node/Cluster.cpp
parentf692cec763d67caae54a4f47446657c390563319 (diff)
downloadinfinitytier-40976c02a42b8e9078519f92a7c7412b8464e9bc.tar.gz
infinitytier-40976c02a42b8e9078519f92a7c7412b8464e9bc.zip
Forget paths to peers if we are handing them off.
Diffstat (limited to 'node/Cluster.cpp')
-rw-r--r--node/Cluster.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/node/Cluster.cpp b/node/Cluster.cpp
index c18663bc..73ff5846 100644
--- a/node/Cluster.cpp
+++ b/node/Cluster.cpp
@@ -563,17 +563,14 @@ void Cluster::removeMember(uint16_t memberId)
_memberIds = newMemberIds;
}
-InetAddress Cluster::findBetterEndpoint(const Address &peerAddress,const InetAddress &peerPhysicalAddress,bool offload)
+bool Cluster::findBetterEndpoint(InetAddress &redirectTo,const Address &peerAddress,const InetAddress &peerPhysicalAddress,bool offload)
{
- if (!peerPhysicalAddress) // sanity check
- return InetAddress();
-
if (_addressToLocationFunction) {
// Pick based on location if it can be determined
int px = 0,py = 0,pz = 0;
if (_addressToLocationFunction(_addressToLocationFunctionArg,reinterpret_cast<const struct sockaddr_storage *>(&peerPhysicalAddress),&px,&py,&pz) == 0) {
TRACE("no geolocation data for %s (geo-lookup is lazy/async so it may work next time)",peerPhysicalAddress.toIpString().c_str());
- return InetAddress();
+ return false;
}
// Find member closest to this peer
@@ -603,14 +600,15 @@ InetAddress Cluster::findBetterEndpoint(const Address &peerAddress,const InetAdd
for(std::vector<InetAddress>::const_iterator a(best.begin());a!=best.end();++a) {
if (a->ss_family == peerPhysicalAddress.ss_family) {
TRACE("%s at [%d,%d,%d] is %f from us but %f from %u, can redirect to %s",peerAddress.toString().c_str(),px,py,pz,currentDistance,bestDistance,bestMember,a->toString().c_str());
- return *a;
+ redirectTo = *a;
+ return true;
}
}
TRACE("%s at [%d,%d,%d] is %f from us, no better endpoints found",peerAddress.toString().c_str(),px,py,pz,currentDistance);
- return InetAddress();
+ return false;
} else {
// TODO: pick based on load if no location info?
- return InetAddress();
+ return false;
}
}