diff options
author | Jason Carey <jcarey@argv.me> | 2017-08-22 17:03:04 -0400 |
---|---|---|
committer | Jason Carey <jcarey@argv.me> | 2017-08-23 16:12:10 -0400 |
commit | b2b2827fcf61c8da62b621778b50a0ac414951b1 (patch) | |
tree | fe96d8eda2208ebbf76ae6a72b2d38a3cfc9bdcb /src/mongo/db/initialize_operation_session_info.cpp | |
parent | 7081a76ac2965bd765b6c372581c81f63c9e6b3c (diff) | |
download | mongo-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.cpp | 4 |
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()); |