Details
Description
submitRangeDeletionTask does not correctly handle the case where forceShardFilteringMetadataRefresh throws NamespaceNotFound. In this case, the range deletion task should be deleted, but the code to do that will not execute. I can confirm this by applying the following diff, which contains a unit test that demonstrates the incorrect behavior:
diff --git a/src/mongo/db/s/migration_util_test.cpp b/src/mongo/db/s/migration_util_test.cpp
|
index e6e4deaebb..001c307bbb 100644
|
--- a/src/mongo/db/s/migration_util_test.cpp
|
+++ b/src/mongo/db/s/migration_util_test.cpp
|
@@ -378,6 +378,31 @@ TEST_F(MigrationUtilsTest, TestInvalidUUID) {
|
|
using SubmitRangeDeletionTaskTest = MigrationUtilsTest;
|
|
+TEST_F(SubmitRangeDeletionTaskTest,
|
+ FailsAndDeletesTaskIfFilteringMetadataIsUnknownEvenAfterRefresh) {
|
+ auto opCtx = operationContext();
|
+
|
+ const auto uuid = UUID::gen();
|
+ auto deletionTask = createDeletionTask(kNss, uuid, 0, 10);
|
+
|
+ PersistentTaskStore<RangeDeletionTask> store(opCtx, NamespaceString::kRangeDeletionNamespace);
|
+ store.add(opCtx, deletionTask);
|
+ ASSERT_EQ(store.count(opCtx), 1);
|
+
|
+ // Make the refresh triggered by submitting the task return an empty result so that .
|
+ auto result =
|
+ stdx::async(stdx::launch::async, [this, uuid] {
|
+ respondToMetadataRefreshRequestsWithError();
|
+ });
|
+
|
+ auto submitTaskFuture = migrationutil::submitRangeDeletionTask(opCtx, deletionTask);
|
+
|
+ // The task should not have been submitted, and the task's entry should have been removed from
|
+ // the persistent store.
|
+ ASSERT_FALSE(submitTaskFuture.get(opCtx));
|
+ ASSERT_EQ(store.count(opCtx), 0);
|
+}
|
+
|
TEST_F(SubmitRangeDeletionTaskTest, SucceedsIfFilteringMetadataUUIDMatchesTaskUUID) {
|
auto opCtx = operationContext();
|
|