summaryrefslogtreecommitdiff
path: root/src/mongo/db/update/object_replace_executor.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
commit959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch)
treeacc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/update/object_replace_executor.cpp
parent76588293975fc059cf076779e4283e6ffaf8afff (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.cpp17
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.