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