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]