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/bgsync.cpp1
-rw-r--r--src/mongo/db/repl/master_slave.cpp10
-rw-r--r--src/mongo/db/repl/minvalid.cpp5
-rw-r--r--src/mongo/db/repl/network_interface_impl.cpp1
-rw-r--r--src/mongo/db/repl/oplog.cpp4
-rw-r--r--src/mongo/db/repl/repl_coordinator_external_state_impl.cpp2
-rw-r--r--src/mongo/db/repl/repl_coordinator_impl.cpp1
-rw-r--r--src/mongo/db/repl/resync.cpp1
-rw-r--r--src/mongo/db/repl/rs_initialsync.cpp2
-rw-r--r--src/mongo/db/repl/sync_source_feedback.cpp1
-rw-r--r--src/mongo/db/repl/sync_tail.cpp3
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);
}