summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2022-04-07 19:42:40 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-15 17:52:24 +0000
commit17c995ce656f3ce1458c754ced4c624e8c585d40 (patch)
treebe29b6d377c205cbb40723a86e2fbec4843be7d5 /src
parent941d7d65f2de075d53d2a2f80b780c98876fd731 (diff)
downloadmongo-17c995ce656f3ce1458c754ced4c624e8c585d40.tar.gz
SERVER-64378 Track and Report New Donor and Recipient Fields in CurrentOp
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service.cpp7
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service.h1
-rw-r--r--src/mongo/db/s/resharding/resharding_metrics_helpers.cpp1
-rw-r--r--src/mongo/db/s/resharding/resharding_oplog_application.cpp22
-rw-r--r--src/mongo/db/s/sharding_data_transform_instance_metrics.cpp12
-rw-r--r--src/mongo/db/s/sharding_data_transform_instance_metrics.h6
-rw-r--r--src/mongo/db/s/sharding_data_transform_instance_metrics_test.cpp22
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