diff options
author | Mathias Stearn <mathias@10gen.com> | 2016-07-01 19:18:45 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2016-07-15 20:02:18 -0400 |
commit | 0673f9531be7cbaa8e5477ee28431a28191fe7ed (patch) | |
tree | 3cb01e723b750f437ea76247894fc0a70fe5d66a /src/mongo/db/concurrency | |
parent | 8db76c3dd2ff1e9f2d8dbb026c4cd3c4496217c7 (diff) | |
download | mongo-0673f9531be7cbaa8e5477ee28431a28191fe7ed.tar.gz |
SERVER-24242 Lock::ParallelBatchWriterMode sets isBatchWriter while in scope
Diffstat (limited to 'src/mongo/db/concurrency')
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency.cpp | 9 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency.h | 2 | ||||
-rw-r--r-- | src/mongo/db/concurrency/locker.h | 3 |
3 files changed, 12 insertions, 2 deletions
diff --git a/src/mongo/db/concurrency/d_concurrency.cpp b/src/mongo/db/concurrency/d_concurrency.cpp index cf66b2e5620..0879f8bda4f 100644 --- a/src/mongo/db/concurrency/d_concurrency.cpp +++ b/src/mongo/db/concurrency/d_concurrency.cpp @@ -185,7 +185,14 @@ void Lock::OplogIntentWriteLock::serializeIfNeeded() { } Lock::ParallelBatchWriterMode::ParallelBatchWriterMode(Locker* lockState) - : _pbwm(lockState, resourceIdParallelBatchWriterMode, MODE_X) {} + : _pbwm(lockState, resourceIdParallelBatchWriterMode, MODE_X), _lockState(lockState) { + invariant(!_lockState->isBatchWriter()); // Otherwise we couldn't clear in destructor. + _lockState->setIsBatchWriter(true); +} + +Lock::ParallelBatchWriterMode::~ParallelBatchWriterMode() { + _lockState->setIsBatchWriter(false); +} void Lock::ResourceLock::lock(LockMode mode) { invariant(_result == LOCK_INVALID); diff --git a/src/mongo/db/concurrency/d_concurrency.h b/src/mongo/db/concurrency/d_concurrency.h index bbaae4630b0..c9849f7b21f 100644 --- a/src/mongo/db/concurrency/d_concurrency.h +++ b/src/mongo/db/concurrency/d_concurrency.h @@ -335,9 +335,11 @@ public: public: explicit ParallelBatchWriterMode(Locker* lockState); + ~ParallelBatchWriterMode(); private: ResourceLock _pbwm; + Locker* const _lockState; }; }; diff --git a/src/mongo/db/concurrency/locker.h b/src/mongo/db/concurrency/locker.h index a858a5b0d79..2bd075ff2a3 100644 --- a/src/mongo/db/concurrency/locker.h +++ b/src/mongo/db/concurrency/locker.h @@ -302,7 +302,8 @@ public: */ virtual bool hasLockPending() const = 0; - // Used for the replication parallel log op application threads + // Used for the replication parallel oplog application threads to prevent any other threads from + // using the system while it is in an inconsistent state. virtual void setIsBatchWriter(bool newValue) = 0; virtual bool isBatchWriter() const = 0; |