summaryrefslogtreecommitdiff
path: root/src/mongo/db/initialize_operation_session_info.cpp
diff options
context:
space:
mode:
authorJason Carey <jcarey@argv.me>2017-08-22 17:03:04 -0400
committerJason Carey <jcarey@argv.me>2017-08-23 16:12:10 -0400
commitb2b2827fcf61c8da62b621778b50a0ac414951b1 (patch)
treefe96d8eda2208ebbf76ae6a72b2d38a3cfc9bdcb /src/mongo/db/initialize_operation_session_info.cpp
parent7081a76ac2965bd765b6c372581c81f63c9e6b3c (diff)
downloadmongo-b2b2827fcf61c8da62b621778b50a0ac414951b1.tar.gz
SERVER-30782 setting lsid must take the clientlock
initializeOperationSessionInfo is called without the client lock, which can cause it to do dirty partial writes to sessionId and txnNumber. This can cause data races with readers operating under the lock, causing them to see partial writes. This takes the lock around writes, which should solve the races.
Diffstat (limited to 'src/mongo/db/initialize_operation_session_info.cpp')
-rw-r--r--src/mongo/db/initialize_operation_session_info.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/mongo/db/initialize_operation_session_info.cpp b/src/mongo/db/initialize_operation_session_info.cpp
index e448b23b145..f231848c2bf 100644
--- a/src/mongo/db/initialize_operation_session_info.cpp
+++ b/src/mongo/db/initialize_operation_session_info.cpp
@@ -46,6 +46,8 @@ void initializeOperationSessionInfo(OperationContext* opCtx,
auto osi = OperationSessionInfoFromClient::parse("OperationSessionInfo"_sd, requestBody);
if (osi.getSessionId()) {
+ stdx::lock_guard<Client> lk(*opCtx->getClient());
+
opCtx->setLogicalSessionId(makeLogicalSessionId(osi.getSessionId().get(), opCtx));
LogicalSessionCache* lsc = LogicalSessionCache::get(opCtx->getServiceContext());
@@ -53,6 +55,8 @@ void initializeOperationSessionInfo(OperationContext* opCtx,
}
if (osi.getTxnNumber()) {
+ stdx::lock_guard<Client> lk(*opCtx->getClient());
+
uassert(ErrorCodes::IllegalOperation,
"Transaction number requires a sessionId to be specified",
opCtx->getLogicalSessionId());