summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2016-07-01 19:18:45 -0400
committerMathias Stearn <mathias@10gen.com>2016-07-15 20:02:18 -0400
commit0673f9531be7cbaa8e5477ee28431a28191fe7ed (patch)
tree3cb01e723b750f437ea76247894fc0a70fe5d66a /src/mongo/db/concurrency
parent8db76c3dd2ff1e9f2d8dbb026c4cd3c4496217c7 (diff)
downloadmongo-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.cpp9
-rw-r--r--src/mongo/db/concurrency/d_concurrency.h2
-rw-r--r--src/mongo/db/concurrency/locker.h3
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;