summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Grebennicov <denis.grebennicov@mongodb.com>2023-03-21 14:09:21 +0100
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-03-21 15:47:59 +0000
commita6dd4fddbb0a3b6dcd4fb1b9001f674f757ed9f6 (patch)
tree8058f77adea4152836e37d9e6a8ca7ebe159771f
parent8b65a42f2385e590b2fef76dec4e30a573039951 (diff)
downloadmongo-a6dd4fddbb0a3b6dcd4fb1b9001f674f757ed9f6.tar.gz
SERVER-74386 Don’t reset "recordPreImages" option on "collMod" command
-rw-r--r--jstests/multiVersion/record_pre_images.js7
-rw-r--r--jstests/noPassthrough/record_preimage_startup_validation.js9
-rw-r--r--src/mongo/db/catalog/coll_mod.cpp20
3 files changed, 17 insertions, 19 deletions
diff --git a/jstests/multiVersion/record_pre_images.js b/jstests/multiVersion/record_pre_images.js
index 0e6c8ed00fd..606d5f3369f 100644
--- a/jstests/multiVersion/record_pre_images.js
+++ b/jstests/multiVersion/record_pre_images.js
@@ -18,6 +18,7 @@ rst.initiate();
let primaryDB = rst.getPrimary().getDB('test');
const collName1 = "testColl1";
+const collName2 = "testColl1";
jsTestLog("Starting 'recordPreImages' testing.");
@@ -30,10 +31,8 @@ assert.commandWorked(primaryDB.runCommand(
{create: collName1, recordPreImages: false, writeConcern: {w: 'majority'}}));
// Check the collMod command in FCV 4.2 fails.
-assert.writeOK(primaryDB.getCollection(collName1).insert({_id: 1})); // create the collection.
-assert.commandFailedWithCode(primaryDB.runCommand({collMod: collName1, recordPreImages: false}),
- ErrorCodes.InvalidOptions);
-assert.commandFailedWithCode(primaryDB.runCommand({collMod: collName1, recordPreImages: true}),
+assert.writeOK(primaryDB.getCollection(collName2).insert({_id: 1})); // create the collection.
+assert.commandFailedWithCode(primaryDB.runCommand({collMod: collName2, recordPreImages: true}),
ErrorCodes.InvalidOptions);
rst.stopSet();
diff --git a/jstests/noPassthrough/record_preimage_startup_validation.js b/jstests/noPassthrough/record_preimage_startup_validation.js
index e28dece9b23..b8c834a9a76 100644
--- a/jstests/noPassthrough/record_preimage_startup_validation.js
+++ b/jstests/noPassthrough/record_preimage_startup_validation.js
@@ -47,11 +47,20 @@ assert.commandWorked(
testDB.runCommand({create: collName1, recordPreImages: true, writeConcern: {w: 'majority'}}));
assert.eq(findCollectionInfo(testDB, collName1).options.recordPreImages, true);
+// Verify that 'recordPreImages' attribute remains set after collMod command.
+assert.commandWorked(testDB.runCommand({
+ collMod: collName1,
+ "validator": {"$jsonSchema": {"properties": {"items": {"bsonType": "array"}}}}
+}));
+assert.eq(findCollectionInfo(testDB, collName1).options.recordPreImages, true);
+
// Check the collMod collection command in FCV 4.4 succeeds.
assert.commandWorked(testDB.runCommand({create: collName2, writeConcern: {w: 'majority'}}));
assert.commandWorked(
testDB.runCommand({collMod: collName2, recordPreImages: true, writeConcern: {w: 'majority'}}));
assert.eq(findCollectionInfo(testDB, collName2).options.recordPreImages, true);
+
+// Test that the recordPreImages flag can be unset successfully using the 'collMod' command.
assert.commandWorked(
testDB.runCommand({collMod: collName2, recordPreImages: false, writeConcern: {w: 'majority'}}));
assert.eq(findCollectionInfo(testDB, collName2).options, {});
diff --git a/src/mongo/db/catalog/coll_mod.cpp b/src/mongo/db/catalog/coll_mod.cpp
index 1ccff89abd1..fce1610c7aa 100644
--- a/src/mongo/db/catalog/coll_mod.cpp
+++ b/src/mongo/db/catalog/coll_mod.cpp
@@ -99,12 +99,6 @@ void assertMovePrimaryInProgress(OperationContext* opCtx, NamespaceString const&
}
}
-enum RecordPreImagesSetting {
- True,
- False,
- Unset,
-};
-
struct CollModRequest {
const IndexDescriptor* idx = nullptr;
BSONElement indexExpireAfterSeconds = {};
@@ -114,7 +108,7 @@ struct CollModRequest {
boost::optional<Collection::Validator> collValidator;
boost::optional<std::string> collValidationAction;
boost::optional<std::string> collValidationLevel;
- RecordPreImagesSetting recordPreImages = Unset;
+ boost::optional<bool> recordPreImages;
};
StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx,
@@ -290,11 +284,7 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx,
str::stream() << "option not supported on a view: " << fieldName};
}
- if (e.trueValue()) {
- cmr.recordPreImages = RecordPreImagesSetting::True;
- } else {
- cmr.recordPreImages = RecordPreImagesSetting::False;
- }
+ cmr.recordPreImages = e.trueValue();
} else {
if (isView) {
return Status(ErrorCodes::InvalidOptions,
@@ -535,9 +525,9 @@ Status _collModInternal(OperationContext* opCtx,
"Failed to set validationLevel");
}
- if (cmrNew.recordPreImages != RecordPreImagesSetting::Unset) {
- coll->setRecordPreImages(
- opCtx, cmrNew.recordPreImages == RecordPreImagesSetting::True ? true : false);
+ if (cmrNew.recordPreImages.has_value() &&
+ *cmrNew.recordPreImages != oldCollOptions.recordPreImages) {
+ coll->setRecordPreImages(opCtx, *cmrNew.recordPreImages);
}
// Only observe non-view collMods, as view operations are observed as operations on the