summaryrefslogtreecommitdiff
path: root/src/mongo/db/session.cpp
diff options
context:
space:
mode:
authorNathan Louie <nathan.louie@10gen.com>2018-08-16 16:17:59 -0400
committerjinichu <jinnybyun@gmail.com>2018-08-16 16:17:59 -0400
commitbfa31257c2f5323e3bf80ffa3c3b870bdd83cb2a (patch)
tree144c1d7a671781f91d523134daa9b10929fea7c9 /src/mongo/db/session.cpp
parent19557f15faed29927ee770b6bbf3180fbfff24b7 (diff)
downloadmongo-bfa31257c2f5323e3bf80ffa3c3b870bdd83cb2a.tar.gz
SERVER-35432 Add a method for printing out information about a slow transaction
(cherry picked from commit cdc82971d30cbac5115c532e8d296ba74aebb204)
Diffstat (limited to 'src/mongo/db/session.cpp')
-rw-r--r--src/mongo/db/session.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/mongo/db/session.cpp b/src/mongo/db/session.cpp
index 84c1d869a4a..80663b88a55 100644
--- a/src/mongo/db/session.cpp
+++ b/src/mongo/db/session.cpp
@@ -1158,6 +1158,54 @@ void Session::_reportTransactionStats(WithLock wl,
}
}
+std::string Session::transactionInfoForLog(const SingleThreadedLockStats* lockStats) {
+ // Need to lock because this function checks the state of _txnState.
+ stdx::lock_guard<stdx::mutex> lg(_mutex);
+
+ invariant(lockStats);
+ invariant(_txnState.isCommitted(lg) || _txnState.isAborted(lg));
+
+ StringBuilder s;
+
+ // User specified transaction parameters.
+ BSONObjBuilder parametersBuilder;
+ BSONObjBuilder lsidBuilder(parametersBuilder.subobjStart("lsid"));
+ _sessionId.serialize(&lsidBuilder);
+ lsidBuilder.doneFast();
+ parametersBuilder.append("txnNumber", _activeTxnNumber);
+ // TODO: SERVER-35174 Add readConcern to parameters here once pushed.
+ parametersBuilder.append("autocommit", _autocommit);
+ s << "parameters:" << parametersBuilder.obj().toString() << ",";
+
+ s << " readTimestamp:" << _speculativeTransactionReadOpTime.getTimestamp().toString() << ",";
+
+ s << _singleTransactionStats->getOpDebug()->additiveMetrics.report();
+
+ std::string terminationCause = _txnState.isCommitted(lg) ? "committed" : "aborted";
+ s << " terminationCause:" << terminationCause;
+
+ auto curTime = curTimeMicros64();
+ s << " timeActiveMicros:"
+ << durationCount<Microseconds>(_singleTransactionStats->getTimeActiveMicros(curTime));
+ s << " timeInactiveMicros:"
+ << durationCount<Microseconds>(_singleTransactionStats->getTimeInactiveMicros(curTime));
+
+ // Number of yields is always 0 in multi-document transactions, but it is included mainly to
+ // match the format with other slow operation logging messages.
+ s << " numYields:" << 0;
+
+ // Aggregate lock statistics.
+ BSONObjBuilder locks;
+ lockStats->report(&locks);
+ s << " locks:" << locks.obj().toString();
+
+ // Total duration of the transaction.
+ s << " "
+ << Milliseconds{static_cast<long long>(_singleTransactionStats->getDuration(curTime)) / 1000};
+
+ return s.str();
+}
+
void Session::_checkValid(WithLock) const {
uassert(ErrorCodes::ConflictingOperationInProgress,
str::stream() << "Session " << getSessionId()