Change the way TCP failover is invoked.

This commit is contained in:
Adam Ierymenko 2014-03-26 16:44:58 -07:00
parent 04169b5150
commit e6b23059ac
2 changed files with 11 additions and 18 deletions

View File

@ -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
*/ */

View File

@ -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);