summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2022-04-22 21:15:14 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-22 22:13:00 +0000
commit5e9dcbad6a8b7f1443c824c3bd9d3498cfeae334 (patch)
tree4a992508b01575136640a39e816ed1d37bd29c4d /src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp
parent8330369765ad317d27f05277877be521bdb921de (diff)
downloadmongo-5e9dcbad6a8b7f1443c824c3bd9d3498cfeae334.tar.gz
SERVER-64386 Track and Report New Coordinator Fields in ServerStatus
Diffstat (limited to 'src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp')
-rw-r--r--src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp106
1 files changed, 98 insertions, 8 deletions
diff --git a/src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp b/src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp
index 9e53bfd346b..877aca139fd 100644
--- a/src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp
+++ b/src/mongo/db/s/sharding_data_transform_cumulative_metrics.cpp
@@ -29,6 +29,7 @@
#include "mongo/db/s/sharding_data_transform_cumulative_metrics.h"
#include "mongo/util/assert_util.h"
+#include <cstdint>
namespace mongo {
@@ -132,6 +133,7 @@ const auto getMetrics = ServiceContext::declareDecoration<MetricsPtr>();
const auto metricsRegisterer = ServiceContext::ConstructorActionRegisterer{
"ShardingDataTransformMetrics",
[](ServiceContext* ctx) { getMetrics(ctx) = std::make_unique<Metrics>(); }};
+
} // namespace
ShardingDataTransformCumulativeMetrics* ShardingDataTransformCumulativeMetrics::getForResharding(
@@ -150,7 +152,15 @@ ShardingDataTransformCumulativeMetrics::ShardingDataTransformCumulativeMetrics(
const std::string& rootSectionName)
: _rootSectionName{rootSectionName},
_instanceMetricsForAllRoles(ShardingDataTransformMetrics::kRoleCount),
- _operationWasAttempted{false} {}
+ _operationWasAttempted{false},
+ _coordinatorStateList{AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0},
+ AtomicWord<int64_t>{0}} {}
ShardingDataTransformCumulativeMetrics::DeregistrationFunction
ShardingDataTransformCumulativeMetrics::registerInstanceMetrics(const InstanceObserver* metrics) {
@@ -253,13 +263,19 @@ void ShardingDataTransformCumulativeMetrics::reportLatencies(BSONObjBuilder* bob
void ShardingDataTransformCumulativeMetrics::reportCurrentInSteps(BSONObjBuilder* bob) const {
BSONObjBuilder s(bob->subobjStart(kCurrentInSteps));
- s.append(kCountInstancesInCoordinatorState1Initializing, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState2PreparingToDonate, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState3Cloning, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState4Applying, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState5BlockingWrites, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState6Aborting, kPlaceholderInt);
- s.append(kCountInstancesInCoordinatorState7Committing, kPlaceholderInt);
+
+ auto reportCoordinatorState = [this, &s](auto state) {
+ s.append(fieldNameFor(state), getCoordinatorStateCounter(state)->load());
+ };
+
+ reportCoordinatorState(CoordinatorStateEnum::kInitializing);
+ reportCoordinatorState(CoordinatorStateEnum::kPreparingToDonate);
+ reportCoordinatorState(CoordinatorStateEnum::kCloning);
+ reportCoordinatorState(CoordinatorStateEnum::kApplying);
+ reportCoordinatorState(CoordinatorStateEnum::kBlockingWrites);
+ reportCoordinatorState(CoordinatorStateEnum::kAborting);
+ reportCoordinatorState(CoordinatorStateEnum::kCommitting);
+
s.append(kCountInstancesInRecipientState1AwaitingFetchTimestamp, kPlaceholderInt);
s.append(kCountInstancesInRecipientState2CreatingCollection, kPlaceholderInt);
s.append(kCountInstancesInRecipientState3Cloning, kPlaceholderInt);
@@ -329,4 +345,78 @@ void ShardingDataTransformCumulativeMetrics::setLastOpEndingChunkImbalance(int64
_lastOpEndingChunkImbalance.store(imbalanceCount);
}
+AtomicWord<int64_t>* ShardingDataTransformCumulativeMetrics::getMutableCoordinatorStateCounter(
+ ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum state) {
+ if (state == ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum::kUnused) {
+ return nullptr;
+ }
+
+ invariant(static_cast<size_t>(state) <
+ static_cast<size_t>(
+ ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum::kNumStates));
+ return &_coordinatorStateList[static_cast<size_t>(state)];
+}
+
+const AtomicWord<int64_t>* ShardingDataTransformCumulativeMetrics::getCoordinatorStateCounter(
+ ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum state) const {
+ if (state == ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum::kUnused) {
+ return nullptr;
+ }
+
+ invariant(static_cast<size_t>(state) <
+ static_cast<size_t>(
+ ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum::kNumStates));
+ return &_coordinatorStateList[static_cast<size_t>(state)];
+}
+
+void ShardingDataTransformCumulativeMetrics::onCoordinatorStateTransition(
+ boost::optional<ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum> before,
+ boost::optional<ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum> after) {
+ if (before) {
+ if (auto counter = getMutableCoordinatorStateCounter(*before)) {
+ counter->fetchAndSubtract(1);
+ }
+ }
+
+ if (after) {
+ if (auto counter = getMutableCoordinatorStateCounter(*after)) {
+ counter->fetchAndAdd(1);
+ }
+ }
+}
+
+const char* ShardingDataTransformCumulativeMetrics::fieldNameFor(
+ ShardingDataTransformCumulativeMetrics::CoordinatorStateEnum state) {
+ switch (state) {
+ case CoordinatorStateEnum::kInitializing:
+ return kCountInstancesInCoordinatorState1Initializing;
+
+ case CoordinatorStateEnum::kPreparingToDonate:
+ return kCountInstancesInCoordinatorState2PreparingToDonate;
+
+ case CoordinatorStateEnum::kCloning:
+ return kCountInstancesInCoordinatorState3Cloning;
+
+ case CoordinatorStateEnum::kApplying:
+ return kCountInstancesInCoordinatorState4Applying;
+
+ case CoordinatorStateEnum::kBlockingWrites:
+ return kCountInstancesInCoordinatorState5BlockingWrites;
+
+ case CoordinatorStateEnum::kAborting:
+ return kCountInstancesInCoordinatorState6Aborting;
+
+ case CoordinatorStateEnum::kCommitting:
+ return kCountInstancesInCoordinatorState7Committing;
+
+ default:
+ uasserted(6438601,
+ str::stream()
+ << "no field name for coordinator state " << static_cast<int32_t>(state));
+ break;
+ }
+
+ MONGO_UNREACHABLE;
+}
+
} // namespace mongo