submitRangeDeletionTask should delete range deletion task if filtering metadata is still unknown after refresh

XMLWordPrintableJSON

    • Type: Task
    • Resolution: Fixed
    • Priority: Major - P3
    • 4.3.4
    • Affects Version/s: None
    • Component/s: Sharding
    • None
    • Fully Compatible
    • Sharding 2020-02-10
    • 21
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      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();
      
      

            Assignee:
            Esha Maharishi (Inactive)
            Reporter:
            Esha Maharishi (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: