summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2022-02-28 19:31:31 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-02-28 20:16:11 +0000
commitb17dfaaec98f63c16d05c9f76768df98be78699e (patch)
treee1ef6535504b8b6658f58a72a1f51292879023ab /src/mongo/db/ops
parentcd3d711e8c208c3766717ded817fcc4130db2d42 (diff)
downloadmongo-b17dfaaec98f63c16d05c9f76768df98be78699e.tar.gz
SERVER-59186 Use transaction API for all current changing a document's shard key logic
Diffstat (limited to 'src/mongo/db/ops')
-rw-r--r--src/mongo/db/ops/write_ops_retryability.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/mongo/db/ops/write_ops_retryability.cpp b/src/mongo/db/ops/write_ops_retryability.cpp
index 0085c3ec48c..fb6d803712c 100644
--- a/src/mongo/db/ops/write_ops_retryability.cpp
+++ b/src/mongo/db/ops/write_ops_retryability.cpp
@@ -238,6 +238,11 @@ repl::OplogEntry getInnerNestedOplogEntry(const repl::OplogEntry& entry) {
} // namespace
+static constexpr StringData kWouldChangeOwningShardRetryContext =
+ "Operation was converted into a distributed transaction because the modified document would "
+ "move shards and succeeded but transaction history was not generated so the original reply "
+ "cannot be recreated."_sd;
+
SingleWriteResult parseOplogEntryForUpdate(const repl::OplogEntry& entry) {
SingleWriteResult res;
// Upserts are stored as inserts.
@@ -252,6 +257,10 @@ SingleWriteResult parseOplogEntryForUpdate(const repl::OplogEntry& entry) {
res.setN(1);
res.setNModified(1);
} else if (entry.getOpType() == repl::OpTypeEnum::kNoop) {
+ if (entry.getObject().woCompare(kWouldChangeOwningShardSentinel) == 0) {
+ uasserted(ErrorCodes::IncompleteTransactionHistory,
+ kWouldChangeOwningShardRetryContext);
+ }
return parseOplogEntryForUpdate(getInnerNestedOplogEntry(entry));
} else {
uasserted(40638,
@@ -265,12 +274,6 @@ SingleWriteResult parseOplogEntryForUpdate(const repl::OplogEntry& entry) {
return res;
}
-static constexpr StringData kFindAndModifyRetryContext =
- "findAndModify operation was converted into a distributed transaction "
- "because the modified document would move shards and succeeded but "
- "transaction history was not generated so the original reply "
- "cannot be recreated."_sd;
-
write_ops::FindAndModifyCommandReply parseOplogEntryForFindAndModify(
OperationContext* opCtx,
const write_ops::FindAndModifyCommandRequest& request,
@@ -279,7 +282,8 @@ write_ops::FindAndModifyCommandReply parseOplogEntryForFindAndModify(
// Migrated op and WouldChangeOwningShard sentinel case.
if (oplogEntry.getOpType() == repl::OpTypeEnum::kNoop) {
if (oplogEntry.getObject().woCompare(kWouldChangeOwningShardSentinel) == 0) {
- uasserted(ErrorCodes::IncompleteTransactionHistory, kFindAndModifyRetryContext);
+ uasserted(ErrorCodes::IncompleteTransactionHistory,
+ kWouldChangeOwningShardRetryContext);
}
return parseOplogEntryForFindAndModify(