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

    XMLWordPrintableJSON

Details

    • Icon: Task Task
    • Resolution: Fixed
    • Icon: Major - P3 Major - P3
    • 4.3.4
    • None
    • Sharding
    • None
    • Fully Compatible
    • Sharding 2020-02-10
    • 21

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

      Attachments

        Activity

          People

            esha.maharishi@mongodb.com Esha Maharishi (Inactive)
            esha.maharishi@mongodb.com Esha Maharishi (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: