diff --git a/src/mongo/db/stats/counters.cpp b/src/mongo/db/stats/counters.cpp index 5b67e22..85ac08b 100644 --- a/src/mongo/db/stats/counters.cpp +++ b/src/mongo/db/stats/counters.cpp @@ -139,30 +139,24 @@ void NetworkCounter::hit(long long bytesIn, long long bytesOut) { const long long MAX = 1ULL << 60; // don't care about the race as its just a counter - bool overflow = _bytesIn > MAX || _bytesOut > MAX; + bool overflow = _bytesIn.loadRelaxed() > MAX || _bytesOut.loadRelaxed() > MAX; if (overflow) { - _lock.lock(); - _overflows++; - _bytesIn = bytesIn; - _bytesOut = bytesOut; - _requests = 1; - _lock.unlock(); + _overflows.fetchAndAdd(1); + _bytesIn.fetchAndAdd(bytesIn); + _bytesOut.fetchAndAdd(bytesOut); + _requests.store(1); } else { - _lock.lock(); - _bytesIn += bytesIn; - _bytesOut += bytesOut; - _requests++; - _lock.unlock(); + _bytesIn.fetchAndAdd(bytesIn); + _bytesOut.fetchAndAdd(bytesOut); + _requests.fetchAndAdd(1); } } void NetworkCounter::append(BSONObjBuilder& b) { - _lock.lock(); - b.appendNumber("bytesIn", _bytesIn); - b.appendNumber("bytesOut", _bytesOut); - b.appendNumber("numRequests", _requests); - _lock.unlock(); + b.append("bytesIn", (long long)_bytesIn.loadRelaxed()); + b.append("bytesOut", (long long)_bytesOut.loadRelaxed()); + b.append("numRequests", (long long)_requests.loadRelaxed()); } diff --git a/src/mongo/db/stats/counters.h b/src/mongo/db/stats/counters.h index 1821f7b..5aa568b 100644 --- a/src/mongo/db/stats/counters.h +++ b/src/mongo/db/stats/counters.h @@ -100,13 +100,11 @@ public: void append(BSONObjBuilder& b); private: - long long _bytesIn; - long long _bytesOut; - long long _requests; + AtomicUInt64 _bytesIn; + AtomicUInt64 _bytesOut; + AtomicUInt64 _requests; - long long _overflows; - - SpinLock _lock; + AtomicUInt64 _overflows; }; extern NetworkCounter networkCounter;