summaryrefslogtreecommitdiff
path: root/src/mongo/db/initialize_operation_session_info.cpp
diff options
context:
space:
mode:
authorSiyuan Zhou <siyuan.zhou@mongodb.com>2018-04-11 16:29:03 -0400
committerSiyuan Zhou <siyuan.zhou@mongodb.com>2018-04-13 17:28:37 -0400
commit4174e073c93e6023c4ba6243d60e40f30f809d52 (patch)
tree66213b8726b5536511c7c14e4250b0378aeed8d9 /src/mongo/db/initialize_operation_session_info.cpp
parent0c2990eb8780ee3d46b6d73ad3a43013943fc2c4 (diff)
downloadmongo-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.cpp32
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;