This is an automated email from the ASF dual-hosted git repository.

abhishekrb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a615f16de3 Fix bug where numSegmentsKilled is reported incorrectly. 
Also, add a unit test. (#16103)
0a615f16de3 is described below

commit 0a615f16de3ed98b7d545de1d29516fa1dcd6340
Author: Abhishek Radhakrishnan <[email protected]>
AuthorDate: Tue Mar 12 12:32:54 2024 +0800

    Fix bug where numSegmentsKilled is reported incorrectly. Also, add a unit 
test. (#16103)
---
 .../common/task/KillUnusedSegmentsTask.java        |  2 +-
 .../common/task/KillUnusedSegmentsTaskTest.java    | 73 ++++++++++++++++++++++
 2 files changed, 74 insertions(+), 1 deletion(-)

diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTask.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTask.java
index cbf4a84ba79..9d4ab1edf49 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTask.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTask.java
@@ -273,7 +273,7 @@ public class KillUnusedSegmentsTask extends 
AbstractFixedIntervalTask
 
       toolbox.getDataSegmentKiller().kill(segmentsToBeKilled);
       numBatchesProcessed++;
-      numSegmentsKilled += unusedSegments.size();
+      numSegmentsKilled += segmentsToBeKilled.size();
 
       LOG.info("Processed [%d] batches for kill task[%s].", 
numBatchesProcessed, getId());
 
diff --git 
a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTaskTest.java
 
b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTaskTest.java
index e2c433536a2..d8e7a006605 100644
--- 
a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTaskTest.java
+++ 
b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/KillUnusedSegmentsTaskTest.java
@@ -21,6 +21,7 @@ package org.apache.druid.indexing.common.task;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.error.DruidExceptionMatcher;
@@ -42,6 +43,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -118,6 +120,62 @@ public class KillUnusedSegmentsTaskTest extends 
IngestionTestBase
     Assert.assertEquals(new KillTaskReport.Stats(1, 2, 0), getReportedStats());
   }
 
+  /**
+   * {@code segment1}, {@code segment2} and {@code segment3} have different 
versions, but share the same load spec.
+   * {@code segment1} and {@code segment2} are unused segments, while {@code 
segment3} is a used segment.
+   * When a kill task is submitted, the unused segments {@code segment1} and 
{@code segment2} should be deleted from the
+   * metadata store, but should be retained in deep storage as the load spec 
is used by segment {@code segment3}.
+   */
+  @Test
+  public void testKillUnusedSegmentsWithUsedLoadSpec() throws Exception
+  {
+    final DateTime now = DateTimes.nowUtc();
+    final String v1 = now.toString();
+    final String v2 = now.minusHours(2).toString();
+    final String v3 = now.minusHours(3).toString();
+
+    final DataSegment segment1 = 
newSegment(Intervals.of("2019-01-01/2019-02-01"), v1, ImmutableMap.of("foo", 
"1"));
+    final DataSegment segment2 = 
newSegment(Intervals.of("2019-02-01/2019-03-01"), v2, ImmutableMap.of("foo", 
"1"));
+    final DataSegment segment3 = 
newSegment(Intervals.of("2019-03-01/2019-04-01"), v3, ImmutableMap.of("foo", 
"1"));
+
+    final Set<DataSegment> segments = ImmutableSet.of(segment1, segment2, 
segment3);
+    final Set<DataSegment> unusedSegments = ImmutableSet.of(segment1, 
segment2);
+
+    Assert.assertEquals(segments, 
getMetadataStorageCoordinator().commitSegments(segments));
+    Assert.assertEquals(
+        unusedSegments.size(),
+        getSegmentsMetadataManager().markSegmentsAsUnused(
+            
unusedSegments.stream().map(DataSegment::getId).collect(Collectors.toSet())
+        )
+    );
+
+    final KillUnusedSegmentsTask task = new KillUnusedSegmentsTask(
+        null,
+        DATA_SOURCE,
+        Intervals.of("2018/2020"),
+        null,
+        false,
+        null,
+        100,
+        null
+    );
+
+    Assert.assertEquals(TaskState.SUCCESS, 
taskRunner.run(task).get().getStatusCode());
+    Assert.assertEquals(
+        new KillTaskReport.Stats(0, 1, 0),
+        getReportedStats()
+    );
+
+    final List<DataSegment> observedUnusedSegments = 
getMetadataStorageCoordinator().retrieveUnusedSegmentsForInterval(
+        DATA_SOURCE,
+        Intervals.of("2018/2020"),
+        null,
+        null
+    );
+
+    Assert.assertEquals(ImmutableSet.of(), new 
HashSet<>(observedUnusedSegments));
+  }
+
 
   @Test
   public void testKillWithMarkUnused() throws Exception
@@ -823,4 +881,19 @@ public class KillUnusedSegmentsTaskTest extends 
IngestionTestBase
         10L
     );
   }
+
+  private static DataSegment newSegment(Interval interval, String version, 
Map<String, Object> loadSpec)
+  {
+    return new DataSegment(
+        DATA_SOURCE,
+        interval,
+        version,
+        loadSpec,
+        null,
+        null,
+        null,
+        9,
+        10L
+    );
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to