From cc6de583bed73184fed5b5af18bedc6e21cc25e7 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 20 Oct 2021 10:48:07 -0700 Subject: [PATCH] Prevent balance-xor from de-allocating from bad paths --- node/Bond.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/node/Bond.cpp b/node/Bond.cpp index cf4b4eabd..f294eb431 100644 --- a/node/Bond.cpp +++ b/node/Bond.cpp @@ -1155,16 +1155,6 @@ void Bond::estimatePathQuality(int64_t now) void Bond::processBalanceTasks(int64_t now) { char pathStr[64] = { 0 }; - int totalAllocation = 0; - for (int i = 0; i < ZT_MAX_PEER_NETWORK_PATHS; ++i) { - if (! _paths[i].p) { - continue; - } - if (_paths[i].p && _paths[i].bonded && _paths[i].eligible) { - totalAllocation += _paths[i].allocation; - } - } - unsigned char minimumAllocationValue = (uint8_t)(0.33 * ((float)totalAllocation / (float)_numBondedPaths)); if (_allowFlowHashing) { /** @@ -1209,7 +1199,18 @@ void Bond::processBalanceTasks(int64_t now) * Re-allocate flows from under-performing * NOTE: This could be part of the above block but was kept separate for clarity. */ - if (_policy == ZT_BOND_POLICY_BALANCE_XOR || _policy == ZT_BOND_POLICY_BALANCE_AWARE) { + if (_policy == ZT_BOND_POLICY_BALANCE_AWARE) { + int totalAllocation = 0; + for (int i = 0; i < ZT_MAX_PEER_NETWORK_PATHS; ++i) { + if (! _paths[i].p) { + continue; + } + if (_paths[i].p && _paths[i].bonded && _paths[i].eligible) { + totalAllocation += _paths[i].allocation; + } + } + unsigned char minimumAllocationValue = (uint8_t)(0.33 * ((float)totalAllocation / (float)_numBondedPaths)); + Mutex::Lock _l(_flows_m); for (int i = 0; i < ZT_MAX_PEER_NETWORK_PATHS; ++i) { if (! _paths[i].p) { @@ -1754,7 +1755,7 @@ void Bond::dumpPathStatus(int64_t now, int pathIdx) { char pathStr[64] = { 0 }; _paths[pathIdx].p->address().toString(pathStr); - log("path status: [%2d] alive:%d, eli:%d, bonded:%d, flows:%6d, lat:%10.3f, jitter:%10.3f, error:%6.4f, loss:%6.4f, age:%6d --- (%s/%s)", + log("path status: [%2d] alive:%d, eli:%d, bonded:%d, flows:%6d, lat:%10.3f, jitter:%10.3f, error:%6.4f, loss:%6.4f, age:%6d alloc:%d--- (%s/%s)", pathIdx, _paths[pathIdx].alive, _paths[pathIdx].eligible, @@ -1765,6 +1766,7 @@ void Bond::dumpPathStatus(int64_t now, int pathIdx) _paths[pathIdx].packetErrorRatio, _paths[pathIdx].packetLossRatio, _paths[pathIdx].p->age(now), + _paths[pathIdx].allocation, getLink(_paths[pathIdx].p)->ifname().c_str(), pathStr); }