From ecbaddb63705f5ac10f299a539a584d24fcfa20c Mon Sep 17 00:00:00 2001 From: Brett Nawrocki Date: Wed, 23 Mar 2022 20:55:11 +0000 Subject: SERVER-64372 Add parity $currentOp resharding donor fields Track and report the following fields in ShardingDataTransformInstanceMetrics for resharding $currentOp: countWritesDuringCriticalSection totalCriticalSectionTimeElapsedSecs --- .../db/s/resharding/resharding_coordinator_service.cpp | 10 ++++++++++ .../db/s/resharding/resharding_coordinator_service.h | 3 +++ src/mongo/db/s/resharding/resharding_donor_service.cpp | 16 ++++++++++++++++ src/mongo/db/s/resharding/resharding_donor_service.h | 5 +++++ 4 files changed, 34 insertions(+) (limited to 'src/mongo/db/s/resharding') diff --git a/src/mongo/db/s/resharding/resharding_coordinator_service.cpp b/src/mongo/db/s/resharding/resharding_coordinator_service.cpp index 99f98abf0a7..4b48ec91761 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_service.cpp +++ b/src/mongo/db/s/resharding/resharding_coordinator_service.cpp @@ -977,6 +977,10 @@ ReshardingCoordinatorService::ReshardingCoordinator::ReshardingCoordinator( : PrimaryOnlyService::TypedInstance(), _id(coordinatorDoc.getReshardingUUID().toBSON()), _coordinatorService(coordinatorService), + _metricsNew{ + ShardingDataTransformMetrics::isEnabled() + ? ReshardingMetricsNew::initializeFrom(coordinatorDoc, getGlobalServiceContext()) + : nullptr}, _metadata(coordinatorDoc.getCommonReshardingMetadata()), _coordinatorDoc(coordinatorDoc), _markKilledExecutor(std::make_shared([] { @@ -1259,6 +1263,9 @@ ReshardingCoordinatorService::ReshardingCoordinator::_commitAndFinishReshardOper }) .then([this, executor] { return _awaitAllParticipantShardsDone(executor); }) .then([this, executor] { + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onCriticalSectionEnd(); + } // Best-effort attempt to trigger a refresh on the participant shards so // they see the collection metadata without reshardingFields and no longer // throw ReshardCollectionInProgress. There is no guarantee this logic ever @@ -1685,6 +1692,9 @@ ReshardingCoordinatorService::ReshardingCoordinator::_awaitAllRecipientsFinished this->_updateCoordinatorDocStateAndCatalogEntries(CoordinatorStateEnum::kBlockingWrites, _coordinatorDoc); + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onCriticalSectionBegin(); + } }) .then([this] { return _waitForMajority(_ctHolder->getAbortToken()); }) .thenRunOn(**executor) diff --git a/src/mongo/db/s/resharding/resharding_coordinator_service.h b/src/mongo/db/s/resharding/resharding_coordinator_service.h index a24569ecc44..280abbac2f3 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_service.h +++ b/src/mongo/db/s/resharding/resharding_coordinator_service.h @@ -33,6 +33,7 @@ #include "mongo/db/repl/primary_only_service.h" #include "mongo/db/s/resharding/coordinator_document_gen.h" #include "mongo/db/s/resharding/resharding_coordinator_observer.h" +#include "mongo/db/s/resharding/resharding_metrics_new.h" #include "mongo/platform/mutex.h" #include "mongo/s/catalog/type_chunk.h" #include "mongo/s/catalog/type_collection.h" @@ -506,6 +507,8 @@ private: // The primary-only service instance corresponding to the coordinator instance. Not owned. const ReshardingCoordinatorService* const _coordinatorService; + std::unique_ptr _metricsNew; + // The in-memory representation of the immutable portion of the document in // config.reshardingOperations. const CommonReshardingMetadata _metadata; diff --git a/src/mongo/db/s/resharding/resharding_donor_service.cpp b/src/mongo/db/s/resharding/resharding_donor_service.cpp index 722cd4453ce..2eff19e9c0f 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_service.cpp @@ -204,6 +204,9 @@ ReshardingDonorService::DonorStateMachine::DonorStateMachine( std::unique_ptr externalState) : repl::PrimaryOnlyService::TypedInstance(), _donorService(donorService), + _metricsNew{ShardingDataTransformMetrics::isEnabled() + ? ReshardingMetricsNew::initializeFrom(donorDoc, getGlobalServiceContext()) + : nullptr}, _metadata{donorDoc.getCommonReshardingMetadata()}, _recipientShardIds{donorDoc.getRecipientShards()}, _donorCtx{donorDoc.getMutableState()}, @@ -378,6 +381,9 @@ ExecutorFuture ReshardingDonorService::DonorStateMachine::_finishReshardin ShardingCatalogClient::kLocalWriteConcern); _metrics()->leaveCriticalSection(getCurrentTime()); + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onCriticalSectionEnd(); + } } auto opCtx = _cancelableOpCtxFactory->makeOperationContext(&cc()); @@ -512,6 +518,13 @@ void ReshardingDonorService::DonorStateMachine::onReshardingFieldsChanges( } } +void ReshardingDonorService::DonorStateMachine::onWriteDuringCriticalSection() { + if (!ShardingDataTransformMetrics::isEnabled()) { + return; + } + _metricsNew->onWriteDuringCriticalSection(); +} + SharedSemiFuture ReshardingDonorService::DonorStateMachine::awaitCriticalSectionAcquired() { return _critSecWasAcquired.getFuture(); } @@ -673,6 +686,9 @@ void ReshardingDonorService::DonorStateMachine:: ShardingCatalogClient::kLocalWriteConcern); _metrics()->enterCriticalSection(getCurrentTime()); + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onCriticalSectionBegin(); + } } { diff --git a/src/mongo/db/s/resharding/resharding_donor_service.h b/src/mongo/db/s/resharding/resharding_donor_service.h index b50c88b6af5..6b7316150f7 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.h +++ b/src/mongo/db/s/resharding/resharding_donor_service.h @@ -33,6 +33,7 @@ #include "mongo/db/repl/primary_only_service.h" #include "mongo/db/s/resharding/donor_document_gen.h" #include "mongo/db/s/resharding/resharding_metrics.h" +#include "mongo/db/s/resharding/resharding_metrics_new.h" #include "mongo/s/resharding/type_collection_fields_gen.h" namespace mongo { @@ -101,6 +102,8 @@ public: void onReshardingFieldsChanges(OperationContext* opCtx, const TypeCollectionReshardingFields& reshardingFields); + void onWriteDuringCriticalSection(); + SharedSemiFuture awaitCriticalSectionAcquired(); SharedSemiFuture awaitCriticalSectionPromoted(); @@ -221,6 +224,8 @@ private: // The primary-only service instance corresponding to the donor instance. Not owned. const ReshardingDonorService* const _donorService; + std::unique_ptr _metricsNew; + // The in-memory representation of the immutable portion of the document in // config.localReshardingOperations.donor. const CommonReshardingMetadata _metadata; -- cgit v1.2.1