diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
| commit | 959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch) | |
| tree | acc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/update/object_replace_executor.cpp | |
| parent | 76588293975fc059cf076779e4283e6ffaf8afff (diff) | |
New upstream version 6.0.20upstream
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. |
