diff options
Diffstat (limited to 'src/mongo/db/repl/rollback_impl.cpp')
| -rw-r--r-- | src/mongo/db/repl/rollback_impl.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/mongo/db/repl/rollback_impl.cpp b/src/mongo/db/repl/rollback_impl.cpp index da9dfc7e95a..a32cf18ef20 100644 --- a/src/mongo/db/repl/rollback_impl.cpp +++ b/src/mongo/db/repl/rollback_impl.cpp @@ -267,10 +267,20 @@ Status RollbackImpl::runRollback(OperationContext* opCtx) { rollbackHangAfterTransitionToRollback.pauseWhileSet(opCtx); } + auto& sizeRecovery = sizeRecoveryState(opCtx->getServiceContext()); + // We clear the SizeRecoveryState before we recover to a stable timestamp. This ensures that we // only use size adjustment markings from the storage and replication recovery processes in this // rollback. - sizeRecoveryState(opCtx->getServiceContext()).clearStateBeforeRecovery(); + sizeRecovery.clearStateBeforeRecovery(); + + // Sizes should always be checked when creating a collection during rollback. This is in case + // the size storer information is no longer accurate. This may be necessary if capped deletes + // are rolled-back or if rollback occurs across a collection rename. + sizeRecovery.setRecordStoresShouldAlwaysCheckSize(true); + ScopeGuard sizeRecoveryStateGuard{[&sizeRecovery] { + sizeRecovery.setRecordStoresShouldAlwaysCheckSize(false); + }}; // After successfully transitioning to the ROLLBACK state, we must always transition back to // SECONDARY, even if we fail at any point during the rollback process. |
