From f8005b88adfe93af477528bec748882da8fa9bea Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 13 Jun 2018 14:50:37 -0700 Subject: [PATCH] Minor cleanup. More efficient push() operation for RingBuffer --- node/Path.hpp | 7 ------- node/Peer.hpp | 4 ++-- node/RingBuffer.hpp | 9 +++++++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/node/Path.hpp b/node/Path.hpp index e04263237..30655877c 100644 --- a/node/Path.hpp +++ b/node/Path.hpp @@ -161,11 +161,9 @@ public: { delete _throughputSamples; delete _latencySamples; - delete _qualitySamples; delete _packetValiditySamples; _throughputSamples = NULL; _latencySamples = NULL; - _qualitySamples = NULL; _packetValiditySamples = NULL; } @@ -580,7 +578,6 @@ public: * @param now Current time */ inline void processBackgroundPathMeasurements(int64_t now, const int64_t peerId) { - // Compute path stability if (now - _lastPathQualityComputeTime > ZT_PATH_QUALITY_COMPUTE_INTERVAL) { Mutex::Lock _l(_statistics_m); _lastPathQualityComputeTime = now; @@ -606,8 +603,6 @@ public: // Compute the quality product _lastComputedStability = pdv_contrib + latency_contrib + throughput_disturbance_contrib; _lastComputedStability *= 1 - _packetErrorRatio; - _qualitySamples->push(_lastComputedStability); - // Prevent QoS records from sticking around for too long std::map::iterator it = _outQoSRecords.begin(); while (it != _outQoSRecords.end()) { @@ -650,7 +645,6 @@ public: inline void prepareBuffers() { _throughputSamples = new RingBuffer(ZT_PATH_QUALITY_METRIC_WIN_SZ); _latencySamples = new RingBuffer(ZT_PATH_QUALITY_METRIC_WIN_SZ); - _qualitySamples = new RingBuffer(ZT_PATH_QUALITY_METRIC_WIN_SZ); _packetValiditySamples = new RingBuffer(ZT_PATH_QUALITY_METRIC_WIN_SZ); memset(_ifname, 0, 16); memset(_addrString, 0, sizeof(_addrString)); @@ -704,7 +698,6 @@ private: RingBuffer *_throughputSamples; RingBuffer *_latencySamples; - RingBuffer *_qualitySamples; RingBuffer *_packetValiditySamples; }; diff --git a/node/Peer.hpp b/node/Peer.hpp index 21e8cbf26..9361f6654 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -678,8 +678,8 @@ private: bool _linkIsRedundant; bool _remotePeerMultipathEnabled; - uint64_t _lastAggregateStatsReport; - uint64_t _lastAggregateAllocation; + int64_t _lastAggregateStatsReport; + int64_t _lastAggregateAllocation; char _interfaceListStr[256]; // 16 characters * 16 paths in a link }; diff --git a/node/RingBuffer.hpp b/node/RingBuffer.hpp index 32ae037ca..e8d0d238b 100644 --- a/node/RingBuffer.hpp +++ b/node/RingBuffer.hpp @@ -37,7 +37,7 @@ namespace ZeroTier { /** - * A revolving (ring) buffer. + * A circular buffer * * For fast handling of continuously-evolving variables (such as path quality metrics). * Using this, we can maintain longer sliding historical windows for important path @@ -169,7 +169,12 @@ public: if (count() == size) { consume(1); } - write(&value, 1); + const size_t first_chunk = std::min((size_t)1, size - end); + *(buf + end) = value; + end = (end + first_chunk) % size; + if (begin == end) { + wrap = true; + } } /**