You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by sn...@apache.org on 2022/06/21 21:07:01 UTC

[pinot] branch master updated: Wait segment deletion in startReplaceSegment api to make sure there will be at most 2 data snapshots. (#8838)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 12dd211dda Wait segment deletion in startReplaceSegment api to make sure there will be at most 2 data snapshots. (#8838)
12dd211dda is described below

commit 12dd211dda3ec360914fc51acd4763b8a6b17641
Author: Jiapeng Tao <ji...@linkedin.com>
AuthorDate: Tue Jun 21 14:06:56 2022 -0700

    Wait segment deletion in startReplaceSegment api to make sure there will be at most 2 data snapshots. (#8838)
---
 .../helix/core/PinotHelixResourceManager.java         | 19 +++++++++++++++++++
 .../helix/core/PinotHelixResourceManagerTest.java     |  8 ++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
index d5a0fa9550..970d27efb8 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java
@@ -173,6 +173,8 @@ public class PinotHelixResourceManager {
   // TODO: make this configurable
   public static final long EXTERNAL_VIEW_ONLINE_SEGMENTS_MAX_WAIT_MS = 10 * 60_000L; // 10 minutes
   public static final long EXTERNAL_VIEW_CHECK_INTERVAL_MS = 1_000L; // 1 second
+  public static final long SEGMENT_CLEANUP_TIMEOUT_MS = 20 * 60_000L; // 20 minutes
+  public static final long SEGMENT_CLEANUP_CHECK_INTERVAL_MS = 1_000L; // 1 second
 
   private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
 
@@ -3165,6 +3167,7 @@ public class PinotHelixResourceManager {
           if (!segmentsToCleanUp.isEmpty()) {
             LOGGER.info("Cleaning up the segments while startReplaceSegments: {}", segmentsToCleanUp);
             deleteSegments(tableNameWithType, segmentsToCleanUp);
+            waitForSegmentsToDelete(tableNameWithType, segmentsToCleanUp, SEGMENT_CLEANUP_TIMEOUT_MS);
           }
           return true;
         } else {
@@ -3185,6 +3188,22 @@ public class PinotHelixResourceManager {
     return segmentLineageEntryId;
   }
 
+  private void waitForSegmentsToDelete(String tableNameWithType, List<String> segments, long timeOutInMillis)
+      throws InterruptedException {
+    LOGGER.info("Waiting for {} segments to delete for table: {}. timeout = {}ms, segments = {}", segments.size(),
+        tableNameWithType, timeOutInMillis, segments);
+    long endTimeMs = System.currentTimeMillis() + timeOutInMillis;
+    do {
+      if (Collections.disjoint(getSegmentsFor(tableNameWithType, false), segments)) {
+        return;
+      } else {
+        Thread.sleep(SEGMENT_CLEANUP_CHECK_INTERVAL_MS);
+      }
+    } while (System.currentTimeMillis() < endTimeMs);
+    throw new RuntimeException("Timeout while waiting for segments to be deleted for table: " + tableNameWithType
+        + ", timeout: " + timeOutInMillis + "ms");
+  }
+
   /**
    * Computes the end segment replace phase
    *
diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManagerTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManagerTest.java
index bd2f91a12b..85ae08c4e6 100644
--- a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManagerTest.java
+++ b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManagerTest.java
@@ -915,7 +915,9 @@ public class PinotHelixResourceManagerTest {
     Assert.assertEquals(segmentLineage.getLineageEntry(lineageEntryId3).getState(), LineageEntryState.IN_PROGRESS);
 
     // Check that the segments from the older lineage gets deleted
-    waitForSegmentsToDelete(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, 3, TIMEOUT_IN_MS);
+    Collections.disjoint(
+        TEST_INSTANCE.getHelixResourceManager().getSegmentsFor(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, false),
+        Arrays.asList("s6", "s7", "s8"));
     Assert.assertEquals(TEST_INSTANCE.getHelixResourceManager()
         .getSegmentsFor(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, false).size(), 3);
     Assert.assertEquals(new HashSet<>(TEST_INSTANCE.getHelixResourceManager()
@@ -973,7 +975,9 @@ public class PinotHelixResourceManagerTest {
     segmentsTo = Arrays.asList("s12", "s13", "s14");
     String lineageEntryId4 = TEST_INSTANCE.getHelixResourceManager()
         .startReplaceSegments(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, segmentsFrom, segmentsTo, true);
-    waitForSegmentsToDelete(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, 3, TIMEOUT_IN_MS);
+    Collections.disjoint(
+        TEST_INSTANCE.getHelixResourceManager().getSegmentsFor(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, false),
+        Arrays.asList("s9", "s10", "s11"));
     Assert.assertEquals(new HashSet<>(TEST_INSTANCE.getHelixResourceManager()
             .getSegmentsFor(OFFLINE_SEGMENTS_REPLACE_TEST_REFRESH_TABLE_NAME, false)),
         new HashSet<>(Arrays.asList("s3", "s4", "s5")));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org