diff options
author | Geert Bosch <geert@mongodb.com> | 2014-11-20 14:26:43 -0500 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2014-11-21 13:18:53 -0500 |
commit | e7f6c56327afa51847a95d9d5bc6399209856c10 (patch) | |
tree | 93a6f8b98d13ff81bd21a2ffc9f312e4ff662123 /src/mongo/db/repl | |
parent | e5644e2ca12a60df677cb8e8dfc70f19a9423b0a (diff) | |
download | mongo-e7f6c56327afa51847a95d9d5bc6399209856c10.tar.gz |
SERVER-16192: Add ScopedTransaction to automatically commitAndRestart()
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r-- | src/mongo/db/repl/bgsync.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/master_slave.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/repl/minvalid.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/repl/network_interface_impl.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/oplog.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_external_state_impl.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/resync.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/rs_initialsync.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_source_feedback.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_tail.cpp | 3 |
11 files changed, 31 insertions, 0 deletions
diff --git a/src/mongo/db/repl/bgsync.cpp b/src/mongo/db/repl/bgsync.cpp index cf6be9c7cac..e5b2cbe032d 100644 --- a/src/mongo/db/repl/bgsync.cpp +++ b/src/mongo/db/repl/bgsync.cpp @@ -521,6 +521,7 @@ namespace { long long BackgroundSync::_readLastAppliedHash(OperationContext* txn) { BSONObj oplogEntry; try { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_X); bool success = Helpers::getLast(txn, rsoplog, oplogEntry); if (!success) { diff --git a/src/mongo/db/repl/master_slave.cpp b/src/mongo/db/repl/master_slave.cpp index 4aea655198b..543afab4fbb 100644 --- a/src/mongo/db/repl/master_slave.cpp +++ b/src/mongo/db/repl/master_slave.cpp @@ -170,6 +170,7 @@ namespace repl { bool exists = Helpers::getSingleton(txn, "local.me", _me); if (!exists || !_me.hasField("host") || _me["host"].String() != myname) { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock dblk(txn->lockState(), "local", MODE_X); WriteUnitOfWork wunit(txn); // clean out local.me @@ -820,6 +821,7 @@ namespace repl { } // obviously global isn't ideal, but non-repl set is old so // keeping it simple + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); save(txn); } @@ -871,6 +873,7 @@ namespace repl { log() << "repl: " << ns << " oplog is empty" << endl; } { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); save(txn); } @@ -943,6 +946,7 @@ namespace repl { const bool moreInitialSyncsPending = !addDbNextPass.empty() && n; if ( moreInitialSyncsPending || !oplogReader.more() ) { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); if (tailing) { @@ -959,6 +963,7 @@ namespace repl { OCCASIONALLY if( n > 0 && ( n > 100000 || time(0) - saveLast > 60 ) ) { // periodically note our progress, in case we are doing a lot of work and crash + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); syncedTo = nextOpTime; // can't update local log ts since there are pending operations from our peer @@ -1000,6 +1005,7 @@ namespace repl { verify( justOne ); oplogReader.putBack( op ); _sleepAdviceTime = nextOpTime.getSecs() + replSettings.slavedelay + 1; + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); if ( n > 0 ) { syncedTo = last; @@ -1082,6 +1088,7 @@ namespace repl { int _replMain(OperationContext* txn, ReplSource::SourceVector& sources, int& nApplied) { { ReplInfo r("replMain load sources"); + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); ReplSource::loadAll(txn, sources); @@ -1153,6 +1160,7 @@ namespace repl { while ( 1 ) { int s = 0; { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); if ( replAllDead ) { // throttledForceResyncDead can throw @@ -1184,6 +1192,7 @@ namespace repl { } { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); verify( syncing == 1 ); syncing--; @@ -1310,6 +1319,7 @@ namespace repl { } OperationContextImpl txn; // XXX + ScopedTransaction transaction(&txn, MODE_S); Lock::GlobalRead lk(txn.lockState()); for( unsigned i = a; i <= b; i++ ) { diff --git a/src/mongo/db/repl/minvalid.cpp b/src/mongo/db/repl/minvalid.cpp index 30a22a611ea..0005f364963 100644 --- a/src/mongo/db/repl/minvalid.cpp +++ b/src/mongo/db/repl/minvalid.cpp @@ -50,17 +50,20 @@ namespace { } // namespace void clearInitialSyncFlag(OperationContext* txn) { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_X); Helpers::putSingleton(txn, minvalidNS, BSON("$unset" << initialSyncFlag)); } void setInitialSyncFlag(OperationContext* txn) { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_X); Helpers::putSingleton(txn, minvalidNS, BSON("$set" << initialSyncFlag)); } bool getInitialSyncFlag() { OperationContextImpl txn; + ScopedTransaction transaction(&txn, MODE_IX); Lock::DBLock lk(txn.lockState(), "local", MODE_X); BSONObj mv; bool found = Helpers::getSingleton( &txn, minvalidNS, mv); @@ -72,11 +75,13 @@ namespace { } void setMinValid(OperationContext* ctx, OpTime ts) { + ScopedTransaction transaction(ctx, MODE_IX); Lock::DBLock lk(ctx->lockState(), "local", MODE_X); Helpers::putSingleton(ctx, minvalidNS, BSON("$set" << BSON("ts" << ts))); } OpTime getMinValid(OperationContext* txn) { + ScopedTransaction transaction(txn, MODE_IS); Lock::DBLock lk(txn->lockState(), "local", MODE_S); BSONObj mv; bool found = Helpers::getSingleton(txn, minvalidNS, mv); diff --git a/src/mongo/db/repl/network_interface_impl.cpp b/src/mongo/db/repl/network_interface_impl.cpp index d84d2148210..b459260f2ef 100644 --- a/src/mongo/db/repl/network_interface_impl.cpp +++ b/src/mongo/db/repl/network_interface_impl.cpp @@ -535,6 +535,7 @@ namespace { const stdx::function<void (OperationContext*)>& callback) { Client::initThreadIfNotAlready(); OperationContextImpl txn; + ScopedTransaction transaction(&txn, MODE_X); Lock::GlobalWrite lk(txn.lockState()); callback(&txn); } diff --git a/src/mongo/db/repl/oplog.cpp b/src/mongo/db/repl/oplog.cpp index 9842d675f16..0f68a52a6a8 100644 --- a/src/mongo/db/repl/oplog.cpp +++ b/src/mongo/db/repl/oplog.cpp @@ -149,6 +149,7 @@ namespace repl { todo : make _logOpRS() call this so we don't repeat ourself? */ OpTime _logOpObjRS(OperationContext* txn, const BSONObj& op) { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_X); const OpTime ts = op["ts"]._opTime(); @@ -265,6 +266,7 @@ namespace repl { return; } + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_IX); Lock::CollectionLock lk2(txn->lockState(), rsoplog, MODE_IX); @@ -335,6 +337,7 @@ namespace repl { return; } + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lk(txn->lockState(), "local", MODE_IX); if( logNS == 0 ) { @@ -459,6 +462,7 @@ namespace repl { } void createOplog(OperationContext* txn) { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); const char * ns = "local.oplog.$main"; diff --git a/src/mongo/db/repl/repl_coordinator_external_state_impl.cpp b/src/mongo/db/repl/repl_coordinator_external_state_impl.cpp index 48bdf194987..c6c15238363 100644 --- a/src/mongo/db/repl/repl_coordinator_external_state_impl.cpp +++ b/src/mongo/db/repl/repl_coordinator_external_state_impl.cpp @@ -125,6 +125,7 @@ namespace { std::string myname = getHostName(); OID myRID; { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock lock(txn->lockState(), meDatabaseName, MODE_X); BSONObj me; @@ -171,6 +172,7 @@ namespace { OperationContext* txn, const BSONObj& config) { try { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock dbWriteLock(txn->lockState(), configDatabaseName, MODE_X); Helpers::putSingleton(txn, configCollectionName, config); return Status::OK(); diff --git a/src/mongo/db/repl/repl_coordinator_impl.cpp b/src/mongo/db/repl/repl_coordinator_impl.cpp index ad835cc531d..ca95291f26e 100644 --- a/src/mongo/db/repl/repl_coordinator_impl.cpp +++ b/src/mongo/db/repl/repl_coordinator_impl.cpp @@ -529,6 +529,7 @@ namespace { } lk.unlock(); boost::scoped_ptr<OperationContext> txn(_externalState->createOperationContext("rsDrain")); + ScopedTransaction transaction(txn.get(), MODE_X); Lock::GlobalWrite globalWriteLock(txn->lockState()); lk.lock(); if (!_isWaitingForDrainToComplete) { diff --git a/src/mongo/db/repl/resync.cpp b/src/mongo/db/repl/resync.cpp index fc47875005b..61cb3e4632b 100644 --- a/src/mongo/db/repl/resync.cpp +++ b/src/mongo/db/repl/resync.cpp @@ -66,6 +66,7 @@ namespace repl { BSONObjBuilder& result, bool fromRepl) { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite globalWriteLock(txn->lockState()); ReplicationCoordinator* replCoord = getGlobalReplicationCoordinator(); diff --git a/src/mongo/db/repl/rs_initialsync.cpp b/src/mongo/db/repl/rs_initialsync.cpp index b349d81a1f0..efdf411bc4c 100644 --- a/src/mongo/db/repl/rs_initialsync.cpp +++ b/src/mongo/db/repl/rs_initialsync.cpp @@ -116,6 +116,7 @@ namespace { options.syncIndexes = ! dataPass; // Make database stable + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock dbWrite(txn->lockState(), db, MODE_X); if (!cloner.go(txn, db, host, options, NULL, err, &errCode)) { @@ -200,6 +201,7 @@ namespace { if (!init->syncApply(txn, op)) { bool retry; { + ScopedTransaction transaction(txn, MODE_X); Lock::GlobalWrite lk(txn->lockState()); retry = init->shouldRetry(txn, op); } diff --git a/src/mongo/db/repl/sync_source_feedback.cpp b/src/mongo/db/repl/sync_source_feedback.cpp index 71c1c6f0485..677cb8c7e2c 100644 --- a/src/mongo/db/repl/sync_source_feedback.cpp +++ b/src/mongo/db/repl/sync_source_feedback.cpp @@ -77,6 +77,7 @@ namespace repl { void SyncSourceFeedback::ensureMe(OperationContext* txn) { string myname = getHostName(); { + ScopedTransaction transaction(txn, MODE_IX); Lock::DBLock dlk(txn->lockState(), "local", MODE_X); Client::Context ctx(txn, "local"); diff --git a/src/mongo/db/repl/sync_tail.cpp b/src/mongo/db/repl/sync_tail.cpp index b779fb6e16b..e191f96c1b1 100644 --- a/src/mongo/db/repl/sync_tail.cpp +++ b/src/mongo/db/repl/sync_tail.cpp @@ -474,6 +474,7 @@ namespace repl { namespace { void tryToGoLiveAsASecondary(OperationContext* txn, ReplicationCoordinator* replCoord) { + ScopedTransaction transaction(txn, MODE_S); Lock::GlobalRead readLock(txn->lockState()); if (replCoord->getMaintenanceMode()) { @@ -647,6 +648,7 @@ namespace { OpTime lastOpTime; { OperationContextImpl txn; // XXX? + ScopedTransaction transaction(&txn, MODE_IX); Lock::DBLock lk(txn.lockState(), "local", MODE_X); WriteUnitOfWork wunit(&txn); @@ -757,6 +759,7 @@ namespace { if (!st->syncApply(&txn, *it)) { bool status; { + ScopedTransaction transaction(&txn, MODE_X); Lock::GlobalWrite lk(txn.lockState()); status = st->shouldRetry(&txn, *it); } |