diff options
author | Nathan Louie <nathan.louie@10gen.com> | 2018-08-16 16:17:59 -0400 |
---|---|---|
committer | jinichu <jinnybyun@gmail.com> | 2018-08-16 16:17:59 -0400 |
commit | bfa31257c2f5323e3bf80ffa3c3b870bdd83cb2a (patch) | |
tree | 144c1d7a671781f91d523134daa9b10929fea7c9 /src/mongo/db/session.cpp | |
parent | 19557f15faed29927ee770b6bbf3180fbfff24b7 (diff) | |
download | mongo-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.cpp | 48 |
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() |