diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2021-11-16 04:10:05 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-11-16 05:03:44 +0000 |
commit | 2921ff2372c9d05f86eb7614a07b731cd5b5b544 (patch) | |
tree | b807a6d6d2857926038bc46af98159f0ae705a26 | |
parent | 5f3c1897af8571355124a1c58774eda5d580c9f5 (diff) | |
download | mongo-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.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/s/resharding/resharding_metrics_test.cpp | 8 |
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); |