summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/minvalid.cpp
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2015-09-29 08:06:53 -0400
committerScott Hernandez <scotthernandez@gmail.com>2015-10-01 08:29:06 -0400
commitc4c3722e288bd13f40a5404cc20d44d077d469ca (patch)
treee8c55fee27d302d3804266f8233fe3e549517e60 /src/mongo/db/repl/minvalid.cpp
parent3617494d8c54e98767ec48537589a3b05bbc2667 (diff)
downloadmongo-c4c3722e288bd13f40a5404cc20d44d077d469ca.tar.gz
SERVER-18983: enforce batch write durability in setMinvalid function
Diffstat (limited to 'src/mongo/db/repl/minvalid.cpp')
-rw-r--r--src/mongo/db/repl/minvalid.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/mongo/db/repl/minvalid.cpp b/src/mongo/db/repl/minvalid.cpp
index bcdc5b5a404..990d6224e50 100644
--- a/src/mongo/db/repl/minvalid.cpp
+++ b/src/mongo/db/repl/minvalid.cpp
@@ -61,6 +61,8 @@ void clearInitialSyncFlag(OperationContext* txn) {
Helpers::putSingleton(txn, minvalidNS, BSON("$unset" << initialSyncFlag));
}
MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "clearInitialSyncFlags", minvalidNS);
+
+ txn->recoveryUnit()->waitUntilDurable();
LOG(3) << "clearing initial sync flag";
}
@@ -71,35 +73,43 @@ void setInitialSyncFlag(OperationContext* txn) {
Helpers::putSingleton(txn, minvalidNS, BSON("$set" << initialSyncFlag));
}
MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "setInitialSyncFlags", minvalidNS);
+
+ txn->recoveryUnit()->waitUntilDurable();
LOG(3) << "setting initial sync flag";
}
-void setMinValid(OperationContext* ctx, const OpTime& endOpTime) {
+void setMinValid(OperationContext* txn, const OpTime& endOpTime, const DurableRequirement durReq) {
MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
- ScopedTransaction transaction(ctx, MODE_IX);
- Lock::DBLock dblk(ctx->lockState(), "local", MODE_X);
+ ScopedTransaction transaction(txn, MODE_IX);
+ Lock::DBLock dblk(txn->lockState(), "local", MODE_X);
Helpers::putSingleton(
- ctx,
+ txn,
minvalidNS,
BSON("$set" << BSON("ts" << endOpTime.getTimestamp() << "t" << endOpTime.getTerm())
<< "$unset" << BSON(beginFieldName << 1)));
}
- MONGO_WRITE_CONFLICT_RETRY_LOOP_END(ctx, "setMinValid", minvalidNS);
+ MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "setMinValid", minvalidNS);
+
+ if (durReq == DurableRequirement::Strong) {
+ txn->recoveryUnit()->waitUntilDurable();
+ }
LOG(3) << "setting minvalid: " << endOpTime.toString() << "(" << endOpTime.toBSON() << ")";
}
-void setMinValid(OperationContext* ctx, const BatchBoundaries& boundaries) {
+void setMinValid(OperationContext* txn, const BatchBoundaries& boundaries) {
const OpTime& start(boundaries.start);
const OpTime& end(boundaries.end);
MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
- ScopedTransaction transaction(ctx, MODE_IX);
- Lock::DBLock dblk(ctx->lockState(), "local", MODE_X);
- Helpers::putSingleton(ctx,
+ ScopedTransaction transaction(txn, MODE_IX);
+ Lock::DBLock dblk(txn->lockState(), "local", MODE_X);
+ Helpers::putSingleton(txn,
minvalidNS,
BSON("$set" << BSON("ts" << end.getTimestamp() << "t" << end.getTerm()
<< beginFieldName << start.toBSON())));
}
- MONGO_WRITE_CONFLICT_RETRY_LOOP_END(ctx, "setMinValid", minvalidNS);
+ MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "setMinValid", minvalidNS);
+ // NOTE: No need to ensure durability here since starting a batch isn't a problem unless
+ // writes happen after, in which case this marker (minvalid) will be written already.
LOG(3) << "setting minvalid: " << boundaries.start.toString() << "("
<< boundaries.start.toBSON() << ") -> " << boundaries.end.toString() << "("
<< boundaries.end.toBSON() << ")";