Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-45740

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

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

      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@mongodb.com Esha Maharishi (Inactive)
            Reporter:
            esha.maharishi@mongodb.com Esha Maharishi (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: