summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2021-11-16 04:10:05 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-11-16 05:03:44 +0000
commit2921ff2372c9d05f86eb7614a07b731cd5b5b544 (patch)
treeb807a6d6d2857926038bc46af98159f0ae705a26
parent5f3c1897af8571355124a1c58774eda5d580c9f5 (diff)
downloadmongo-2921ff2372c9d05f86eb7614a07b731cd5b5b544.tar.gz
SERVER-61473 Make ReshardingMetrics::onCompletion() idempotent.
ReshardingMetrics::onCompletion() can be called multiple times within the resharding::WithAutomaticRetry blocks of the ReshardingCoordinator. (cherry picked from commit 5d18bd88c941964e19622282cd040eadbb0db23d)
-rw-r--r--src/mongo/db/s/resharding/resharding_metrics.cpp4
-rw-r--r--src/mongo/db/s/resharding/resharding_metrics_test.cpp8
2 files changed, 12 insertions, 0 deletions
diff --git a/src/mongo/db/s/resharding/resharding_metrics.cpp b/src/mongo/db/s/resharding/resharding_metrics.cpp
index be231bce447..31a454cf3c3 100644
--- a/src/mongo/db/s/resharding/resharding_metrics.cpp
+++ b/src/mongo/db/s/resharding/resharding_metrics.cpp
@@ -365,6 +365,10 @@ void ReshardingMetrics::onCompletion(Role role,
_cumulativeOp->maxRemainingOperationTime = Milliseconds(0);
}
+ if (!_currentOp) {
+ return;
+ }
+
if (_currentOp->donorState && _currentOp->recipientState) {
switch (role) {
case Role::kDonor:
diff --git a/src/mongo/db/s/resharding/resharding_metrics_test.cpp b/src/mongo/db/s/resharding/resharding_metrics_test.cpp
index 4b979936f51..3f8d5545c29 100644
--- a/src/mongo/db/s/resharding/resharding_metrics_test.cpp
+++ b/src/mongo/db/s/resharding/resharding_metrics_test.cpp
@@ -173,6 +173,14 @@ DEATH_TEST_F(ReshardingMetricsTest,
}
*/
+TEST_F(ReshardingMetricsTest, RunOnCompletionTwiceIsSafe) {
+ startOperation(ReshardingMetrics::Role::kCoordinator);
+ completeOperation(ReshardingMetrics::Role::kCoordinator,
+ ReshardingOperationStatusEnum::kSuccess);
+ completeOperation(ReshardingMetrics::Role::kCoordinator,
+ ReshardingOperationStatusEnum::kSuccess);
+}
+
TEST_F(ReshardingMetricsTest, RunOnStepDownAfterOnCompletionIsSafe) {
startOperation(ReshardingMetrics::Role::kRecipient);
completeOperation(ReshardingMetrics::Role::kRecipient, ReshardingOperationStatusEnum::kSuccess);