summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/rollback_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl/rollback_impl.cpp')
-rw-r--r--src/mongo/db/repl/rollback_impl.cpp12
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.