summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r--src/mongo/db/repl/SConscript1
-rw-r--r--src/mongo/db/repl/bgsync.cpp5
-rw-r--r--src/mongo/db/repl/master_slave.cpp4
-rw-r--r--src/mongo/db/repl/operation_context_repl_mock.cpp25
-rw-r--r--src/mongo/db/repl/operation_context_repl_mock.h11
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl_test.cpp10
-rw-r--r--src/mongo/db/repl/sync_source_feedback.cpp6
-rw-r--r--src/mongo/db/repl/sync_tail.cpp2
-rw-r--r--src/mongo/db/repl/sync_tail_test.cpp14
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,