mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-06 20:43:44 +02:00
Adjusted locking order of _paths_m for path pruning. Other minor multipath changes
This commit is contained in:
parent
1debe2292d
commit
91c8e82c42
4 changed files with 42 additions and 16 deletions
|
@ -293,7 +293,7 @@
|
||||||
/**
|
/**
|
||||||
* Number of samples to consider when computing path statistics
|
* Number of samples to consider when computing path statistics
|
||||||
*/
|
*/
|
||||||
#define ZT_PATH_QUALITY_METRIC_WIN_SZ 128
|
#define ZT_PATH_QUALITY_METRIC_WIN_SZ 64
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How often important path metrics are sampled (in ms). These metrics are later used
|
* How often important path metrics are sampled (in ms). These metrics are later used
|
||||||
|
@ -311,7 +311,7 @@
|
||||||
* since we will record a 0 bit/s measurement if no valid latency measurement was made within this
|
* since we will record a 0 bit/s measurement if no valid latency measurement was made within this
|
||||||
* window of time.
|
* window of time.
|
||||||
*/
|
*/
|
||||||
#define ZT_PATH_LATENCY_SAMPLE_INTERVAL ZT_PING_CHECK_INVERVAL * 2
|
#define ZT_PATH_LATENCY_SAMPLE_INTERVAL ZT_MULTIPATH_PEER_PING_PERIOD * 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interval used for rate-limiting the computation of path quality estimates. Set at 0
|
* Interval used for rate-limiting the computation of path quality estimates. Set at 0
|
||||||
|
@ -374,6 +374,13 @@
|
||||||
*/
|
*/
|
||||||
#define ZT_PEER_PING_PERIOD 60000
|
#define ZT_PEER_PING_PERIOD 60000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delay between full-fledge pings of directly connected peers.
|
||||||
|
* With multipath bonding enabled ping peers more often to measure
|
||||||
|
* packet loss and latency.
|
||||||
|
*/
|
||||||
|
#define ZT_MULTIPATH_PEER_PING_PERIOD 5000
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paths are considered expired if they have not sent us a real packet in this long
|
* Paths are considered expired if they have not sent us a real packet in this long
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -432,6 +432,22 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param buf Buffer to store resultant string
|
||||||
|
* @return Description of path, in ASCII string format
|
||||||
|
*/
|
||||||
|
inline char *toString(char *buf) {
|
||||||
|
sprintf(buf,"%6s, q=%8.3f, %5.3f Mb/s, j=%8.2f, ml=%8.2f, meanAge=%8.2f, addr=%45s",
|
||||||
|
getName(),
|
||||||
|
lastComputedQuality(),
|
||||||
|
(float)meanThroughput() / (float)1000000,
|
||||||
|
jitter(),
|
||||||
|
meanLatency(),
|
||||||
|
meanAge(),
|
||||||
|
getAddressString());
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Record whether a packet is considered invalid by MAC/compression/cipher checks. This
|
* Record whether a packet is considered invalid by MAC/compression/cipher checks. This
|
||||||
* could be an indication of a bit error. This function will keep a running counter of
|
* could be an indication of a bit error. This function will keep a running counter of
|
||||||
|
|
|
@ -100,14 +100,17 @@ void Peer::received(
|
||||||
path->trustedPacketReceived(now);
|
path->trustedPacketReceived(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RR->node->getMultipathMode() != ZT_MULTIPATH_NONE) {
|
{
|
||||||
if ((now - _lastPathPrune) > ZT_CLOSED_PATH_PRUNING_INTERVAL) {
|
Mutex::Lock _l(_paths_m);
|
||||||
_lastPathPrune = now;
|
if (RR->node->getMultipathMode() != ZT_MULTIPATH_NONE) {
|
||||||
prunePaths();
|
if ((now - _lastPathPrune) > ZT_CLOSED_PATH_PRUNING_INTERVAL) {
|
||||||
}
|
_lastPathPrune = now;
|
||||||
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
|
prunePaths();
|
||||||
if (_paths[i].p) {
|
}
|
||||||
_paths[i].p->measureLink(now);
|
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
|
||||||
|
if (_paths[i].p) {
|
||||||
|
_paths[i].p->measureLink(now);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -386,9 +389,9 @@ SharedPtr<Path> Peer::getAppropriatePath(int64_t now, bool includeExpired)
|
||||||
if (bestPath == ZT_MAX_PEER_NETWORK_PATHS || (numAlivePaths == 0 && numStalePaths == 0)) {
|
if (bestPath == ZT_MAX_PEER_NETWORK_PATHS || (numAlivePaths == 0 && numStalePaths == 0)) {
|
||||||
return SharedPtr<Path>();
|
return SharedPtr<Path>();
|
||||||
} if (numAlivePaths == 1) {
|
} if (numAlivePaths == 1) {
|
||||||
return _paths[bestPath].p;
|
//return _paths[bestPath].p;
|
||||||
} if (numStalePaths == 1) {
|
} if (numStalePaths == 1) {
|
||||||
return _paths[bestPath].p;
|
//return _paths[bestPath].p;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Relative quality
|
// Relative quality
|
||||||
|
@ -725,7 +728,6 @@ unsigned int Peer::doPingAndKeepalive(void *tPtr,int64_t now)
|
||||||
|
|
||||||
unsigned int Peer::prunePaths()
|
unsigned int Peer::prunePaths()
|
||||||
{
|
{
|
||||||
Mutex::Lock _l(_paths_m);
|
|
||||||
unsigned int pruned = 0;
|
unsigned int pruned = 0;
|
||||||
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
|
for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
|
||||||
if (_paths[i].p) {
|
if (_paths[i].p) {
|
||||||
|
|
|
@ -162,6 +162,7 @@ namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
||||||
|
|
||||||
// How often to check for local interface addresses
|
// How often to check for local interface addresses
|
||||||
#define ZT_LOCAL_INTERFACE_CHECK_INTERVAL 60000
|
#define ZT_LOCAL_INTERFACE_CHECK_INTERVAL 60000
|
||||||
|
#define ZT_MULTIPATH_LOCAL_INTERFACE_CHECK_INTERVAL 5000
|
||||||
|
|
||||||
// Maximum write buffer size for outgoing TCP connections (sanity limit)
|
// Maximum write buffer size for outgoing TCP connections (sanity limit)
|
||||||
#define ZT_TCP_MAX_WRITEQ_SIZE 33554432
|
#define ZT_TCP_MAX_WRITEQ_SIZE 33554432
|
||||||
|
@ -856,6 +857,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh bindings
|
// Refresh bindings
|
||||||
|
// Do this more frequently when multipath bonding is enabled
|
||||||
int interfaceRefreshPeriod = _multipathMode ? ZT_MULTIPATH_BINDER_REFRESH_PERIOD : ZT_BINDER_REFRESH_PERIOD;
|
int interfaceRefreshPeriod = _multipathMode ? ZT_MULTIPATH_BINDER_REFRESH_PERIOD : ZT_BINDER_REFRESH_PERIOD;
|
||||||
if (((now - lastBindRefresh) >= interfaceRefreshPeriod)||(restarted)) {
|
if (((now - lastBindRefresh) >= interfaceRefreshPeriod)||(restarted)) {
|
||||||
lastBindRefresh = now;
|
lastBindRefresh = now;
|
||||||
|
@ -889,9 +891,7 @@ public:
|
||||||
uint64_t pktBuf[ZT_LINK_TEST_DATAGRAM_SZ / sizeof(uint64_t)];
|
uint64_t pktBuf[ZT_LINK_TEST_DATAGRAM_SZ / sizeof(uint64_t)];
|
||||||
Utils::getSecureRandom(pktBuf, ZT_LINK_TEST_DATAGRAM_SZ);
|
Utils::getSecureRandom(pktBuf, ZT_LINK_TEST_DATAGRAM_SZ);
|
||||||
ZT_PeerList *pl = _node->peers();
|
ZT_PeerList *pl = _node->peers();
|
||||||
// get bindings (specifically just the sockets)
|
|
||||||
std::vector<PhySocket*> sockets = _binder.getBoundSockets();
|
std::vector<PhySocket*> sockets = _binder.getBoundSockets();
|
||||||
// interfaces
|
|
||||||
for (int i=0; i<ZT_BINDER_MAX_BINDINGS; i++) {
|
for (int i=0; i<ZT_BINDER_MAX_BINDINGS; i++) {
|
||||||
for(size_t j=0;j<pl->peerCount;++j) {
|
for(size_t j=0;j<pl->peerCount;++j) {
|
||||||
for (int k=0; k<(ZT_MAX_PEER_NETWORK_PATHS/4); k++) {
|
for (int k=0; k<(ZT_MAX_PEER_NETWORK_PATHS/4); k++) {
|
||||||
|
@ -936,7 +936,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync information about physical network interfaces
|
// Sync information about physical network interfaces
|
||||||
if ((now - lastLocalInterfaceAddressCheck) >= ZT_LOCAL_INTERFACE_CHECK_INTERVAL) {
|
int interfaceAddressCheckInterval = _multipathMode ? ZT_MULTIPATH_LOCAL_INTERFACE_CHECK_INTERVAL : ZT_LOCAL_INTERFACE_CHECK_INTERVAL;
|
||||||
|
if ((now - lastLocalInterfaceAddressCheck) >= interfaceAddressCheckInterval) {
|
||||||
lastLocalInterfaceAddressCheck = now;
|
lastLocalInterfaceAddressCheck = now;
|
||||||
|
|
||||||
_node->clearLocalInterfaceAddresses();
|
_node->clearLocalInterfaceAddresses();
|
||||||
|
|
Loading…
Add table
Reference in a new issue