Browse Source

Try prioritizing cluster-send over direct send in cluster mode -- may improve cluster relaying reliability.

Adam Ierymenko 9 years ago
parent
commit
9490b1f136
2 changed files with 23 additions and 22 deletions
  1. 23 21
      node/Switch.cpp
  2. 0 1
      node/Switch.hpp

+ 23 - 21
node/Switch.cpp

@@ -616,15 +616,15 @@ void Switch::_handleRemotePacketFragment(const InetAddress &localAddr,const Inet
 		if (fragment.hops() < ZT_RELAY_MAX_HOPS) {
 			fragment.incrementHops();
 
+#ifdef ZT_ENABLE_CLUSTER
+			if ((RR->cluster)&&(RR->cluster->sendViaCluster(Address(),destination,fragment.data(),fragment.size(),false)))
+				return;
+#endif
+
 			// Note: we don't bother initiating NAT-t for fragments, since heads will set that off.
 			// It wouldn't hurt anything, just redundant and unnecessary.
 			SharedPtr<Peer> relayTo = RR->topology->getPeer(destination);
 			if ((!relayTo)||(!relayTo->send(RR,fragment.data(),fragment.size(),RR->node->now()))) {
-#ifdef ZT_ENABLE_CLUSTER
-				if ((RR->cluster)&&(RR->cluster->sendViaCluster(Address(),destination,fragment.data(),fragment.size(),false)))
-					return; // sent by way of another member of this cluster
-#endif
-
 				// Don't know peer or no direct path -- so relay via root server
 				relayTo = RR->topology->getBestRoot();
 				if (relayTo)
@@ -702,16 +702,28 @@ void Switch::_handleRemotePacketHead(const InetAddress &localAddr,const InetAddr
 		if (packet->hops() < ZT_RELAY_MAX_HOPS) {
 			packet->incrementHops();
 
+#ifdef ZT_ENABLE_CLUSTER
+			if (RR->cluster) {
+				Mutex::Lock _l(_lastUniteAttempt_m);
+				uint64_t &luts = _lastUniteAttempt[_LastUniteKey(source,destination)];
+				const bool shouldUnite = ((now - luts) >= ZT_MIN_UNITE_INTERVAL);
+				if (RR->cluster->sendViaCluster(source,destination,packet->data(),packet->size(),shouldUnite)) {
+					if (shouldUnite)
+						luts = now;
+					return;
+				}
+			}
+#endif
+
 			SharedPtr<Peer> relayTo = RR->topology->getPeer(destination);
 			if ((relayTo)&&((relayTo->send(RR,packet->data(),packet->size(),now)))) {
-				if (_shouldTryUnite(now,source,destination))
+				Mutex::Lock _l(_lastUniteAttempt_m);
+				uint64_t &luts = _lastUniteAttempt[_LastUniteKey(source,destination)];
+				if ((now - luts) >= ZT_MIN_UNITE_INTERVAL) {
+					luts = now;
 					unite(source,destination);
+				}
 			} else {
-#ifdef ZT_ENABLE_CLUSTER
-				if ((RR->cluster)&&(RR->cluster->sendViaCluster(source,destination,packet->data(),packet->size(),_shouldTryUnite(now,source,destination))))
-					return; // sent by way of another member of this cluster
-#endif
-
 				relayTo = RR->topology->getBestRoot(&source,1,true);
 				if (relayTo)
 					relayTo->send(RR,packet->data(),packet->size(),now);
@@ -860,14 +872,4 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
 	return false;
 }
 
-bool Switch::_shouldTryUnite(const uint64_t now,const Address &p1,const Address &p2)
-{
-	Mutex::Lock _l(_lastUniteAttempt_m);
-	uint64_t &luts = _lastUniteAttempt[_LastUniteKey(p1,p2)];
-	if ((now - luts) < ZT_MIN_UNITE_INTERVAL)
-		return false;
-	luts = now;
-	return true;
-}
-
 } // namespace ZeroTier

+ 0 - 1
node/Switch.hpp

@@ -180,7 +180,6 @@ private:
 	void _handleRemotePacketHead(const InetAddress &localAddr,const InetAddress &fromAddr,const void *data,unsigned int len);
 	Address _sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted);
 	bool _trySend(const Packet &packet,bool encrypt,uint64_t nwid);
-	bool _shouldTryUnite(const uint64_t now,const Address &p1,const Address &p2);
 
 	const RuntimeEnvironment *const RR;
 	uint64_t _lastBeaconResponse;