From 8097b23bb419708202b5306133cb57a545d0825b Mon Sep 17 00:00:00 2001 From: William Schultz Date: Wed, 23 Aug 2017 13:12:17 -0400 Subject: SERVER-29899 Call recovery logic in rollback --- src/mongo/db/repl/rollback_impl_test.cpp | 53 ++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) (limited to 'src/mongo/db/repl/rollback_impl_test.cpp') diff --git a/src/mongo/db/repl/rollback_impl_test.cpp b/src/mongo/db/repl/rollback_impl_test.cpp index 07db1736d3b..4b0b8640a53 100644 --- a/src/mongo/db/repl/rollback_impl_test.cpp +++ b/src/mongo/db/repl/rollback_impl_test.cpp @@ -122,6 +122,14 @@ protected: bool _transitionedToRollback = false; stdx::function _onTransitionToRollbackFn = [this]() { _transitionedToRollback = true; }; + bool _recoveredToStableTimestamp = false; + stdx::function _onRecoverToStableTimestampFn = [this]() { + _recoveredToStableTimestamp = true; + }; + + bool _recoveredFromOplog = false; + stdx::function _onRecoverFromOplogFn = [this]() { _recoveredFromOplog = true; }; + Timestamp _commonPointFound; stdx::function _onCommonPointFoundFn = [this](Timestamp commonPoint) { _commonPointFound = commonPoint; }; @@ -158,14 +166,22 @@ class RollbackImplTest::Listener : public RollbackImpl::Listener { public: Listener(RollbackImplTest* test) : _test(test) {} - void onTransitionToRollback() { + void onTransitionToRollback() noexcept { _test->_onTransitionToRollbackFn(); } - void onCommonPointFound(Timestamp commonPoint) { + void onCommonPointFound(Timestamp commonPoint) noexcept { _test->_onCommonPointFoundFn(commonPoint); } + void onRecoverToStableTimestamp() noexcept { + _test->_onRecoverToStableTimestampFn(); + } + + void onRecoverFromOplog() noexcept { + _test->_onRecoverFromOplogFn(); + } + private: RollbackImplTest* _test; }; @@ -236,7 +252,7 @@ TEST_F(RollbackImplTest, RollbackPersistsCommonPointToOplogTruncateAfterPoint) { _remoteOplog->setOperations({makeOpAndRecordId(2)}); _localOplog->setOperations({makeOpAndRecordId(2)}); - ASSERT_EQUALS(Status::OK(), _rollback->runRollback(_opCtx.get())); + ASSERT_OK(_rollback->runRollback(_opCtx.get())); // Check that the common point was saved. auto truncateAfterPoint = @@ -324,6 +340,37 @@ TEST_F(RollbackImplTest, RollbackReturnsBadStatusIfIncrementRollbackIDFails) { ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, status.code()); } +TEST_F(RollbackImplTest, RollbackCallsRecoverFromOplog) { + auto op = makeOpAndRecordId(1); + _remoteOplog->setOperations({op}); + _localOplog->setOperations({op}); + + // Run rollback. + ASSERT_OK(_rollback->runRollback(_opCtx.get())); + + // Make sure oplog recovery was executed. + ASSERT(_recoveredFromOplog); +} + +TEST_F(RollbackImplTest, RollbackSkipsRecoverFromOplogWhenShutdownEarly) { + auto op = makeOpAndRecordId(1); + _remoteOplog->setOperations({op}); + _localOplog->setOperations({op}); + + _onRecoverToStableTimestampFn = [this]() { + _recoveredToStableTimestamp = true; + _rollback->shutdown(); + }; + + // Run rollback. + auto status = _rollback->runRollback(_opCtx.get()); + + // Make sure shutdown occurred before oplog recovery. + ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, _rollback->runRollback(_opCtx.get())); + ASSERT(_recoveredToStableTimestamp); + ASSERT_FALSE(_recoveredFromOplog); +} + TEST_F(RollbackImplTest, RollbackSucceeds) { auto op = makeOpAndRecordId(1); _remoteOplog->setOperations({op}); -- cgit v1.2.1