summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2019-04-20 22:06:29 -0400
committerLingzhi Deng <lingzhi.deng@mongodb.com>2019-04-20 22:06:29 -0400
commit79e114f8da21cf6af58fe34a46adc1aed9897ca3 (patch)
treea2a166a67f8d73f216b159312e0c0237f51a041b
parent43fb7ff820793bcc94e160133cc1dacd12bec1c8 (diff)
downloadmongo-79e114f8da21cf6af58fe34a46adc1aed9897ca3.tar.gz
SERVER-40329: Log all transactions at TXN verbosity levels >= 1
-rw-r--r--src/mongo/db/session.cpp5
-rw-r--r--src/mongo/db/session_test.cpp55
2 files changed, 58 insertions, 2 deletions
diff --git a/src/mongo/db/session.cpp b/src/mongo/db/session.cpp
index 8757d733ccd..03acd548174 100644
--- a/src/mongo/db/session.cpp
+++ b/src/mongo/db/session.cpp
@@ -1366,8 +1366,9 @@ void Session::_logSlowTransaction(WithLock wl,
// Only log multi-document transactions.
if (_txnState != MultiDocumentTransactionState::kNone) {
// Log the transaction if its duration is longer than the slowMS command threshold.
- if (_singleTransactionStats.getDuration(curTimeMicros64()) >
- serverGlobalParams.slowMS * 1000ULL) {
+ if (shouldLog(logger::LogComponent::kTransaction, logger::LogSeverity::Debug(1)) ||
+ _singleTransactionStats.getDuration(curTimeMicros64()) >
+ serverGlobalParams.slowMS * 1000ULL) {
log(logger::LogComponent::kTransaction)
<< "transaction "
<< _transactionInfoForLog(lockStats, terminationCause, readConcernArgs);
diff --git a/src/mongo/db/session_test.cpp b/src/mongo/db/session_test.cpp
index 6b23812169d..47a09b35759 100644
--- a/src/mongo/db/session_test.cpp
+++ b/src/mongo/db/session_test.cpp
@@ -43,6 +43,7 @@
#include "mongo/db/service_context.h"
#include "mongo/db/session_catalog.h"
#include "mongo/db/stats/fill_locker_info.h"
+#include "mongo/logger/logger.h"
#include "mongo/stdx/future.h"
#include "mongo/stdx/memory.h"
#include "mongo/unittest/death_test.h"
@@ -2652,5 +2653,59 @@ TEST_F(TransactionsMetricsTest, LogTransactionInfoAfterSlowStashedAbort) {
ASSERT_EQUALS(1, countLogLinesContaining(expectedTransactionInfo));
}
+TEST_F(TransactionsMetricsTest, LogTransactionInfoVerbosityInfo) {
+ const auto sessionId = makeLogicalSessionIdForTest();
+ Session session(sessionId);
+ session.refreshFromStorageIfNeeded(opCtx());
+
+ const TxnNumber txnNum = 1;
+ opCtx()->setLogicalSessionId(sessionId);
+ opCtx()->setTxnNumber(txnNum);
+
+ // Set a high slow operation threshold to avoid the transaction being logged as slow.
+ serverGlobalParams.slowMS = 10000;
+
+ // Set verbosity level of transaction components to info.
+ logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogComponent::kTransaction,
+ logger::LogSeverity::Info());
+
+ session.beginOrContinueTxn(opCtx(), txnNum, false, true, "admin", "commitTransaction");
+ session.unstashTransactionResources(opCtx(), "commitTransaction");
+
+ startCapturingLogMessages();
+ session.commitTransaction(opCtx());
+ stopCapturingLogMessages();
+
+ // Test that the transaction is not logged.
+ ASSERT_EQUALS(0, countLogLinesContaining("transaction parameters"));
+}
+
+TEST_F(TransactionsMetricsTest, LogTransactionInfoVerbosityDebug) {
+ const auto sessionId = makeLogicalSessionIdForTest();
+ Session session(sessionId);
+ session.refreshFromStorageIfNeeded(opCtx());
+
+ const TxnNumber txnNum = 1;
+ opCtx()->setLogicalSessionId(sessionId);
+ opCtx()->setTxnNumber(txnNum);
+
+ // Set a high slow operation threshold to avoid the transaction being logged as slow.
+ serverGlobalParams.slowMS = 10000;
+
+ // Set verbosity level of transaction components to debug.
+ logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogComponent::kTransaction,
+ logger::LogSeverity::Debug(1));
+
+ session.beginOrContinueTxn(opCtx(), txnNum, false, true, "admin", "commitTransaction");
+ session.unstashTransactionResources(opCtx(), "commitTransaction");
+
+ startCapturingLogMessages();
+ session.commitTransaction(opCtx());
+ stopCapturingLogMessages();
+
+ // Test that the transaction is still logged.
+ ASSERT_EQUALS(1, countLogLinesContaining("transaction parameters"));
+}
+
} // namespace
} // namespace mongo