diff options
author | Bruce Lucas <bruce.lucas@mongodb.com> | 2018-01-31 09:09:29 -0500 |
---|---|---|
committer | Bruce Lucas <bruce.lucas@mongodb.com> | 2018-01-31 14:03:42 -0500 |
commit | 04600d70a4e4ac85c5f199c5756e0e5acb2a7d05 (patch) | |
tree | c488c825618bb1b5a061a3b0f5ec38448f2444a8 | |
parent | 08463308869df203c438d354c6346ad659ed36dd (diff) | |
download | mongo-04600d70a4e4ac85c5f199c5756e0e5acb2a7d05.tar.gz |
SERVER-32875 Don't stall ftdc due to running out of tickets
-rw-r--r-- | src/mongo/db/concurrency/lock_state.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/concurrency/locker.h | 13 | ||||
-rw-r--r-- | src/mongo/db/ftdc/collector.cpp | 1 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp index 33e1f0cb473..701d06c3a2f 100644 --- a/src/mongo/db/concurrency/lock_state.cpp +++ b/src/mongo/db/concurrency/lock_state.cpp @@ -307,7 +307,7 @@ LockResult LockerImpl<IsForMMAPV1>::_lockGlobalBegin(LockMode mode, Milliseconds dassert(isLocked() == (_modeForTicket != MODE_NONE)); if (_modeForTicket == MODE_NONE) { const bool reader = isSharedLockMode(mode); - auto holder = ticketHolders[mode]; + auto holder = shouldAcquireTicket() ? ticketHolders[mode] : nullptr; if (holder) { _clientState.store(reader ? kQueuedReader : kQueuedWriter); if (timeout == Milliseconds::max()) { diff --git a/src/mongo/db/concurrency/locker.h b/src/mongo/db/concurrency/locker.h index 90ac466ba94..b16836bc5a1 100644 --- a/src/mongo/db/concurrency/locker.h +++ b/src/mongo/db/concurrency/locker.h @@ -328,11 +328,24 @@ public: return _shouldConflictWithSecondaryBatchApplication; } + /** + * If set to false, this opts out of the ticket mechanism. This should be used sparingly + * for special purpose threads, such as FTDC. + */ + void setShouldAcquireTicket(bool newValue) { + _shouldAcquireTicket = newValue; + } + bool shouldAcquireTicket() const { + return _shouldAcquireTicket; + } + + protected: Locker() {} private: bool _shouldConflictWithSecondaryBatchApplication = true; + bool _shouldAcquireTicket = true; }; } // namespace mongo diff --git a/src/mongo/db/ftdc/collector.cpp b/src/mongo/db/ftdc/collector.cpp index 78e4f0de60a..c1e0c47158d 100644 --- a/src/mongo/db/ftdc/collector.cpp +++ b/src/mongo/db/ftdc/collector.cpp @@ -67,6 +67,7 @@ std::tuple<BSONObj, Date_t> FTDCCollectorCollection::collect(Client* client) { // batches that are taking a long time. auto opCtx = client->makeOperationContext(); opCtx->lockState()->setShouldConflictWithSecondaryBatchApplication(false); + opCtx->lockState()->setShouldAcquireTicket(false); for (auto& collector : _collectors) { BSONObjBuilder subObjBuilder(builder.subobjStart(collector->name())); |