diff options
author | seantao97 <seantao97@gmail.com> | 2018-07-13 14:04:16 -0400 |
---|---|---|
committer | Sean Tao <sean.tao@10gen.com> | 2018-07-23 17:46:43 -0400 |
commit | 07e98ebdac2029a63abd08a39e8b6141d8b04ae2 (patch) | |
tree | 52cc7c231aae82176a64f6c3dec0fc45b7a662b8 /src/mongo/db/catalog/coll_mod.cpp | |
parent | 468ea92542149779247925bc56f6b340246c4329 (diff) | |
download | mongo-07e98ebdac2029a63abd08a39e8b6141d8b04ae2.tar.gz |
SERVER-35086 empty collMod oplog entry mimics upgrade
Diffstat (limited to 'src/mongo/db/catalog/coll_mod.cpp')
-rw-r--r-- | src/mongo/db/catalog/coll_mod.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mongo/db/catalog/coll_mod.cpp b/src/mongo/db/catalog/coll_mod.cpp index 81d3ebc9be1..9906ed17602 100644 --- a/src/mongo/db/catalog/coll_mod.cpp +++ b/src/mongo/db/catalog/coll_mod.cpp @@ -75,6 +75,8 @@ struct CollModRequest { std::string collValidationLevel = {}; BSONElement usePowerOf2Sizes = {}; BSONElement noPadding = {}; + // Indicates whether any of the above fields have been set. + bool isEmptyCollModRequest = true; }; StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, @@ -82,13 +84,13 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, Collection* coll, const BSONObj& cmdObj, BSONObjBuilder* oplogEntryBuilder) { - bool isView = !coll; CollModRequest cmr; BSONForEach(e, cmdObj) { const auto fieldName = e.fieldNameStringData(); + if (Command::isGenericArgument(fieldName)) { continue; // Don't add to oplog builder. } else if (fieldName == "collMod") { @@ -173,6 +175,7 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, "existing expireAfterSeconds field is not a number"); } + cmr.isEmptyCollModRequest = false; } else if (fieldName == "validator" && !isView) { MatchExpressionParser::AllowedFeatureSet allowedFeatures = MatchExpressionParser::kBanAllSpecialFeatures; @@ -200,18 +203,21 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, } cmr.collValidator = e; + cmr.isEmptyCollModRequest = false; } else if (fieldName == "validationLevel" && !isView) { auto statusW = coll->parseValidationLevel(e.String()); if (!statusW.isOK()) return statusW.getStatus(); cmr.collValidationLevel = e.String(); + cmr.isEmptyCollModRequest = false; } else if (fieldName == "validationAction" && !isView) { auto statusW = coll->parseValidationAction(e.String()); if (!statusW.isOK()) return statusW.getStatus(); cmr.collValidationAction = e.String(); + cmr.isEmptyCollModRequest = false; } else if (fieldName == "pipeline") { if (!isView) { return Status(ErrorCodes::InvalidOptions, @@ -221,6 +227,8 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, return Status(ErrorCodes::InvalidOptions, "not a valid aggregation pipeline"); } cmr.viewPipeLine = e; + cmr.isEmptyCollModRequest = false; + } else if (fieldName == "viewOn") { if (!isView) { return Status(ErrorCodes::InvalidOptions, @@ -230,6 +238,7 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, return Status(ErrorCodes::InvalidOptions, "'viewOn' option must be a string"); } cmr.viewOn = e.str(); + cmr.isEmptyCollModRequest = false; } else { if (isView) { return Status(ErrorCodes::InvalidOptions, @@ -246,6 +255,7 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx, else return Status(ErrorCodes::InvalidOptions, str::stream() << "unknown option to collMod: " << fieldName); + cmr.isEmptyCollModRequest = false; } oplogEntryBuilder->append(e); @@ -341,9 +351,12 @@ Status _collModInternal(OperationContext* opCtx, if (!statusW.isOK()) { return statusW.getStatus(); } - CollModRequest cmr = statusW.getValue(); + if (cmr.isEmptyCollModRequest && !upgradeUUID) { + return Status::OK(); + } + WriteUnitOfWork wunit(opCtx); // Handle collMod on a view and return early. The View Catalog handles the creation of oplog |