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

xiangfu0 pushed a commit to branch xiangfu0/codex2/table-size-retention
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to 
refs/heads/xiangfu0/codex2/table-size-retention by this push:
     new 3556208618d Skip size retention when segment metadata totals overflow
3556208618d is described below

commit 3556208618d4e545f2d5470e27e23751264bebee
Author: Xiang Fu <[email protected]>
AuthorDate: Thu Oct 8 12:41:00 2026 -0700

    Skip size retention when segment metadata totals overflow
    
    Reproduce with completed segments sized Long.MAX_VALUE and one byte: 
unchecked addition wrapped negative and published a healthy gauge. Use checked 
long addition to skip eviction, warn, and publish the blocked gauge for both 
OFFLINE and REALTIME.
---
 .../helix/core/retention/RetentionManager.java         |  7 ++++++-
 .../helix/core/retention/RetentionManagerTest.java     | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/retention/RetentionManager.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/retention/RetentionManager.java
index 4ff5f4b6954..8a207a4b72d 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/retention/RetentionManager.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/retention/RetentionManager.java
@@ -210,7 +210,12 @@ public class RetentionManager extends 
ControllerPeriodicTask<Void> {
         LOGGER.warn("Unknown size for segment: {} in table: {}, skip size 
retention", segmentName, tableNameWithType);
         return false;
       }
-      retainedBytes += size;
+      try {
+        retainedBytes = Math.addExact(retainedBytes, size);
+      } catch (ArithmeticException e) {
+        LOGGER.warn("Segment size overflow for table: {}, skip size 
retention", tableNameWithType);
+        return false;
+      }
       completedSegments.add(metadata);
       completedSegmentSizes.put(segmentName, size);
     }
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/retention/RetentionManagerTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/retention/RetentionManagerTest.java
index 89bb50ce1ad..ac6dfced991 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/retention/RetentionManagerTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/core/retention/RetentionManagerTest.java
@@ -1739,6 +1739,24 @@ public class RetentionManagerTest {
     
assertEquals(segments.stream().map(SegmentZKMetadata::getSegmentName).toList(), 
List.of("newest"));
   }
 
+  @Test
+  public void testSizeRetentionSkipsTableWhenSegmentSizeTotalOverflows() {
+    for (TableType tableType : List.of(TableType.OFFLINE, TableType.REALTIME)) 
{
+      TableConfig tableConfig = createSizeRetentionTableConfig(tableType, 
"100B");
+      long now = System.currentTimeMillis();
+      List<SegmentZKMetadata> segments = 
List.of(createSizeRetentionSegment("oldest", Long.MAX_VALUE, now - 1),
+          createSizeRetentionSegment("newest", 1, now));
+      PinotHelixResourceManager resourceManager = 
mock(PinotHelixResourceManager.class);
+      ControllerMetrics metrics = mock(ControllerMetrics.class);
+      RetentionManager retentionManager = 
createSizeRetentionManager(tableConfig, segments, resourceManager, metrics);
+
+      retentionManager.manageSizeBasedRetention(tableConfig);
+
+      verify(resourceManager, never()).deleteSegments(anyString(), anyList());
+      verifySizeRetentionGauge(metrics, tableConfig.getTableName(), 1);
+    }
+  }
+
   @Test
   public void testSizeRetentionSkipsTableWhenActiveMetadataIsMissing() {
     TableConfig tableConfig = 
createSizeRetentionTableConfig(TableType.OFFLINE, "50B");


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

Reply via email to