mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-21 13:57:49 +00:00
Change the way TCP failover is invoked.
This commit is contained in:
parent
04169b5150
commit
e6b23059ac
@ -87,19 +87,6 @@ public:
|
|||||||
return ((_addr)&&((_fixed)||((now - _lastReceived) < ZT_PEER_PATH_ACTIVITY_TIMEOUT)));
|
return ((_addr)&&((_fixed)||((now - _lastReceived) < ZT_PEER_PATH_ACTIVITY_TIMEOUT)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return True if it appears that a ping has gone unanswered
|
|
||||||
*/
|
|
||||||
inline bool pingUnanswered(uint64_t now) const
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
uint64_t lp = _lastPing;
|
|
||||||
uint64_t lr = _lastReceived;
|
|
||||||
if (lp)
|
|
||||||
return ((lr < lp)&&((lp - lr) > ZT_PING_UNANSWERED_AFTER));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Human-readable address and other information about this path, some computed as of current time
|
* @return Human-readable address and other information about this path, some computed as of current time
|
||||||
*/
|
*/
|
||||||
|
@ -150,18 +150,24 @@ bool Peer::sendPing(const RuntimeEnvironment *_r,uint64_t now,bool firstSinceRes
|
|||||||
{
|
{
|
||||||
bool sent = false;
|
bool sent = false;
|
||||||
SharedPtr<Peer> self(this);
|
SharedPtr<Peer> self(this);
|
||||||
|
|
||||||
Mutex::Lock _l(_lock);
|
Mutex::Lock _l(_lock);
|
||||||
|
|
||||||
|
// NOTE: this will never ping a peer that has *only* TCP paths. Right
|
||||||
|
// now there's never such a thing as TCP is only for failover.
|
||||||
|
|
||||||
bool pingTcp;
|
bool pingTcp;
|
||||||
if (!firstSinceReset) {
|
if (!firstSinceReset) {
|
||||||
// Do not use TCP if one of our UDP endpoints has answered recently.
|
// Do not use TCP if one of our UDP endpoints has answered recently.
|
||||||
pingTcp = true;
|
uint64_t lastPing = 0;
|
||||||
|
uint64_t lastDirectReceive = 0;
|
||||||
|
|
||||||
for(std::vector<Path>::iterator p(_paths.begin());p!=_paths.end();++p) {
|
for(std::vector<Path>::iterator p(_paths.begin());p!=_paths.end();++p) {
|
||||||
if (!p->pingUnanswered(now)) {
|
lastPing = std::max(lastPing,p->lastPing());
|
||||||
pingTcp = false;
|
lastDirectReceive = std::max(lastDirectReceive,p->lastReceived());
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pingTcp = ( (lastDirectReceive < lastPing) && ((lastPing - lastDirectReceive) >= ZT_PING_UNANSWERED_AFTER) );
|
||||||
} else pingTcp = false;
|
} else pingTcp = false;
|
||||||
|
|
||||||
TRACE("PING %s (pingTcp==%d)",_id.address().toString().c_str(),(int)pingTcp);
|
TRACE("PING %s (pingTcp==%d)",_id.address().toString().c_str(),(int)pingTcp);
|
||||||
|
Loading…
Reference in New Issue
Block a user