summaryrefslogtreecommitdiff
path: root/src/mongo/db/update/object_replace_executor.cpp
diff options
context:
space:
mode:
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.