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 5ba9df1916f Use total stream partition count for realtime partition 
function divisor (#18708)
5ba9df1916f is described below

commit 5ba9df1916fc390bdab914023178da2900ae56f8
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Mon Jun 8 18:05:33 2026 -0700

    Use total stream partition count for realtime partition function divisor 
(#18708)
---
 .../realtime/RealtimeSegmentDataManager.java       | 39 ++++++++++++----------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/data/manager/realtime/RealtimeSegmentDataManager.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/data/manager/realtime/RealtimeSegmentDataManager.java
index 3b0d9d72202..d918355b490 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/data/manager/realtime/RealtimeSegmentDataManager.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/data/manager/realtime/RealtimeSegmentDataManager.java
@@ -2023,29 +2023,32 @@ public class RealtimeSegmentDataManager extends 
SegmentDataManager {
         ColumnPartitionConfig columnPartitionConfig = entry.getValue();
         String partitionFunctionName = columnPartitionConfig.getFunctionName();
 
-        // NOTE: Here we compare the number of partitions from the config and 
the stream, and log a warning and emit a
-        //       metric when they don't match, but use the one from the 
stream. The mismatch could happen when the
-        //       stream partitions are changed, but the table config has not 
been updated to reflect the change.
-        //       In such case, picking the number of partitions from the 
stream can keep the segment properly
-        //       partitioned as long as the partition function is not changed.
+        // NOTE: Here we compare the number of partitions from the config and 
the stream, and log a warning when they
+        //       don't match, but use the one from the stream. The mismatch 
could happen when the stream partitions are
+        //       changed, but the table config has not been updated to reflect 
the change. In such case, picking the
+        //       number of partitions from the stream can keep the segment 
properly partitioned as long as the
+        //       partition function is not changed.
         int numPartitions = columnPartitionConfig.getNumPartitions();
         try {
-          // TODO: currentPartitionGroupConsumptionStatus should be fetched 
from idealState + segmentZkMetadata,
-          //  so that we get back accurate partitionGroups info
-          //  However this is not an issue for Kafka, since partitionGroups 
never expire and every partitionGroup has
-          //  a single partition
-          //  Fix this before opening support for partitioning in Kinesis
-          int numPartitionGroups = 
_partitionMetadataProvider.computePartitionGroupMetadata(_clientId, 
_streamConfig,
-              Collections.emptyList(), /*maxWaitTimeMs=*/15000).size();
-
-          if (numPartitionGroups != numPartitions) {
-            _segmentLogger.info(
+          // Use the total stream partition count as the partition function 
divisor. The upstream producer hashed each
+          // key over the full partition count, so the divisor must match that 
count for the per-segment partition
+          // metadata (and the partition pruning that relies on it) to be 
correct. fetchPartitionCount() returns that
+          // full count; computePartitionGroupMetadata().size() does not - 
when the table consumes only a subset of
+          // stream partitions it returns the subset size, which is wrong here.
+          // TODO: This is correct for Kafka, where partition ids are a stable 
contiguous range. It does not make
+          //   partitioning work for Kinesis, where shards split/merge and ids 
are not a contiguous 0..N range -
+          //   fetchPartitionCount() returns the total shard count there. Fix 
this before opening support for
+          //   partitioning in Kinesis.
+          int numStreamPartitions = 
_partitionMetadataProvider.fetchPartitionCount(/*maxWaitTimeMs=*/10_000);
+
+          if (numStreamPartitions != numPartitions) {
+            _segmentLogger.warn(
                 "Number of stream partitions: {} does not match number of 
partitions in the partition config: {}, "
-                    + "using number of stream " + "partitions", 
numPartitionGroups, numPartitions);
-            numPartitions = numPartitionGroups;
+                    + "using number of stream " + "partitions", 
numStreamPartitions, numPartitions);
+            numPartitions = numStreamPartitions;
           }
         } catch (Exception e) {
-          _segmentLogger.warn("Failed to get number of stream partitions in 
5s, "
+          _segmentLogger.error("Failed to get number of stream partitions in 
10s, "
               + "using number of partitions in the partition config: {}", 
numPartitions, e);
           createPartitionMetadataProvider("Timeout getting number of stream 
partitions");
         }


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

Reply via email to