summaryrefslogtreecommitdiff
path: root/src/mongo/db/session.cpp
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2017-07-24 15:52:16 -0400
committerJack Mulrow <jack.mulrow@mongodb.com>2017-07-31 14:18:29 -0400
commit0a55ace0a362a5944fedbaec2d95b2d7cda750d6 (patch)
treefe13ddca99d37111ec5f7f32fc66146d82106d5f /src/mongo/db/session.cpp
parentf305e8262eb4403e2ca1aaf7a5fa9adf9a80fdc7 (diff)
downloadmongo-0a55ace0a362a5944fedbaec2d95b2d7cda750d6.tar.gz
SERVER-30262 Update session info during batch apply in secondaries
Diffstat (limited to 'src/mongo/db/session.cpp')
-rw-r--r--src/mongo/db/session.cpp26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/mongo/db/session.cpp b/src/mongo/db/session.cpp
index 0811996eb8f..242d549ed0a 100644
--- a/src/mongo/db/session.cpp
+++ b/src/mongo/db/session.cpp
@@ -63,15 +63,15 @@ boost::optional<SessionTxnRecord> loadSessionRecord(OperationContext* opCtx,
return SessionTxnRecord::parse(ctx, result);
}
-/**
- * Update the txnNum of the session record. Will create a new entry if the record with
- * corresponding sessionId does not exist.
- */
-void updateSessionRecordTxnNum(OperationContext* opCtx,
- const LogicalSessionId& sessionId,
- const TxnNumber& txnNum) {
+} // namespace
+
+Session::Session(LogicalSessionId sessionId) : _sessionId(std::move(sessionId)) {}
+
+void Session::updateSessionRecord(OperationContext* opCtx,
+ const LogicalSessionId& sessionId,
+ const TxnNumber& txnNum,
+ const Timestamp& ts) {
repl::UnreplicatedWritesBlock doNotReplicateWrites(opCtx);
- Timestamp zeroTs;
AutoGetCollection autoColl(opCtx, NamespaceString::kSessionTransactionsTableNamespace, MODE_IX);
uassert(40526,
@@ -86,7 +86,7 @@ void updateSessionRecordTxnNum(OperationContext* opCtx,
updateRequest.setUpdates(BSON("$set" << BSON(SessionTxnRecord::kTxnNumFieldName
<< txnNum
<< SessionTxnRecord::kLastWriteOpTimeTsFieldName
- << zeroTs)));
+ << ts)));
updateRequest.setUpsert(true);
auto updateResult = update(opCtx, autoColl.getDb(), updateRequest);
@@ -95,10 +95,6 @@ void updateSessionRecordTxnNum(OperationContext* opCtx,
updateResult.numDocsModified >= 1 || !updateResult.upserted.isEmpty());
}
-} // namespace
-
-Session::Session(LogicalSessionId sessionId) : _sessionId(std::move(sessionId)) {}
-
void Session::begin(OperationContext* opCtx, const TxnNumber& txnNumber) {
invariant(!opCtx->lockState()->isLocked());
invariant(!opCtx->lockState()->inAWriteUnitOfWork());
@@ -109,7 +105,7 @@ void Session::begin(OperationContext* opCtx, const TxnNumber& txnNumber) {
// Previous read failed to retrieve the txn record, which means it does not exist yet,
// so create a new entry.
if (!_txnRecord) {
- updateSessionRecordTxnNum(opCtx, _sessionId, txnNumber);
+ updateSessionRecord(opCtx, _sessionId, txnNumber, Timestamp());
_txnRecord.emplace();
_txnRecord->setSessionId(_sessionId);
@@ -129,7 +125,7 @@ void Session::begin(OperationContext* opCtx, const TxnNumber& txnNumber) {
_txnRecord->getTxnNum() <= txnNumber);
if (txnNumber > _txnRecord->getTxnNum()) {
- updateSessionRecordTxnNum(opCtx, _sessionId, txnNumber);
+ updateSessionRecord(opCtx, _sessionId, txnNumber, Timestamp());
_txnRecord->setTxnNum(txnNumber);
_txnRecord->setLastWriteOpTimeTs(Timestamp());
}