summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiyuan Zhou <visualzhou@gmail.com>2019-06-27 01:17:09 -0400
committerSiyuan Zhou <visualzhou@gmail.com>2019-07-02 14:42:52 -0400
commitde8b171fbd730be5f82d0c4b6a3c378000167246 (patch)
tree7f95fa6cebcd9065eec313aab02d7c7dbdbc47a8
parentb2d65bd20f835baeca0cf3b78368cec29a63bf5a (diff)
downloadmongo-de8b171fbd730be5f82d0c4b6a3c378000167246.tar.gz
SERVER-41062 Always return TransactionTooLarge rather than BSONObjectTooLarge when transaction is too large to fit in a single applyOps
-rw-r--r--src/mongo/db/op_observer_impl.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/mongo/db/op_observer_impl.cpp b/src/mongo/db/op_observer_impl.cpp
index fe9442e559b..35cfdb77237 100644
--- a/src/mongo/db/op_observer_impl.cpp
+++ b/src/mongo/db/op_observer_impl.cpp
@@ -910,24 +910,25 @@ void OpObserverImpl::onTransactionCommit(OperationContext* opCtx) {
if (stmts.empty())
return;
- BSONObjBuilder applyOpsBuilder;
- BSONArrayBuilder opsArray(applyOpsBuilder.subarrayStart("applyOps"_sd));
- for (auto& stmt : stmts) {
- opsArray.append(stmt.toBSON());
- }
- opsArray.done();
- const NamespaceString cmdNss{"admin", "$cmd"};
+ try {
+ BSONObjBuilder applyOpsBuilder;
+ BSONArrayBuilder opsArray(applyOpsBuilder.subarrayStart("applyOps"_sd));
+ for (auto& stmt : stmts) {
+ opsArray.append(stmt.toBSON());
+ }
+ opsArray.done();
+ const NamespaceString cmdNss{"admin", "$cmd"};
- OperationSessionInfo sessionInfo;
- repl::OplogLink oplogLink;
- sessionInfo.setSessionId(*opCtx->getLogicalSessionId());
- sessionInfo.setTxnNumber(*opCtx->getTxnNumber());
- StmtId stmtId(0);
- oplogLink.prevOpTime = session->getLastWriteOpTime(*opCtx->getTxnNumber());
- // Until we support multiple oplog entries per transaction, prevOpTime should always be null.
- invariant(oplogLink.prevOpTime.isNull());
+ OperationSessionInfo sessionInfo;
+ repl::OplogLink oplogLink;
+ sessionInfo.setSessionId(*opCtx->getLogicalSessionId());
+ sessionInfo.setTxnNumber(*opCtx->getTxnNumber());
+ StmtId stmtId(0);
+ oplogLink.prevOpTime = session->getLastWriteOpTime(*opCtx->getTxnNumber());
+ // Until we support multiple oplog entries per transaction, prevOpTime should always be
+ // null.
+ invariant(oplogLink.prevOpTime.isNull());
- try {
auto applyOpCmd = applyOpsBuilder.done();
auto times = replLogApplyOps(opCtx, cmdNss, applyOpCmd, sessionInfo, stmtId, oplogLink);