diff options
author | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2018-04-11 16:29:03 -0400 |
---|---|---|
committer | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2018-04-13 17:28:37 -0400 |
commit | 4174e073c93e6023c4ba6243d60e40f30f809d52 (patch) | |
tree | 66213b8726b5536511c7c14e4250b0378aeed8d9 /src/mongo/db/initialize_operation_session_info.cpp | |
parent | 0c2990eb8780ee3d46b6d73ad3a43013943fc2c4 (diff) | |
download | mongo-4174e073c93e6023c4ba6243d60e40f30f809d52.tar.gz |
SERVER-34184 Trasnsaction fields are not accepted unless their preconditinal fileds are given.
Diffstat (limited to 'src/mongo/db/initialize_operation_session_info.cpp')
-rw-r--r-- | src/mongo/db/initialize_operation_session_info.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/mongo/db/initialize_operation_session_info.cpp b/src/mongo/db/initialize_operation_session_info.cpp index 5a83f9b7880..d76dc197c16 100644 --- a/src/mongo/db/initialize_operation_session_info.cpp +++ b/src/mongo/db/initialize_operation_session_info.cpp @@ -68,32 +68,50 @@ boost::optional<OperationSessionInfoFromClient> initializeOperationSessionInfo( LogicalSessionCache* lsc = LogicalSessionCache::get(opCtx->getServiceContext()); lsc->vivify(opCtx, opCtx->getLogicalSessionId().get()); + } else { + uassert(ErrorCodes::InvalidOptions, + "Transaction number requires a session ID to also be specified", + !osi.getTxnNumber()); } if (osi.getTxnNumber()) { + invariant(osi.getSessionId()); stdx::lock_guard<Client> lk(*opCtx->getClient()); uassert(ErrorCodes::IllegalOperation, - "Transaction number requires a sessionId to be specified", - opCtx->getLogicalSessionId()); - uassert(ErrorCodes::IllegalOperation, "Transaction numbers are only allowed on a replica set member or mongos", isReplSetMemberOrMongos); uassert(ErrorCodes::IllegalOperation, "Transaction numbers are only allowed on storage engines that support " "document-level locking", supportsDocLocking); - uassert(ErrorCodes::BadValue, + uassert(ErrorCodes::InvalidOptions, "Transaction number cannot be negative", *osi.getTxnNumber() >= 0); opCtx->setTxnNumber(*osi.getTxnNumber()); + } else { + uassert(ErrorCodes::InvalidOptions, + "'autocommit' field requires a transaction number to also be specified", + !osi.getAutocommit()); } if (osi.getAutocommit()) { - uassert(ErrorCodes::IllegalOperation, - "Autocommit requires a transaction number to be specified", - opCtx->getTxnNumber()); + invariant(osi.getTxnNumber()); + uassert(ErrorCodes::InvalidOptions, + "Specifying autocommit=true is not allowed.", + !osi.getAutocommit().value()); + } else { + uassert(ErrorCodes::InvalidOptions, + "'startTransaction' field requires 'autocommit' field to also be specified", + !osi.getStartTransaction()); + } + + if (osi.getStartTransaction()) { + invariant(osi.getAutocommit()); + uassert(ErrorCodes::InvalidOptions, + "Specifying startTransaction=false is not allowed.", + osi.getStartTransaction().value()); } return osi; |