diff options
author | Billy Donahue <billy.donahue@mongodb.com> | 2018-11-06 16:20:39 -0500 |
---|---|---|
committer | Billy Donahue <billy.donahue@mongodb.com> | 2018-11-16 11:03:18 -0500 |
commit | 63e43f1bb47f7bddf3dc37ad03a2bbee6d2a9423 (patch) | |
tree | 80d0f30295208dd648b0edf3027fb508be291047 /src/mongo/db | |
parent | 1da5a8ac8ea43e1f704384238765fa5ca5b11af6 (diff) | |
download | mongo-63e43f1bb47f7bddf3dc37ad03a2bbee6d2a9423.tar.gz |
SERVER-5739 Fix races in RARELY/OCCASIONALLY.
Switch to using C++ instead of macros.
Fix SERVER-37247: these should fire on first hit.
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/cloner.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/repl/oplog_applier.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/repl/topology_coordinator.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/s/balancer/balancer.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/s/migration_destination_manager.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/s/set_shard_version_command.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/stats/counters.cpp | 54 | ||||
-rw-r--r-- | src/mongo/db/stats/counters.h | 34 |
8 files changed, 51 insertions, 68 deletions
diff --git a/src/mongo/db/cloner.cpp b/src/mongo/db/cloner.cpp index 2768cb0b578..fc62f8f59a5 100644 --- a/src/mongo/db/cloner.cpp +++ b/src/mongo/db/cloner.cpp @@ -271,7 +271,8 @@ struct Cloner::Fun { } }); - RARELY if (time(0) - saveLast > 60) { + static Rarely sampler; + if (sampler.tick() && (time(0) - saveLast > 60)) { log() << numSeen << " objects cloned so far from collection " << from_collection; saveLast = time(0); } diff --git a/src/mongo/db/repl/oplog_applier.cpp b/src/mongo/db/repl/oplog_applier.cpp index 596a4ca2782..9d25e212065 100644 --- a/src/mongo/db/repl/oplog_applier.cpp +++ b/src/mongo/db/repl/oplog_applier.cpp @@ -148,7 +148,8 @@ void OplogApplier::enqueue(OperationContext* opCtx, void OplogApplier::enqueue(OperationContext* opCtx, OplogBuffer::Batch::const_iterator begin, OplogBuffer::Batch::const_iterator end) { - OCCASIONALLY { + static Occasionally sampler; + if (sampler.tick()) { LOG(2) << "oplog buffer has " << _oplogBuffer->getSize() << " bytes"; } _oplogBuffer->pushAllNonBlocking(opCtx, begin, end); diff --git a/src/mongo/db/repl/topology_coordinator.cpp b/src/mongo/db/repl/topology_coordinator.cpp index d1564250b07..cd41e11e08e 100644 --- a/src/mongo/db/repl/topology_coordinator.cpp +++ b/src/mongo/db/repl/topology_coordinator.cpp @@ -252,8 +252,10 @@ HostAndPort TopologyCoordinator::chooseNewSyncSource(Date_t now, int needMorePings = (_memberData.size() - 1) * 2 - _getTotalPings(); if (needMorePings > 0) { - OCCASIONALLY log() << "waiting for " << needMorePings - << " pings from other members before syncing"; + static Occasionally sampler; + if (sampler.tick()) { + log() << "waiting for " << needMorePings << " pings from other members before syncing"; + } _syncSource = HostAndPort(); return _syncSource; } diff --git a/src/mongo/db/s/balancer/balancer.cpp b/src/mongo/db/s/balancer/balancer.cpp index f5570a52507..86a80ee5032 100644 --- a/src/mongo/db/s/balancer/balancer.cpp +++ b/src/mongo/db/s/balancer/balancer.cpp @@ -360,8 +360,10 @@ void Balancer::_mainThread() { << ", secondaryThrottle: " << balancerConfig->getSecondaryThrottle().toBSON(); - OCCASIONALLY warnOnMultiVersion( - uassertStatusOK(_clusterStats->getStats(opCtx.get()))); + static Occasionally sampler; + if (sampler.tick()) { + warnOnMultiVersion(uassertStatusOK(_clusterStats->getStats(opCtx.get()))); + } Status status = _enforceTagRanges(opCtx.get()); if (!status.isOK()) { diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp index 8f5ff485dad..8e19ad74a65 100644 --- a/src/mongo/db/s/migration_destination_manager.cpp +++ b/src/mongo/db/s/migration_destination_manager.cpp @@ -1102,9 +1102,11 @@ bool MigrationDestinationManager::_flushPendingWrites(OperationContext* opCtx, const repl::OpTime& lastOpApplied) { if (!opReplicatedEnough(opCtx, lastOpApplied, _writeConcern)) { repl::OpTime op(lastOpApplied); - OCCASIONALLY log() << "migrate commit waiting for a majority of slaves for '" << _nss.ns() - << "' " << redact(_min) << " -> " << redact(_max) - << " waiting for: " << op; + static Occasionally sampler; + if (sampler.tick()) { + log() << "migrate commit waiting for a majority of slaves for '" << _nss.ns() << "' " + << redact(_min) << " -> " << redact(_max) << " waiting for: " << op; + } return false; } diff --git a/src/mongo/db/s/set_shard_version_command.cpp b/src/mongo/db/s/set_shard_version_command.cpp index 12a8d0ef469..5b9ff6db26e 100644 --- a/src/mongo/db/s/set_shard_version_command.cpp +++ b/src/mongo/db/s/set_shard_version_command.cpp @@ -383,7 +383,10 @@ public: << ", requested version is " << requestedVersion.toString() << " but found version " << currVersion.toString(); - OCCASIONALLY warning() << errmsg; + static Occasionally sampler; + if (sampler.tick()) { + warning() << errmsg; + } // WARNING: the exact fields below are important for compatibility with mongos // version reload. diff --git a/src/mongo/db/stats/counters.cpp b/src/mongo/db/stats/counters.cpp index 81a77016a8b..0355fa8787b 100644 --- a/src/mongo/db/stats/counters.cpp +++ b/src/mongo/db/stats/counters.cpp @@ -36,50 +36,10 @@ #include "mongo/db/stats/counters.h" #include "mongo/db/jsobj.h" -#include "mongo/util/debug_util.h" #include "mongo/util/log.h" namespace mongo { -using std::endl; - -OpCounters::OpCounters() {} - -void OpCounters::gotInserts(int n) { - RARELY _checkWrap(); - _insert.fetchAndAdd(n); -} - -void OpCounters::gotInsert() { - RARELY _checkWrap(); - _insert.fetchAndAdd(1); -} - -void OpCounters::gotQuery() { - RARELY _checkWrap(); - _query.fetchAndAdd(1); -} - -void OpCounters::gotUpdate() { - RARELY _checkWrap(); - _update.fetchAndAdd(1); -} - -void OpCounters::gotDelete() { - RARELY _checkWrap(); - _delete.fetchAndAdd(1); -} - -void OpCounters::gotGetMore() { - RARELY _checkWrap(); - _getmore.fetchAndAdd(1); -} - -void OpCounters::gotCommand() { - RARELY _checkWrap(); - _command.fetchAndAdd(1); -} - void OpCounters::gotOp(int op, bool isCommand) { switch (op) { case dbInsert: /*gotInsert();*/ @@ -104,18 +64,14 @@ void OpCounters::gotOp(int op, bool isCommand) { case opReply: break; default: - log() << "OpCounters::gotOp unknown op: " << op << endl; + log() << "OpCounters::gotOp unknown op: " << op << std::endl; } } -void OpCounters::_checkWrap() { - const int64_t MAX = 1ULL << 60; - - bool wrap = _insert.loadRelaxed() > MAX || _query.loadRelaxed() > MAX || - _update.loadRelaxed() > MAX || _delete.loadRelaxed() > MAX || - _getmore.loadRelaxed() > MAX || _command.loadRelaxed() > MAX; - - if (wrap) { +void OpCounters::_checkWrap(CacheAligned<AtomicInt64> OpCounters::*counter, int n) { + static constexpr auto maxCount = AtomicInt64::WordType{1} << 60; + auto oldValue = (this->*counter).fetchAndAddRelaxed(n); + if (oldValue > maxCount) { _insert.store(0); _query.store(0); _update.store(0); diff --git a/src/mongo/db/stats/counters.h b/src/mongo/db/stats/counters.h index 07e38b251a9..4d6a057e427 100644 --- a/src/mongo/db/stats/counters.h +++ b/src/mongo/db/stats/counters.h @@ -47,14 +47,29 @@ namespace mongo { */ class OpCounters { public: - OpCounters(); - void gotInserts(int n); - void gotInsert(); - void gotQuery(); - void gotUpdate(); - void gotDelete(); - void gotGetMore(); - void gotCommand(); + OpCounters() = default; + + void gotInserts(int n) { + _checkWrap(&OpCounters::_insert, n); + } + void gotInsert() { + _checkWrap(&OpCounters::_insert, 1); + } + void gotQuery() { + _checkWrap(&OpCounters::_query, 1); + } + void gotUpdate() { + _checkWrap(&OpCounters::_update, 1); + } + void gotDelete() { + _checkWrap(&OpCounters::_delete, 1); + } + void gotGetMore() { + _checkWrap(&OpCounters::_getmore, 1); + } + void gotCommand() { + _checkWrap(&OpCounters::_command, 1); + } void gotOp(int op, bool isCommand); @@ -81,7 +96,8 @@ public: } private: - void _checkWrap(); + // Increment member `counter` by `n`, resetting all counters if it was > 2^60. + void _checkWrap(CacheAligned<AtomicInt64> OpCounters::*counter, int n); CacheAligned<AtomicInt64> _insert; CacheAligned<AtomicInt64> _query; |