diff options
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r-- | src/mongo/db/repl/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/bgsync.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/repl/master_slave.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/repl/operation_context_repl_mock.cpp | 25 | ||||
-rw-r--r-- | src/mongo/db/repl/operation_context_repl_mock.h | 11 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl_test.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_source_feedback.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_tail.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_tail_test.cpp | 14 |
9 files changed, 28 insertions, 50 deletions
diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index 8cf92b22702..146039a94cf 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -538,6 +538,7 @@ env.Library( ], LIBDEPS=[ 'task_runner', + '$BUILD_DIR/mongo/db/service_context', '$BUILD_DIR/mongo/unittest/concurrency', '$BUILD_DIR/mongo/util/decorable', ], diff --git a/src/mongo/db/repl/bgsync.cpp b/src/mongo/db/repl/bgsync.cpp index 29ad6d5704f..a9c5e068bc7 100644 --- a/src/mongo/db/repl/bgsync.cpp +++ b/src/mongo/db/repl/bgsync.cpp @@ -187,8 +187,6 @@ namespace { return; } - OperationContextImpl txn; - // We need to wait until initial sync has started. if (_replCoord->getMyLastOptime().isNull()) { sleepsecs(1); @@ -196,7 +194,8 @@ namespace { } // we want to unpause when we're no longer primary // start() also loads _lastOpTimeFetched, which we know is set from the "if" - else if (_pause) { + OperationContextImpl txn; + if (_pause) { start(&txn); } diff --git a/src/mongo/db/repl/master_slave.cpp b/src/mongo/db/repl/master_slave.cpp index dc975fe7b90..fde2c24232c 100644 --- a/src/mongo/db/repl/master_slave.cpp +++ b/src/mongo/db/repl/master_slave.cpp @@ -695,6 +695,9 @@ namespace repl { if ( !only.empty() && only != clientName ) return; + // Push the CurOp stack for "txn" so each individual oplog entry application is separately + // reported. + CurOp individualOp(txn); txn->setReplicatedWrites(false); const ReplSettings& replSettings = getGlobalReplicationCoordinator()->getSettings(); if (replSettings.pretouch && @@ -757,7 +760,6 @@ namespace repl { // mongos will not send requests there. That's why the last argument is false (do not do // version checking). OldClientContext ctx(txn, ns, false); - CurOp::get(txn)->reset(); bool empty = !ctx.db()->getDatabaseCatalogEntry()->hasUserData(); bool incompleteClone = incompleteCloneDbs.count( clientName ) != 0; diff --git a/src/mongo/db/repl/operation_context_repl_mock.cpp b/src/mongo/db/repl/operation_context_repl_mock.cpp index 5cfc9f31713..10d2e69beca 100644 --- a/src/mongo/db/repl/operation_context_repl_mock.cpp +++ b/src/mongo/db/repl/operation_context_repl_mock.cpp @@ -36,27 +36,20 @@ namespace mongo { namespace repl { - OperationContextReplMock::OperationContextReplMock(): - _lockState(new MMAPV1LockerImpl()), - _opID(0), - _checkForInterruptStatus(Status::OK()), - _maxTimeMicrosRemaining(0), - _writesAreReplicated(true) { - } - - OperationContextReplMock::~OperationContextReplMock() {} + OperationContextReplMock::OperationContextReplMock() : OperationContextReplMock(0) {} - Locker* OperationContextReplMock::lockState() const { - return _lockState.get(); + OperationContextReplMock::OperationContextReplMock(unsigned int opNum) : + OperationContextReplMock(nullptr, opNum) { } - unsigned int OperationContextReplMock::getOpID() const { - return _opID; + OperationContextReplMock::OperationContextReplMock(Client* client, unsigned int opNum) : + OperationContextNoop(client, opNum, new MMAPV1LockerImpl()), + _checkForInterruptStatus(Status::OK()), + _maxTimeMicrosRemaining(0), + _writesAreReplicated(true) { } - void OperationContextReplMock::setOpID(unsigned int opID) { - _opID = opID; - } + OperationContextReplMock::~OperationContextReplMock() = default; void OperationContextReplMock::checkForInterrupt() const { uassertStatusOK(checkForInterruptNoAssert()); diff --git a/src/mongo/db/repl/operation_context_repl_mock.h b/src/mongo/db/repl/operation_context_repl_mock.h index 6efacdaa68d..6c5e76b046f 100644 --- a/src/mongo/db/repl/operation_context_repl_mock.h +++ b/src/mongo/db/repl/operation_context_repl_mock.h @@ -46,14 +46,10 @@ namespace repl { class OperationContextReplMock : public OperationContextNoop { public: OperationContextReplMock(); + explicit OperationContextReplMock(unsigned int opNum); + OperationContextReplMock(Client* client, unsigned int opNum); virtual ~OperationContextReplMock(); - virtual Locker* lockState() const override; - - virtual unsigned int getOpID() const override; - - void setOpID(unsigned int opID); - virtual void checkForInterrupt() const override; virtual Status checkForInterruptNoAssert() const override; @@ -69,9 +65,6 @@ namespace repl { bool writesAreReplicated() const override; private: - boost::scoped_ptr<Locker> _lockState; - unsigned int _opID; - Status _checkForInterruptStatus; uint64_t _maxTimeMicrosRemaining; bool _writesAreReplicated; diff --git a/src/mongo/db/repl/replication_coordinator_impl_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_test.cpp index 5ced40ce853..3f5a574d0e4 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_test.cpp @@ -857,7 +857,8 @@ namespace { TEST_F(ReplCoordTest, AwaitReplicationInterrupt) { // Tests that a thread blocked in awaitReplication can be killed by a killOp operation - OperationContextReplMock txn; + const unsigned int opID = 100; + OperationContextReplMock txn{opID}; assertStartSuccess( BSON("_id" << "mySet" << "version" << 2 << @@ -878,8 +879,6 @@ namespace { writeConcern.wTimeout = WriteConcernOptions::kNoTimeout; writeConcern.wNumNodes = 2; - unsigned int opID = 100; - txn.setOpID(opID); // 2 nodes waiting for time2 awaiter.setOpTime(time2); @@ -1215,7 +1214,8 @@ namespace { } TEST_F(StepDownTest, InterruptStepDown) { - OperationContextReplMock txn; + const unsigned int opID = 100; + OperationContextReplMock txn{opID}; OpTimeWithTermZero optime1(100, 1); OpTimeWithTermZero optime2(100, 2); // No secondary is caught up @@ -1234,8 +1234,6 @@ namespace { runner.start(&txn); - unsigned int opID = 100; - txn.setOpID(opID); txn.setCheckForInterruptStatus(kInterruptedStatus); getReplCoord()->interrupt(opID); diff --git a/src/mongo/db/repl/sync_source_feedback.cpp b/src/mongo/db/repl/sync_source_feedback.cpp index 6773758ef7c..f11e420612a 100644 --- a/src/mongo/db/repl/sync_source_feedback.cpp +++ b/src/mongo/db/repl/sync_source_feedback.cpp @@ -157,7 +157,6 @@ namespace repl { void SyncSourceFeedback::run() { Client::initThread("SyncSourceFeedback"); - OperationContextImpl txn; ReplicationCoordinator* replCoord = getGlobalReplicationCoordinator(); while (true) { // breaks once _shutdownSignaled is true @@ -174,6 +173,7 @@ namespace repl { _positionChanged = false; } + auto txn = cc().getServiceContext()->newOpCtx(); MemberState state = replCoord->getMemberState(); if (state.primary() || state.startup()) { _resetConnection(); @@ -192,14 +192,14 @@ namespace repl { _positionChanged = true; continue; } - if (!_connect(&txn, target)) { + if (!_connect(txn.get(), target)) { sleepmillis(500); boost::unique_lock<boost::mutex> lock(_mtx); _positionChanged = true; continue; } } - Status status = updateUpstream(&txn); + Status status = updateUpstream(txn.get()); if (!status.isOK()) { sleepmillis(500); boost::unique_lock<boost::mutex> lock(_mtx); diff --git a/src/mongo/db/repl/sync_tail.cpp b/src/mongo/db/repl/sync_tail.cpp index 0e690b80c30..350a737ee72 100644 --- a/src/mongo/db/repl/sync_tail.cpp +++ b/src/mongo/db/repl/sync_tail.cpp @@ -136,7 +136,7 @@ namespace repl { } // Count each log op application as a separate operation, for reporting purposes - CurOp::get(txn)->reset(); + CurOp individualOp(txn); const char *ns = op.getStringField("ns"); verify(ns); diff --git a/src/mongo/db/repl/sync_tail_test.cpp b/src/mongo/db/repl/sync_tail_test.cpp index 9e20ce78818..94d1c073007 100644 --- a/src/mongo/db/repl/sync_tail_test.cpp +++ b/src/mongo/db/repl/sync_tail_test.cpp @@ -64,16 +64,6 @@ namespace { void BackgroundSyncMock::consume() { } void BackgroundSyncMock::waitForMore() { } - class OperationContextSyncTailMock : public OperationContextReplMock { - public: - Client* getClient() const override; - }; - - Client* OperationContextSyncTailMock::getClient() const { - Client::initThreadIfNotAlready(); - return &cc(); - } - class SyncTailTest : public unittest::Test { public: SyncTailTest(); @@ -112,7 +102,9 @@ namespace { replSettings.oplogSize = 5 * 1024 * 1024; setGlobalReplicationCoordinator(new ReplicationCoordinatorMock(replSettings)); - _txn.reset(new OperationContextSyncTailMock()); + + Client::initThreadIfNotAlready(); + _txn.reset(new OperationContextReplMock(&cc(), 0)); _opsApplied = 0; _applyOp = [](OperationContext* txn, Database* db, |