Still want to send WANT_PEER under two failure modes.

This commit is contained in:
Adam Ierymenko 2017-02-01 12:51:52 -08:00
parent 5e11cf6378
commit e778d45128
2 changed files with 37 additions and 38 deletions

View file

@ -536,37 +536,35 @@ int Cluster::prepSendViaCluster(const Address &toPeerAddress,void *peerSecret)
} }
} }
if (mostRecentMemberId >= 0) { const uint64_t ageOfMostRecentHavePeerAnnouncement = now - mostRecentTs;
const uint64_t ageOfMostRecentHavePeerAnnouncement = now - mostRecentTs; if (ageOfMostRecentHavePeerAnnouncement >= (ZT_PEER_ACTIVITY_TIMEOUT / 3)) {
if (ageOfMostRecentHavePeerAnnouncement >= (ZT_PEER_ACTIVITY_TIMEOUT / 3)) { if (ageOfMostRecentHavePeerAnnouncement >= ZT_PEER_ACTIVITY_TIMEOUT)
if (ageOfMostRecentHavePeerAnnouncement >= ZT_PEER_ACTIVITY_TIMEOUT) mostRecentMemberId = -1;
return -1;
bool sendWantPeer = true; bool sendWantPeer = true;
{ {
Mutex::Lock _l(_remotePeers_m); Mutex::Lock _l(_remotePeers_m);
_RemotePeer &rp = _remotePeers[std::pair<Address,unsigned int>(toPeerAddress,(unsigned int)_id)]; _RemotePeer &rp = _remotePeers[std::pair<Address,unsigned int>(toPeerAddress,(unsigned int)_id)];
if ((now - rp.lastSentWantPeer) >= ZT_CLUSTER_WANT_PEER_EVERY) { if ((now - rp.lastSentWantPeer) >= ZT_CLUSTER_WANT_PEER_EVERY) {
rp.lastSentWantPeer = now; rp.lastSentWantPeer = now;
} else { } else {
sendWantPeer = false; // don't flood WANT_PEER sendWantPeer = false; // don't flood WANT_PEER
}
} }
if (sendWantPeer) { }
char tmp[ZT_ADDRESS_LENGTH]; if (sendWantPeer) {
toPeerAddress.copyTo(tmp,ZT_ADDRESS_LENGTH); char tmp[ZT_ADDRESS_LENGTH];
{ toPeerAddress.copyTo(tmp,ZT_ADDRESS_LENGTH);
Mutex::Lock _l(_memberIds_m); {
for(std::vector<uint16_t>::const_iterator mid(_memberIds.begin());mid!=_memberIds.end();++mid) { Mutex::Lock _l(_memberIds_m);
Mutex::Lock _l2(_members[*mid].lock); for(std::vector<uint16_t>::const_iterator mid(_memberIds.begin());mid!=_memberIds.end();++mid) {
_send(*mid,CLUSTER_MESSAGE_WANT_PEER,tmp,ZT_ADDRESS_LENGTH); Mutex::Lock _l2(_members[*mid].lock);
} _send(*mid,CLUSTER_MESSAGE_WANT_PEER,tmp,ZT_ADDRESS_LENGTH);
} }
} }
} }
}
return mostRecentMemberId; return mostRecentMemberId;
} else return -1;
} }
bool Cluster::sendViaCluster(int mostRecentMemberId,const Address &toPeerAddress,const void *data,unsigned int len) bool Cluster::sendViaCluster(int mostRecentMemberId,const Address &toPeerAddress,const void *data,unsigned int len)

View file

@ -729,24 +729,25 @@ bool Switch::_trySend(Packet &packet,bool encrypt)
#endif #endif
} }
} else { } else {
requestWhois(destination); #ifdef ZT_ENABLE_CLUSTER
#ifndef ZT_ENABLE_CLUSTER if (RR->cluster)
return false; // if we are not in cluster mode, there is no way we can send without knowing the peer directly clusterMostRecentMemberId = RR->cluster->prepSendViaCluster(destination,clusterPeerSecret);
if (clusterMostRecentMemberId < 0) {
#else
requestWhois(destination);
return false; // if we are not in cluster mode, there is no way we can send without knowing the peer directly
#endif
#ifdef ZT_ENABLE_CLUSTER
}
#endif #endif
} }
#ifdef ZT_TRACE
#ifdef ZT_ENABLE_CLUSTER #ifdef ZT_ENABLE_CLUSTER
if ((!viaPath)&&(clusterMostRecentMemberId < 0)) { if ((!viaPath)&&(clusterMostRecentMemberId < 0))
TRACE("BUG: both viaPath and clusterMostRecentMemberId ended up invalid in Switch::_trySend()!"); return false;
abort();
}
#else #else
if (!viaPath) { if (!viaPath)
TRACE("BUG: viaPath ended up NULL in Switch::_trySend()!"); return false;
abort();
}
#endif
#endif #endif
unsigned int chunkSize = std::min(packet.size(),(unsigned int)ZT_UDP_DEFAULT_PAYLOAD_MTU); unsigned int chunkSize = std::min(packet.size(),(unsigned int)ZT_UDP_DEFAULT_PAYLOAD_MTU);