Fix duplicate paths and reduce thrashing issues.

This commit is contained in:
Adam Ierymenko 2021-02-02 16:11:13 -05:00
parent b2b3271a96
commit 72d48da210
No known key found for this signature in database
GPG Key ID: C8877CF2D7A5D7F3
2 changed files with 30 additions and 8 deletions

View File

@ -128,12 +128,15 @@ void Peer::received(
long replacePathQuality = 0;
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
if (_paths[i].p) {
const long q = _paths[i].p->quality(now);
if (q > replacePathQuality) {
replacePathQuality = q;
if ( (!_paths[i].p->alive(now)) || _paths[i].p->address().ipsEqual(path->address()) ) {
replacePath = i;
if ( (!_paths[i].p->alive(now)) || _paths[i].p->address().ipsEqual(path->address()) )
break;
break;
} else {
const long q = _paths[i].p->quality(now);
if (q > replacePathQuality) {
replacePathQuality = q;
replacePath = i;
}
}
} else {
replacePath = i;
@ -147,10 +150,26 @@ void Peer::received(
_paths[replacePath].p = path;
_paths[replacePath].priority = 1;
}
{
Mutex::Lock ltl(_lastTriedPath_m);
uint64_t *k = (uint64_t *)0;
int64_t *v = (int64_t *)0;
Hashtable< uint64_t,int64_t >::Iterator i(_lastTriedPath);
while (i.next(k, v)) {
if ((now - *v) >= 2000)
_lastTriedPath.erase(*k);
}
}
} else {
attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true);
path->sent(now);
RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb);
Mutex::Lock ltl(_lastTriedPath_m);
int64_t &lt = _lastTriedPath[(uint64_t)path.ptr()];
if ((now - lt) >= 2000) {
lt = now;
attemptToContactAt(tPtr,path->localSocket(),path->address(),now,true);
path->sent(now);
RR->t->peerConfirmingUnknownPath(tPtr,networkId,*this,path,packetId,verb);
}
}
/*

View File

@ -573,6 +573,9 @@ private:
uint16_t _vMinor;
uint16_t _vRevision;
Hashtable< uint64_t, int64_t > _lastTriedPath;
Mutex _lastTriedPath_m;
_PeerPath _paths[ZT_MAX_PEER_NETWORK_PATHS];
Mutex _paths_m;