diff options
Diffstat (limited to 'src/mongo/db/storage/recovery_unit_test_harness.cpp')
-rw-r--r-- | src/mongo/db/storage/recovery_unit_test_harness.cpp | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/src/mongo/db/storage/recovery_unit_test_harness.cpp b/src/mongo/db/storage/recovery_unit_test_harness.cpp index 0c4cd3b1739..ca9c0ca5f25 100644 --- a/src/mongo/db/storage/recovery_unit_test_harness.cpp +++ b/src/mongo/db/storage/recovery_unit_test_harness.cpp @@ -88,7 +88,7 @@ TEST_F(RecoveryUnitTestHarness, CommitUnitOfWork) { Lock::GlobalLock globalLk(opCtx.get(), MODE_IX); const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); opCtx->lockState()->beginWriteUnitOfWork(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); StatusWith<RecordId> s = rs->insertRecord(opCtx.get(), "data", 4, Timestamp()); ASSERT_TRUE(s.isOK()); ASSERT_EQUALS(1, rs->numRecords(opCtx.get())); @@ -102,7 +102,7 @@ TEST_F(RecoveryUnitTestHarness, AbortUnitOfWork) { Lock::GlobalLock globalLk(opCtx.get(), MODE_IX); const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); opCtx->lockState()->beginWriteUnitOfWork(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); StatusWith<RecordId> s = rs->insertRecord(opCtx.get(), "data", 4, Timestamp()); ASSERT_TRUE(s.isOK()); ASSERT_EQUALS(1, rs->numRecords(opCtx.get())); @@ -115,13 +115,13 @@ TEST_F(RecoveryUnitTestHarness, CommitAndRollbackChanges) { int count = 0; const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); ru->registerChange(std::make_unique<TestChange>(&count)); ASSERT_EQUALS(count, 0); ru->commitUnitOfWork(); ASSERT_EQUALS(count, 1); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); ru->registerChange(std::make_unique<TestChange>(&count)); ASSERT_EQUALS(count, 1); ru->abortUnitOfWork(); @@ -132,7 +132,7 @@ TEST_F(RecoveryUnitTestHarness, CheckIsActiveWithCommit) { Lock::GlobalLock globalLk(opCtx.get(), MODE_IX); const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); opCtx->lockState()->beginWriteUnitOfWork(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); // TODO SERVER-51787: to re-enable this. // ASSERT_TRUE(ru->isActive()); StatusWith<RecordId> s = rs->insertRecord(opCtx.get(), "data", 4, Timestamp()); @@ -145,7 +145,7 @@ TEST_F(RecoveryUnitTestHarness, CheckIsActiveWithAbort) { Lock::GlobalLock globalLk(opCtx.get(), MODE_IX); const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); opCtx->lockState()->beginWriteUnitOfWork(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); // TODO SERVER-51787: to re-enable this. // ASSERT_TRUE(ru->isActive()); StatusWith<RecordId> s = rs->insertRecord(opCtx.get(), "data", 4, Timestamp()); @@ -156,7 +156,7 @@ TEST_F(RecoveryUnitTestHarness, CheckIsActiveWithAbort) { TEST_F(RecoveryUnitTestHarness, BeginningUnitOfWorkDoesNotIncrementSnapshotId) { auto snapshotIdBefore = ru->getSnapshotId(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); ASSERT_EQ(snapshotIdBefore, ru->getSnapshotId()); ru->abortUnitOfWork(); } @@ -174,14 +174,14 @@ TEST_F(RecoveryUnitTestHarness, AbandonSnapshotIncrementsSnapshotId) { TEST_F(RecoveryUnitTestHarness, CommitUnitOfWorkIncrementsSnapshotId) { auto snapshotIdBefore = ru->getSnapshotId(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); ru->commitUnitOfWork(); ASSERT_NE(snapshotIdBefore, ru->getSnapshotId()); } TEST_F(RecoveryUnitTestHarness, AbortUnitOfWorkIncrementsSnapshotId) { auto snapshotIdBefore = ru->getSnapshotId(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); ru->abortUnitOfWork(); ASSERT_NE(snapshotIdBefore, ru->getSnapshotId()); } @@ -195,7 +195,7 @@ TEST_F(RecoveryUnitTestHarness, AbandonSnapshotCommitMode) { const auto rs = harnessHelper->createRecordStore(opCtx.get(), "table1"); opCtx->lockState()->beginWriteUnitOfWork(); - ru->beginUnitOfWork(opCtx.get()); + ru->beginUnitOfWork(opCtx->readOnly()); StatusWith<RecordId> rid1 = rs->insertRecord(opCtx.get(), "ABC", 3, Timestamp()); StatusWith<RecordId> rid2 = rs->insertRecord(opCtx.get(), "123", 3, Timestamp()); ASSERT_TRUE(rid1.isOK()); @@ -231,6 +231,17 @@ TEST_F(RecoveryUnitTestHarness, AbandonSnapshotCommitMode) { ASSERT_EQ(strncmp(recordAfterAbandon->data.data(), "123", 3), 0); } +TEST_F(RecoveryUnitTestHarness, FlipReadOnly) { + ru->beginUnitOfWork(/*readOnly=*/true); + ru->endReadOnlyUnitOfWork(); + + ru->beginUnitOfWork(/*readOnly=*/false); + ru->commitUnitOfWork(); + + ru->beginUnitOfWork(/*readOnly=*/false); + ru->abortUnitOfWork(); +} + DEATH_TEST_F(RecoveryUnitTestHarness, RegisterChangeMustBeInUnitOfWork, "invariant") { int count = 0; opCtx->recoveryUnit()->registerChange(std::make_unique<TestChange>(&count)); @@ -245,7 +256,7 @@ DEATH_TEST_F(RecoveryUnitTestHarness, AbortMustBeInUnitOfWork, "invariant") { } DEATH_TEST_F(RecoveryUnitTestHarness, CannotHaveUnfinishedUnitOfWorkOnExit, "invariant") { - opCtx->recoveryUnit()->beginUnitOfWork(opCtx.get()); + opCtx->recoveryUnit()->beginUnitOfWork(opCtx->readOnly()); } DEATH_TEST_F(RecoveryUnitTestHarness, PrepareMustBeInUnitOfWork, "invariant") { @@ -258,14 +269,24 @@ DEATH_TEST_F(RecoveryUnitTestHarness, PrepareMustBeInUnitOfWork, "invariant") { } DEATH_TEST_F(RecoveryUnitTestHarness, WaitUntilDurableMustBeOutOfUnitOfWork, "invariant") { - opCtx->recoveryUnit()->beginUnitOfWork(opCtx.get()); + opCtx->recoveryUnit()->beginUnitOfWork(opCtx->readOnly()); opCtx->recoveryUnit()->waitUntilDurable(opCtx.get()); } DEATH_TEST_F(RecoveryUnitTestHarness, AbandonSnapshotMustBeOutOfUnitOfWork, "invariant") { - opCtx->recoveryUnit()->beginUnitOfWork(opCtx.get()); + opCtx->recoveryUnit()->beginUnitOfWork(opCtx->readOnly()); opCtx->recoveryUnit()->abandonSnapshot(); } +DEATH_TEST_F(RecoveryUnitTestHarness, CommitInReadOnly, "invariant") { + opCtx->recoveryUnit()->beginUnitOfWork(/*readOnly=*/true); + opCtx->recoveryUnit()->commitUnitOfWork(); +} + +DEATH_TEST_F(RecoveryUnitTestHarness, AbortInReadOnly, "invariant") { + opCtx->recoveryUnit()->beginUnitOfWork(/*readOnly=*/true); + opCtx->recoveryUnit()->abortUnitOfWork(); +} + } // namespace } // namespace mongo |