Browse Source

Still want to send WANT_PEER under two failure modes.

Adam Ierymenko 8 years ago
parent
commit
e778d45128
2 changed files with 37 additions and 38 deletions
  1. 23 25
      node/Cluster.cpp
  2. 14 13
      node/Switch.cpp

+ 23 - 25
node/Cluster.cpp

@@ -536,37 +536,35 @@ int Cluster::prepSendViaCluster(const Address &toPeerAddress,void *peerSecret)
 		}
 		}
 	}
 	}
 
 
-	if (mostRecentMemberId >= 0) {
-		const uint64_t ageOfMostRecentHavePeerAnnouncement = now - mostRecentTs;
-		if (ageOfMostRecentHavePeerAnnouncement >= (ZT_PEER_ACTIVITY_TIMEOUT / 3)) {
-			if (ageOfMostRecentHavePeerAnnouncement >= ZT_PEER_ACTIVITY_TIMEOUT)
-				return -1;
+	const uint64_t ageOfMostRecentHavePeerAnnouncement = now - mostRecentTs;
+	if (ageOfMostRecentHavePeerAnnouncement >= (ZT_PEER_ACTIVITY_TIMEOUT / 3)) {
+		if (ageOfMostRecentHavePeerAnnouncement >= ZT_PEER_ACTIVITY_TIMEOUT)
+			mostRecentMemberId = -1;
 
 
-			bool sendWantPeer = true;
-			{
-				Mutex::Lock _l(_remotePeers_m);
-				_RemotePeer &rp = _remotePeers[std::pair<Address,unsigned int>(toPeerAddress,(unsigned int)_id)];
-				if ((now - rp.lastSentWantPeer) >= ZT_CLUSTER_WANT_PEER_EVERY) {
-					rp.lastSentWantPeer = now;
-				} else {
-					sendWantPeer = false; // don't flood WANT_PEER
-				}
+		bool sendWantPeer = true;
+		{
+			Mutex::Lock _l(_remotePeers_m);
+			_RemotePeer &rp = _remotePeers[std::pair<Address,unsigned int>(toPeerAddress,(unsigned int)_id)];
+			if ((now - rp.lastSentWantPeer) >= ZT_CLUSTER_WANT_PEER_EVERY) {
+				rp.lastSentWantPeer = now;
+			} else {
+				sendWantPeer = false; // don't flood WANT_PEER
 			}
 			}
-			if (sendWantPeer) {
-				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 _l2(_members[*mid].lock);
-						_send(*mid,CLUSTER_MESSAGE_WANT_PEER,tmp,ZT_ADDRESS_LENGTH);
-					}
+		}
+		if (sendWantPeer) {
+			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 _l2(_members[*mid].lock);
+					_send(*mid,CLUSTER_MESSAGE_WANT_PEER,tmp,ZT_ADDRESS_LENGTH);
 				}
 				}
 			}
 			}
 		}
 		}
+	}
 
 
-		return mostRecentMemberId;
-	} else return -1;
+	return mostRecentMemberId;
 }
 }
 
 
 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)

+ 14 - 13
node/Switch.cpp

@@ -729,24 +729,25 @@ bool Switch::_trySend(Packet &packet,bool encrypt)
 #endif
 #endif
 		}
 		}
 	} else {
 	} else {
-		requestWhois(destination);
-#ifndef ZT_ENABLE_CLUSTER
-		return false; // if we are not in cluster mode, there is no way we can send without knowing the peer directly
+#ifdef ZT_ENABLE_CLUSTER
+		if (RR->cluster)
+			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)) {
-		TRACE("BUG: both viaPath and clusterMostRecentMemberId ended up invalid in Switch::_trySend()!");
-		abort();
-	}
+	if ((!viaPath)&&(clusterMostRecentMemberId < 0))
+		return false;
 #else
 #else
-	if (!viaPath) {
-		TRACE("BUG: viaPath ended up NULL in Switch::_trySend()!");
-		abort();
-	}
-#endif
+	if (!viaPath)
+		return false;
 #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);