summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEsha Maharishi <esha.maharishi@mongodb.com>2019-05-31 03:43:48 -0400
committerEsha Maharishi <esha.maharishi@mongodb.com>2019-06-13 18:52:26 -0400
commit678d1aea998bf69b0ccfd84ca4880b8e621e0f0d (patch)
tree26df285aa8b6a725738fa80c6ad48c8454c8de89
parent82e3d0d24e2e65c8ac88149b918c2af9bcc0528e (diff)
downloadmongo-678d1aea998bf69b0ccfd84ca4880b8e621e0f0d.tar.gz
SERVER-40986 Include relevant server-wide two phase commit metrics on mongod for serverStatus
-rw-r--r--buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml1
-rw-r--r--jstests/sharding/txn_two_phase_commit_server_status.js19
-rw-r--r--src/mongo/db/s/SConscript3
-rw-r--r--src/mongo/db/s/server_transaction_coordinators_metrics.cpp23
-rw-r--r--src/mongo/db/s/server_transaction_coordinators_metrics.h19
-rw-r--r--src/mongo/db/s/transaction_coordinator_test.cpp61
-rw-r--r--src/mongo/db/s/transaction_coordinators_stats.idl70
7 files changed, 196 insertions, 0 deletions
diff --git a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
index 10f2b52c83a..e0dd0edab39 100644
--- a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
+++ b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
@@ -118,6 +118,7 @@ selector:
- jstests/sharding/txn_two_phase_commit_coordinator_shutdown_and_restart.js
- jstests/sharding/txn_two_phase_commit_failover.js
- jstests/sharding/txn_two_phase_commit_killop.js
+ - jstests/sharding/txn_two_phase_commit_server_status.js
- jstests/sharding/txn_recover_decision_using_recovery_router.js
- jstests/sharding/txn_two_phase_commit_wait_for_majority_commit_after_stepup.js
- jstests/sharding/txn_commit_optimizations_for_read_only_shards.js
diff --git a/jstests/sharding/txn_two_phase_commit_server_status.js b/jstests/sharding/txn_two_phase_commit_server_status.js
new file mode 100644
index 00000000000..7af87314fc1
--- /dev/null
+++ b/jstests/sharding/txn_two_phase_commit_server_status.js
@@ -0,0 +1,19 @@
+// Basic test that the two-phase commit coordinator metrics fields appear in serverStatus output.
+(function() {
+ "use strict";
+
+ const st = new ShardingTest({shards: 1, config: 1});
+
+ const res = assert.commandWorked(st.shard0.adminCommand({serverStatus: 1}));
+ assert.neq(null, res.twoPhaseCommitCoordinator);
+ assert.eq(0, res.twoPhaseCommitCoordinator.totalCreated);
+ assert.eq(0, res.twoPhaseCommitCoordinator.totalStartedTwoPhaseCommit);
+ assert.neq(null, res.twoPhaseCommitCoordinator.currentInSteps);
+ assert.eq(0, res.twoPhaseCommitCoordinator.currentInSteps.writingParticipantList);
+ assert.eq(0, res.twoPhaseCommitCoordinator.currentInSteps.waitingForVotes);
+ assert.eq(0, res.twoPhaseCommitCoordinator.currentInSteps.writingDecision);
+ assert.eq(0, res.twoPhaseCommitCoordinator.currentInSteps.waitingForDecisionAcks);
+ assert.eq(0, res.twoPhaseCommitCoordinator.currentInSteps.deletingCoordinatorDoc);
+
+ st.stop();
+})();
diff --git a/src/mongo/db/s/SConscript b/src/mongo/db/s/SConscript
index be69b3fbcac..6d89971d298 100644
--- a/src/mongo/db/s/SConscript
+++ b/src/mongo/db/s/SConscript
@@ -132,9 +132,11 @@ env.Library(
'transaction_coordinator_util.cpp',
'transaction_coordinator.cpp',
env.Idlc('transaction_coordinator_document.idl')[0],
+ env.Idlc('transaction_coordinators_stats.idl')[0],
],
LIBDEPS_PRIVATE=[
'$BUILD_DIR/mongo/db/transaction',
+ '$BUILD_DIR/mongo/db/commands/server_status',
'$BUILD_DIR/mongo/db/commands/txn_cmd_request',
'$BUILD_DIR/mongo/db/dbdirectclient',
'$BUILD_DIR/mongo/db/rw_concern_d',
@@ -428,6 +430,7 @@ env.CppUnitTest(
],
LIBDEPS=[
'$BUILD_DIR/mongo/db/auth/authmocks',
+ '$BUILD_DIR/mongo/db/commands/server_status',
'$BUILD_DIR/mongo/s/catalog/sharding_catalog_client_mock',
'$BUILD_DIR/mongo/s/shard_server_test_fixture',
'transaction_coordinator',
diff --git a/src/mongo/db/s/server_transaction_coordinators_metrics.cpp b/src/mongo/db/s/server_transaction_coordinators_metrics.cpp
index 5bac2c5c211..ef769c441ee 100644
--- a/src/mongo/db/s/server_transaction_coordinators_metrics.cpp
+++ b/src/mongo/db/s/server_transaction_coordinators_metrics.cpp
@@ -35,6 +35,9 @@
#include "mongo/db/service_context.h"
namespace mongo {
+
+TransactionCoordinatorsSSS transactionCoordinatorsSSS;
+
namespace {
const auto ServerTransactionCoordinatorsMetricsDecoration =
ServiceContext::declareDecoration<ServerTransactionCoordinatorsMetrics>();
@@ -114,4 +117,24 @@ void ServerTransactionCoordinatorsMetrics::decrementCurrentDeletingCoordinatorDo
_totalDeletingCoordinatorDoc.fetchAndSubtract(1);
}
+void ServerTransactionCoordinatorsMetrics::updateStats(TransactionCoordinatorsStats* stats) {
+ stats->setTotalCreated(_totalCreated.load());
+ stats->setTotalStartedTwoPhaseCommit(_totalStartedTwoPhaseCommit.load());
+
+ CurrentInSteps currentInSteps;
+ currentInSteps.setWritingParticipantList(_totalWritingParticipantList.load());
+ currentInSteps.setWaitingForVotes(_totalWaitingForVotes.load());
+ currentInSteps.setWritingDecision(_totalWritingDecision.load());
+ currentInSteps.setWaitingForDecisionAcks(_totalWaitingForDecisionAcks.load());
+ currentInSteps.setDeletingCoordinatorDoc(_totalDeletingCoordinatorDoc.load());
+ stats->setCurrentInSteps(currentInSteps);
+}
+
+BSONObj TransactionCoordinatorsSSS::generateSection(OperationContext* opCtx,
+ const BSONElement& configElement) const {
+ TransactionCoordinatorsStats stats;
+ ServerTransactionCoordinatorsMetrics::get(opCtx)->updateStats(&stats);
+ return stats.toBSON();
+}
+
} // namespace mongo
diff --git a/src/mongo/db/s/server_transaction_coordinators_metrics.h b/src/mongo/db/s/server_transaction_coordinators_metrics.h
index 9218e5584b4..4fcff15b785 100644
--- a/src/mongo/db/s/server_transaction_coordinators_metrics.h
+++ b/src/mongo/db/s/server_transaction_coordinators_metrics.h
@@ -29,7 +29,9 @@
#pragma once
+#include "mongo/db/commands/server_status.h"
#include "mongo/db/operation_context.h"
+#include "mongo/db/s/transaction_coordinators_stats_gen.h"
#include "mongo/db/service_context.h"
namespace mongo {
@@ -74,6 +76,11 @@ public:
void incrementCurrentDeletingCoordinatorDoc();
void decrementCurrentDeletingCoordinatorDoc();
+ /**
+ * Appends the accumulated stats to a transaction coordinators stats object for reporting.
+ */
+ void updateStats(TransactionCoordinatorsStats* stats);
+
private:
// The total number of transaction coordinators created on this process since the process's
// inception.
@@ -99,4 +106,16 @@ private:
AtomicWord<std::int64_t> _totalDeletingCoordinatorDoc{0};
};
+class TransactionCoordinatorsSSS final : public ServerStatusSection {
+public:
+ TransactionCoordinatorsSSS() : ServerStatusSection("twoPhaseCommitCoordinator") {}
+
+ bool includeByDefault() const override {
+ return true;
+ }
+
+ BSONObj generateSection(OperationContext* opCtx,
+ const BSONElement& configElement) const override;
+};
+
} // namespace mongo
diff --git a/src/mongo/db/s/transaction_coordinator_test.cpp b/src/mongo/db/s/transaction_coordinator_test.cpp
index 31ac6201fb7..215e315fc97 100644
--- a/src/mongo/db/s/transaction_coordinator_test.cpp
+++ b/src/mongo/db/s/transaction_coordinator_test.cpp
@@ -35,6 +35,7 @@
#include "mongo/db/commands/txn_cmds_gen.h"
#include "mongo/db/commands/txn_two_phase_commit_cmds_gen.h"
#include "mongo/db/dbdirectclient.h"
+#include "mongo/db/s/server_transaction_coordinators_metrics.h"
#include "mongo/db/s/transaction_coordinator_document_gen.h"
#include "mongo/db/s/transaction_coordinator_metrics_observer.h"
#include "mongo/db/s/transaction_coordinator_test_fixture.h"
@@ -971,6 +972,28 @@ public:
metrics()->getCurrentDeletingCoordinatorDoc());
}
+ void checkServerStatus() {
+ TransactionCoordinatorsSSS tcsss;
+ BSONElement dummy;
+ const auto serverStatusSection = tcsss.generateSection(operationContext(), dummy);
+ ASSERT_EQ(metrics()->getTotalCreated(), serverStatusSection["totalCreated"].Long());
+ ASSERT_EQ(metrics()->getTotalStartedTwoPhaseCommit(),
+ serverStatusSection["totalStartedTwoPhaseCommit"].Long());
+ ASSERT_EQ(
+ metrics()->getCurrentWritingParticipantList(),
+ serverStatusSection.getObjectField("currentInSteps")["writingParticipantList"].Long());
+ ASSERT_EQ(metrics()->getCurrentWaitingForVotes(),
+ serverStatusSection.getObjectField("currentInSteps")["waitingForVotes"].Long());
+ ASSERT_EQ(metrics()->getCurrentWritingDecision(),
+ serverStatusSection.getObjectField("currentInSteps")["writingDecision"].Long());
+ ASSERT_EQ(
+ metrics()->getCurrentWaitingForDecisionAcks(),
+ serverStatusSection.getObjectField("currentInSteps")["waitingForDecisionAcks"].Long());
+ ASSERT_EQ(
+ metrics()->getCurrentDeletingCoordinatorDoc(),
+ serverStatusSection.getObjectField("currentInSteps")["deletingCoordinatorDoc"].Long());
+ }
+
Date_t advanceClockSourceAndReturnNewNow() {
const auto newNow = Date_t::now();
clockSource()->reset(newNow);
@@ -2101,5 +2124,43 @@ TEST_F(TransactionCoordinatorMetricsTest, SlowLogLineIncludesStepDurationsAndTot
ASSERT_EQUALS(1, countLogLinesContaining(" 500ms\n") + countLogLinesContaining(" 500ms\r\n"));
}
+TEST_F(TransactionCoordinatorMetricsTest, ServerStatusSectionIncludesTotalCreated) {
+ metrics()->incrementTotalCreated();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest, ServerStatusSectionIncludesTotalStartedTwoPhaseCommit) {
+ metrics()->incrementTotalStartedTwoPhaseCommit();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest,
+ ServerStatusSectionIncludesCurrentWritingParticipantList) {
+ metrics()->incrementCurrentWritingParticipantList();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest, ServerStatusSectionIncludesCurrentWaitingForVotes) {
+ metrics()->incrementCurrentWaitingForVotes();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest, ServerStatusSectionIncludesCurrentWritingDecision) {
+ metrics()->incrementCurrentWritingDecision();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest,
+ ServerStatusSectionIncludesCurrentWaitingForDecisionAcks) {
+ metrics()->incrementCurrentWaitingForDecisionAcks();
+ checkServerStatus();
+}
+
+TEST_F(TransactionCoordinatorMetricsTest,
+ ServerStatusSectionIncludesCurrentDeletingCoordinatorDoc) {
+ metrics()->incrementCurrentDeletingCoordinatorDoc();
+ checkServerStatus();
+}
+
} // namespace
} // namespace mongo
diff --git a/src/mongo/db/s/transaction_coordinators_stats.idl b/src/mongo/db/s/transaction_coordinators_stats.idl
new file mode 100644
index 00000000000..7b1a9132536
--- /dev/null
+++ b/src/mongo/db/s/transaction_coordinators_stats.idl
@@ -0,0 +1,70 @@
+# Copyright (C) 2019-present MongoDB, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the Server Side Public License, version 1,
+# as published by MongoDB, Inc.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# Server Side Public License for more details.
+#
+# You should have received a copy of the Server Side Public License
+# along with this program. If not, see
+# <http://www.mongodb.com/licensing/server-side-public-license>.
+#
+# As a special exception, the copyright holders give permission to link the
+# code of portions of this program with the OpenSSL library under certain
+# conditions as described in each individual source file and distribute
+# linked combinations including the program with the OpenSSL library. You
+# must comply with the Server Side Public License in all respects for
+# all of the code used other than as permitted herein. If you modify file(s)
+# with this exception, you may extend this exception to your version of the
+# file(s), but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version. If you delete this
+# exception statement from all source files in the program, then also delete
+# it in the license file.
+#
+
+global:
+ cpp_namespace: "mongo"
+
+imports:
+ - "mongo/idl/basic_types.idl"
+
+structs:
+
+ CurrentInSteps:
+ description: "A struct describing the number of transaction coordinators currently in each
+ two-phase commit step"
+ strict: true
+ fields:
+ writingParticipantList:
+ type: long
+ default: 0
+ waitingForVotes:
+ type: long
+ default: 0
+ writingDecision:
+ type: long
+ default: 0
+ waitingForDecisionAcks:
+ type: long
+ default: 0
+ deletingCoordinatorDoc:
+ type: long
+ default: 0
+
+ TransactionCoordinatorsStats:
+ description: "A struct representing the section of the server status
+ command with information about transaction coordinators"
+ strict: true
+ fields:
+ totalCreated:
+ type: long
+ default: 0
+ totalStartedTwoPhaseCommit:
+ type: long
+ default: 0
+ currentInSteps:
+ type: CurrentInSteps