diff options
author | Denis Grebennicov <denis.grebennicov@mongodb.com> | 2023-03-21 14:09:21 +0100 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-03-21 15:47:59 +0000 |
commit | a6dd4fddbb0a3b6dcd4fb1b9001f674f757ed9f6 (patch) | |
tree | 8058f77adea4152836e37d9e6a8ca7ebe159771f | |
parent | 8b65a42f2385e590b2fef76dec4e30a573039951 (diff) | |
download | mongo-a6dd4fddbb0a3b6dcd4fb1b9001f674f757ed9f6.tar.gz |
SERVER-74386 Don’t reset "recordPreImages" option on "collMod" command
-rw-r--r-- | jstests/multiVersion/record_pre_images.js | 7 | ||||
-rw-r--r-- | jstests/noPassthrough/record_preimage_startup_validation.js | 9 | ||||
-rw-r--r-- | src/mongo/db/catalog/coll_mod.cpp | 20 |
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 |