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

Jackie-Jiang 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 9c02213b99e Do not override user-configured validDocIdsType for upsert 
compaction (#18850)
9c02213b99e is described below

commit 9c02213b99e1b6fd88d60401a889acc57b7f5122
Author: Krishan Goyal <[email protected]>
AuthorDate: Tue Jun 30 03:53:04 2026 +0530

    Do not override user-configured validDocIdsType for upsert compaction 
(#18850)
---
 .../pinot/plugin/minion/tasks/MinionTaskUtils.java | 27 +++++++---------------
 .../plugin/minion/tasks/MinionTaskUtilsTest.java   | 26 +++++++++++----------
 2 files changed, 22 insertions(+), 31 deletions(-)

diff --git 
a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtils.java
 
b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtils.java
index b96b9a56990..ea2150644c3 100644
--- 
a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtils.java
+++ 
b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtils.java
@@ -441,11 +441,12 @@ public class MinionTaskUtils {
 
   /**
    * Get the validDocIdsType based on the upsertConfig and taskConfigs.
-   * The default value is determined by whether delete is enabled in the 
upsertConfig. If delete is enabled,
-   * the default value is 'snapshot_with_delete', otherwise it is 'snapshot'.
-   * If delete is enabled, we override the user-specified value to 
'snapshot_with_delete' for backward compatibility
-   * except when it is 'in_memory_with_delete'.
-   * It also validates the combination of validDocIdsType, snapshot and 
deleteRecordColumn.
+   * The default value is 'snapshot' It validates the combination of 
validDocIdsType, snapshot and
+   * deleteRecordColumn:
+   * <ul>
+   *   <li>'snapshot' and 'snapshot_with_delete' require upsert snapshots to 
be enabled.</li>
+   *   <li>'snapshot_with_delete' and 'in_memory_with_delete' require a 
deleteRecordColumn to be configured.</li>
+   * </ul>
    * @param upsertConfig upsertConfig of the table
    * @param taskConfigs taskConfigs of the task
    * @param validDocIdsTypeKey the key to get validDocIdsType from taskConfigs
@@ -453,22 +454,10 @@ public class MinionTaskUtils {
    */
   public static ValidDocIdsType getValidDocIdsType(UpsertConfig upsertConfig, 
Map<String, String> taskConfigs,
       String validDocIdsTypeKey) {
-    boolean isDeleteEnabled = 
StringUtils.isNotEmpty(upsertConfig.getDeleteRecordColumn());
-    ValidDocIdsType defaultValidDocIdsType =
-        isDeleteEnabled ? ValidDocIdsType.SNAPSHOT_WITH_DELETE : 
ValidDocIdsType.SNAPSHOT;
     String validDocIdsTypeStr = taskConfigs.getOrDefault(validDocIdsTypeKey,
-        defaultValidDocIdsType.name()).toUpperCase();
+        ValidDocIdsType.SNAPSHOT.name()).toUpperCase();
     ValidDocIdsType validDocIdsType = 
ValidDocIdsType.valueOf(validDocIdsTypeStr);
 
-    if (isDeleteEnabled && validDocIdsType != 
ValidDocIdsType.SNAPSHOT_WITH_DELETE
-        && validDocIdsType != ValidDocIdsType.IN_MEMORY_WITH_DELETE) {
-      LOGGER.warn(
-          "Overriding user-specified validDocIdsType '{}' to '{}' for backward 
compatibility because delete is "
-              + "enabled (deleteRecordColumn='{}').",
-          validDocIdsType, ValidDocIdsType.SNAPSHOT_WITH_DELETE, 
upsertConfig.getDeleteRecordColumn());
-      validDocIdsType = ValidDocIdsType.SNAPSHOT_WITH_DELETE;
-    }
-
     if (validDocIdsType == ValidDocIdsType.SNAPSHOT || validDocIdsType == 
ValidDocIdsType.SNAPSHOT_WITH_DELETE) {
       Preconditions.checkState(upsertConfig.getSnapshot() != 
Enablement.DISABLE,
           "'snapshot' must not be 'DISABLE' with validDocIdsType: %s", 
validDocIdsType);
@@ -476,7 +465,7 @@ public class MinionTaskUtils {
 
     if (validDocIdsType == ValidDocIdsType.IN_MEMORY_WITH_DELETE
         || validDocIdsType == ValidDocIdsType.SNAPSHOT_WITH_DELETE) {
-      Preconditions.checkState(isDeleteEnabled,
+      
Preconditions.checkState(StringUtils.isNotEmpty(upsertConfig.getDeleteRecordColumn()),
           "'deleteRecordColumn' must be provided with validDocIdsType: %s", 
validDocIdsType);
     }
     return validDocIdsType;
diff --git 
a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/test/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtilsTest.java
 
b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/test/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtilsTest.java
index 5abf106367f..0b55986df46 100644
--- 
a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/test/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtilsTest.java
+++ 
b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/test/java/org/apache/pinot/plugin/minion/tasks/MinionTaskUtilsTest.java
@@ -162,11 +162,12 @@ public class MinionTaskUtilsTest {
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
     assertEquals(result1, ValidDocIdsType.SNAPSHOT);
 
-    // Test 2: Default when delete is enabled
+    // Test 2: Default stays SNAPSHOT even when delete is enabled. Delete 
records are retained until they expire via
+    // deletedKeysTTL rather than being dropped eagerly.
     upsertConfig.setDeleteRecordColumn("deleted");
     ValidDocIdsType result2 =
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
-    assertEquals(result2, ValidDocIdsType.SNAPSHOT_WITH_DELETE);
+    assertEquals(result2, ValidDocIdsType.SNAPSHOT);
   }
 
   @Test
@@ -210,23 +211,24 @@ public class MinionTaskUtilsTest {
   }
 
   @Test
-  public void testGetValidDocIdsTypeBackwardCompatibilityAndOverride() {
-    // Test backward compatibility behavior when delete is enabled
+  public void testGetValidDocIdsTypeNotOverriddenForDeleteTable() {
+    // A user-specified validDocIdsType is always honored on a delete-enabled 
table; it is never silently overridden
+    // to SNAPSHOT_WITH_DELETE.
     UpsertConfig upsertConfig = new UpsertConfig();
     upsertConfig.setDeleteRecordColumn("deleted");
     Map<String, String> taskConfigs = new HashMap<>();
 
-    // Test 1: SNAPSHOT gets overridden to SNAPSHOT_WITH_DELETE
+    // Test 1: SNAPSHOT is honored (not overridden to SNAPSHOT_WITH_DELETE)
     taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, "SNAPSHOT");
     ValidDocIdsType result1 =
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
-    assertEquals(result1, ValidDocIdsType.SNAPSHOT_WITH_DELETE);
+    assertEquals(result1, ValidDocIdsType.SNAPSHOT);
 
-    // Test 2: IN_MEMORY gets overridden to SNAPSHOT_WITH_DELETE
+    // Test 2: IN_MEMORY is honored (not overridden)
     taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, "IN_MEMORY");
     ValidDocIdsType result2 =
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
-    assertEquals(result2, ValidDocIdsType.SNAPSHOT_WITH_DELETE);
+    assertEquals(result2, ValidDocIdsType.IN_MEMORY);
 
     // Test 3: SNAPSHOT_WITH_DELETE stays the same
     taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, 
"SNAPSHOT_WITH_DELETE");
@@ -234,17 +236,17 @@ public class MinionTaskUtilsTest {
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
     assertEquals(result3, ValidDocIdsType.SNAPSHOT_WITH_DELETE);
 
-    // Test 4: IN_MEMORY_WITH_DELETE stays the same (not overridden)
+    // Test 4: IN_MEMORY_WITH_DELETE stays the same
     taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, 
"IN_MEMORY_WITH_DELETE");
     ValidDocIdsType result4 =
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
     assertEquals(result4, ValidDocIdsType.IN_MEMORY_WITH_DELETE);
 
-    // Test 5: Case insensitive override behavior
-    taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, 
"in_memory_with_delete");
+    // Test 5: Case-insensitive parsing, still honored without override
+    taskConfigs.put(UpsertCompactionTask.VALID_DOC_IDS_TYPE, "snapshot");
     ValidDocIdsType result5 =
         MinionTaskUtils.getValidDocIdsType(upsertConfig, taskConfigs, 
UpsertCompactionTask.VALID_DOC_IDS_TYPE);
-    assertEquals(result5, ValidDocIdsType.IN_MEMORY_WITH_DELETE);
+    assertEquals(result5, ValidDocIdsType.SNAPSHOT);
   }
 
   @Test


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

Reply via email to