summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2021-11-16 05:15:20 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-11-16 05:46:11 +0000
commit6c3707f9e2b460efc3641d83d9c6138204e1c1ba (patch)
tree65ff26cec3557f4a0a594cb48b83f8928710cf0f
parent149a61a491d4ecfbe50001314aeba3c63ef1c074 (diff)
downloadmongo-6c3707f9e2b460efc3641d83d9c6138204e1c1ba.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);