diff options
author | Scott Hernandez <scotthernandez@gmail.com> | 2015-09-29 08:06:53 -0400 |
---|---|---|
committer | Scott Hernandez <scotthernandez@gmail.com> | 2015-10-01 08:29:06 -0400 |
commit | c4c3722e288bd13f40a5404cc20d44d077d469ca (patch) | |
tree | e8c55fee27d302d3804266f8233fe3e549517e60 /src/mongo/db/repl/minvalid.cpp | |
parent | 3617494d8c54e98767ec48537589a3b05bbc2667 (diff) | |
download | mongo-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.cpp | 30 |
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() << ")"; |