diff options
Diffstat (limited to 'src/mongo/db/update/object_replace_executor.cpp')
| -rw-r--r-- | src/mongo/db/update/object_replace_executor.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/mongo/db/update/object_replace_executor.cpp b/src/mongo/db/update/object_replace_executor.cpp index e2d9262e001..205b270a8ca 100644 --- a/src/mongo/db/update/object_replace_executor.cpp +++ b/src/mongo/db/update/object_replace_executor.cpp @@ -45,19 +45,24 @@ namespace { constexpr StringData kIdFieldName = "_id"_sd; } // namespace -ObjectReplaceExecutor::ObjectReplaceExecutor(BSONObj replacement) - : _replacementDoc(replacement.getOwned()), _containsId(false) { - - // Replace all zero-valued timestamps with the current time and check for the existence of _id. +ObjectReplaceExecutor::ObjectReplaceExecutor(BSONObj replacement, bool bypassEmptyTsReplacement) + : _replacementDoc(replacement.getOwned()), + _containsId(false), + _bypassEmptyTsReplacement(bypassEmptyTsReplacement) { + // Check for the existence of the "_id" field, and if approrpriate replace all zero-valued + // timestamps with the current time. for (auto&& elem : _replacementDoc) { - // Do not change the _id field. if (elem.fieldNameStringData() == kIdFieldName) { _containsId = true; continue; } - if (elem.type() == BSONType::bsonTimestamp) { + // For updates that originated from the oplog, we're required to apply the update + // exactly as it was recorded (even if it contains zero-valued timestamps). Therefore, + // we should only replace zero-valued timestamps with the current time when + // '_bypassEmptyTsReplacement' is false. + if (!_bypassEmptyTsReplacement && elem.type() == BSONType::bsonTimestamp) { auto timestampView = DataView(const_cast<char*>(elem.value())); // We don't need to do an endian-safe read here, because 0 is 0 either way. |
