diff options
author | Randolph Tan <randolph@10gen.com> | 2022-04-07 19:42:40 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-15 17:52:24 +0000 |
commit | 17c995ce656f3ce1458c754ced4c624e8c585d40 (patch) | |
tree | be29b6d377c205cbb40723a86e2fbec4843be7d5 /src | |
parent | 941d7d65f2de075d53d2a2f80b780c98876fd731 (diff) | |
download | mongo-17c995ce656f3ce1458c754ced4c624e8c585d40.tar.gz |
SERVER-64378 Track and Report New Donor and Recipient Fields in CurrentOp
Diffstat (limited to 'src')
7 files changed, 69 insertions, 2 deletions
diff --git a/src/mongo/db/s/resharding/resharding_donor_service.cpp b/src/mongo/db/s/resharding/resharding_donor_service.cpp index 2eff19e9c0f..66eb3f680c8 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_service.cpp @@ -525,6 +525,13 @@ void ReshardingDonorService::DonorStateMachine::onWriteDuringCriticalSection() { _metricsNew->onWriteDuringCriticalSection(); } +void ReshardingDonorService::DonorStateMachine::onReadDuringCriticalSection() { + if (!ShardingDataTransformMetrics::isEnabled()) { + return; + } + _metricsNew->onReadDuringCriticalSection(); +} + SharedSemiFuture<void> ReshardingDonorService::DonorStateMachine::awaitCriticalSectionAcquired() { return _critSecWasAcquired.getFuture(); } diff --git a/src/mongo/db/s/resharding/resharding_donor_service.h b/src/mongo/db/s/resharding/resharding_donor_service.h index 6b7316150f7..881e74475ec 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.h +++ b/src/mongo/db/s/resharding/resharding_donor_service.h @@ -102,6 +102,7 @@ public: void onReshardingFieldsChanges(OperationContext* opCtx, const TypeCollectionReshardingFields& reshardingFields); + void onReadDuringCriticalSection(); void onWriteDuringCriticalSection(); SharedSemiFuture<void> awaitCriticalSectionAcquired(); diff --git a/src/mongo/db/s/resharding/resharding_metrics_helpers.cpp b/src/mongo/db/s/resharding/resharding_metrics_helpers.cpp index cd6ca6d32c2..34fd2446df4 100644 --- a/src/mongo/db/s/resharding/resharding_metrics_helpers.cpp +++ b/src/mongo/db/s/resharding/resharding_metrics_helpers.cpp @@ -70,6 +70,7 @@ void onCriticalSectionErrorThrows(OperationContext* opCtx, const StaleConfigInfo (*stateMachine)->onWriteDuringCriticalSection(); return; case StaleConfigInfo::OperationType::kRead: + (*stateMachine)->onReadDuringCriticalSection(); return; } } diff --git a/src/mongo/db/s/resharding/resharding_oplog_application.cpp b/src/mongo/db/s/resharding/resharding_oplog_application.cpp index 9a2f6f2750e..08067f21131 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_application.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_application.cpp @@ -271,6 +271,10 @@ void ReshardingOplogApplicationRules::_applyInsert_inlock(OperationContext* opCt UpdateResult ur = update(opCtx, db, request); invariant(ur.numMatched != 0); + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onWriteToStashedCollections(); + } + return; } @@ -311,6 +315,10 @@ void ReshardingOplogApplicationRules::_applyInsert_inlock(OperationContext* opCt // and insert the contents of 'op' to the stash collection. uassertStatusOK(stashColl->insertDocument( opCtx, InsertStatement(oField), nullptr /* nullOpDebug */, false /* fromMigrate */)); + + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onWriteToStashedCollections(); + } } void ReshardingOplogApplicationRules::_applyUpdate_inlock(OperationContext* opCtx, @@ -364,6 +372,10 @@ void ReshardingOplogApplicationRules::_applyUpdate_inlock(OperationContext* opCt invariant(ur.numMatched != 0); + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onWriteToStashedCollections(); + } + return; } @@ -437,6 +449,11 @@ void ReshardingOplogApplicationRules::_applyDelete_inlock(OperationContext* opCt if (!stashCollDoc.isEmpty()) { auto nDeleted = deleteObjects(opCtx, stashColl, _myStashNss, idQuery, true /* justOne */); invariant(nDeleted != 0); + + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onWriteToStashedCollections(); + } + return; } @@ -520,6 +537,11 @@ void ReshardingOplogApplicationRules::_applyDelete_inlock(OperationContext* opCt boost::none /* verbosity */)); BSONObj res; auto state = exec->getNext(&res, nullptr); + + if (ShardingDataTransformMetrics::isEnabled()) { + _metricsNew->onWriteToStashedCollections(); + } + if (PlanExecutor::ADVANCED == state) { // We matched a document and deleted it, so break. doc = std::move(res); diff --git a/src/mongo/db/s/sharding_data_transform_instance_metrics.cpp b/src/mongo/db/s/sharding_data_transform_instance_metrics.cpp index 1f14094cca5..dc351ce89d3 100644 --- a/src/mongo/db/s/sharding_data_transform_instance_metrics.cpp +++ b/src/mongo/db/s/sharding_data_transform_instance_metrics.cpp @@ -146,7 +146,7 @@ BSONObj ShardingDataTransformInstanceMetrics::reportForCurrentOp() const noexcep builder.append(kDonorState, getStateString()); builder.append(kCriticalSectionTimeElapsed, getCriticalSectionElapsedTimeSecs()); builder.append(kCountWritesDuringCriticalSection, _writesDuringCriticalSection.load()); - builder.append(kCountReadsDuringCriticalSection, TEMP_VALUE); + builder.append(kCountReadsDuringCriticalSection, _readsDuringCriticalSection.load()); break; case Role::kRecipient: builder.append(kRecipientState, getStateString()); @@ -156,7 +156,7 @@ BSONObj ShardingDataTransformInstanceMetrics::reportForCurrentOp() const noexcep builder.append(kApproxDocumentsToCopy, TEMP_VALUE); builder.append(kApproxBytesToCopy, TEMP_VALUE); builder.append(kBytesCopied, TEMP_VALUE); - builder.append(kCountWritesToStashCollections, TEMP_VALUE); + builder.append(kCountWritesToStashCollections, _writesToStashCollections.load()); builder.append(kInsertsApplied, _insertsApplied.load()); builder.append(kUpdatesApplied, _updatesApplied.load()); builder.append(kDeletesApplied, _deletesApplied.load()); @@ -215,4 +215,12 @@ int64_t ShardingDataTransformInstanceMetrics::getCriticalSectionElapsedTimeSecs( return durationCount<Seconds>(end - start); } +void ShardingDataTransformInstanceMetrics::onWriteToStashedCollections() { + _writesToStashCollections.fetchAndAdd(1); +} + +void ShardingDataTransformInstanceMetrics::onReadDuringCriticalSection() { + _readsDuringCriticalSection.fetchAndAdd(1); +} + } // namespace mongo diff --git a/src/mongo/db/s/sharding_data_transform_instance_metrics.h b/src/mongo/db/s/sharding_data_transform_instance_metrics.h index 77fd973458e..ca0a5b55609 100644 --- a/src/mongo/db/s/sharding_data_transform_instance_metrics.h +++ b/src/mongo/db/s/sharding_data_transform_instance_metrics.h @@ -68,9 +68,13 @@ public: void onUpdateApplied(); void onDeleteApplied(); void onOplogEntriesApplied(int64_t numEntries); + void onWriteToStashedCollections(); + + void onReadDuringCriticalSection(); void onWriteDuringCriticalSection(); void onCriticalSectionBegin(); void onCriticalSectionEnd(); + Role getRole() const; protected: @@ -125,9 +129,11 @@ private: AtomicWord<int64_t> _updatesApplied; AtomicWord<int64_t> _deletesApplied; AtomicWord<int64_t> _oplogEntriesApplied; + AtomicWord<int64_t> _writesToStashCollections; AtomicWord<Date_t> _criticalSectionStartTime; AtomicWord<Date_t> _criticalSectionEndTime; + AtomicWord<int64_t> _readsDuringCriticalSection; AtomicWord<int64_t> _writesDuringCriticalSection; }; diff --git a/src/mongo/db/s/sharding_data_transform_instance_metrics_test.cpp b/src/mongo/db/s/sharding_data_transform_instance_metrics_test.cpp index 68b3379a3be..e99198abe26 100644 --- a/src/mongo/db/s/sharding_data_transform_instance_metrics_test.cpp +++ b/src/mongo/db/s/sharding_data_transform_instance_metrics_test.cpp @@ -201,6 +201,17 @@ TEST_F(ShardingDataTransformInstanceMetricsTest, DonorIncrementWritesDuringCriti ASSERT_EQ(report.getIntField("countWritesDuringCriticalSection"), 1); } +TEST_F(ShardingDataTransformInstanceMetricsTest, DonorIncrementReadsDuringCriticalSection) { + auto metrics = createInstanceMetrics(UUID::gen(), Role::kDonor); + + auto report = metrics->reportForCurrentOp(); + ASSERT_EQ(report.getIntField("countReadsDuringCriticalSection"), 0); + metrics->onReadDuringCriticalSection(); + + report = metrics->reportForCurrentOp(); + ASSERT_EQ(report.getIntField("countReadsDuringCriticalSection"), 1); +} + TEST_F(ShardingDataTransformInstanceMetricsTest, CurrentOpReportsCriticalSectionTime) { const auto roles = {Role::kDonor, Role::kCoordinator}; for (const auto& role : roles) { @@ -249,5 +260,16 @@ TEST_F(ShardingDataTransformInstanceMetricsTest, CurrentOpReportsRunningTime) { ASSERT_EQ(report.getIntField("totalOperationTimeElapsedSecs"), kTimeElapsed); } +TEST_F(ShardingDataTransformInstanceMetricsTest, OnWriteToStasheddShouldIncrementCurOpFields) { + auto metrics = createInstanceMetrics(UUID::gen(), Role::kRecipient); + + auto report = metrics->reportForCurrentOp(); + ASSERT_EQ(report.getIntField("countWritesToStashCollections"), 0); + metrics->onWriteToStashedCollections(); + + report = metrics->reportForCurrentOp(); + ASSERT_EQ(report.getIntField("countWritesToStashCollections"), 1); +} + } // namespace } // namespace mongo |