diff options
author | Jack Mulrow <jack.mulrow@mongodb.com> | 2022-02-28 19:31:31 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-28 20:16:11 +0000 |
commit | b17dfaaec98f63c16d05c9f76768df98be78699e (patch) | |
tree | e1ef6535504b8b6658f58a72a1f51292879023ab /src/mongo/db/ops | |
parent | cd3d711e8c208c3766717ded817fcc4130db2d42 (diff) | |
download | mongo-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.cpp | 18 |
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( |