924060929 commented on code in PR #69133:
URL: https://github.com/apache/doris/pull/69133#discussion_r4282018943


##########
fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveScanPlanProvider.java:
##########
@@ -248,6 +247,169 @@ public boolean supportsBatchScan(ConnectorSession 
session, ConnectorTableHandle
         return partKeyNames != null && !partKeyNames.isEmpty() && 
!hiveHandle.isTransactional();
     }
 
+    @Override
+    public long streamingSplitEstimate(ConnectorSession session, 
ConnectorTableHandle handle,
+            Optional<ConnectorExpression> filter, boolean countPushdown) {
+        HiveTableHandle hiveHandle = (HiveTableHandle) handle;
+        if (hiveHandle.isTransactional()
+                || 
Boolean.FALSE.equals(session.getProperty("enable_external_table_batch_mode", 
Boolean.class))) {
+            return -1;
+        }
+        int fileThreshold = sessionInt(session, "num_files_in_batch_mode", 
DEFAULT_BATCH_THRESHOLD);
+        List<HmsPartitionInfo> partitions = hiveHandle.getPrunedPartitions();
+        long fileCount = 0;
+        int partitionCount = partitions == null ? 1 : partitions.size();
+        if (hiveHandle.getPartitionKeyNames() == null || 
hiveHandle.getPartitionKeyNames().isEmpty()) {
+            fileCount = 
fileListingCache.cachedFileCount(hiveHandle.getDbName(), 
hiveHandle.getTableName(),
+                    hiveHandle.getLocation(), Collections.emptyList());
+        } else if (partitions == null) {
+            fileCount = -1;
+        } else {
+            for (HmsPartitionInfo partition : partitions) {
+                long count = 
fileListingCache.cachedFileCount(hiveHandle.getDbName(), 
hiveHandle.getTableName(),
+                        partition.getLocation(), partition.getValues());
+                if (count < 0) {
+                    fileCount = -1;
+                    break;
+                }
+                fileCount += count;
+            }
+        }
+        // Unknown file counts must not trigger a full listing on the planning 
thread. Use a
+        // nonzero concurrency hint and let the lazy source perform the 
listing asynchronously.
+        if (fileCount < 0) {
+            return Math.max(DEFAULT_BATCH_THRESHOLD, fileThreshold);
+        }
+        int partitionThreshold = sessionInt(session, 
"num_partitions_in_batch_mode", DEFAULT_BATCH_THRESHOLD);
+        boolean partitionBatch = partitionThreshold > 0 && partitionCount >= 
partitionThreshold;
+        return fileCount >= fileThreshold || partitionBatch ? fileCount : -1;

Review Comment:
   [P2] Preserve partition-listing concurrency when enabling streaming
   
   A non-negative estimate diverts this scan through `computeBatchMode()` into 
`startStreamingSplit()`, which creates only one producer/source for the entire 
scan. `HiveSplitSource.hasNext()` then lists partition directories 
synchronously, so the bounded parallelism in `createPartitionBatchSources()` is 
bypassed for Hive.
   
   For example, with batch mode enabled, 8192 selected non-transactional Hive 
partitions, output slots, no TABLESAMPLE, and 
`num_partitions_in_batch_mode=1024`, the base can enumerate eight partition 
batches concurrently when workers are available. With cold file-list caches, 
this path instead enumerates all directories through one source. That removes 
existing remote-listing overlap; the single-partition measurements do not cover 
this case. This is a source-confirmed concurrency regression, not a measured 
claim about an end-to-end slowdown factor.
   
   Please preserve bounded partition concurrency while streaming within each 
batch. This can use the existing `streamSplits(session, request)` rather than 
adding another SPI method: make it the canonical streaming entry point, and 
explicitly extend the existing partition-batching capability contract so that 
opted-in connectors must honor each request's partition subset in both eager 
and streaming paths. Hive already reads that subset. Bounded producers can call 
it with `request.withRequiredPartitions(batch)` for disjoint batches, sharing 
assignment/backpressure and all-producers completion. Migrate the old streaming 
overload and its implementations/tests so the default bridge no longer silently 
drops request fields. Keep streaming-only connectors such as Iceberg on their 
existing whole-scan path; do not slice them into Hive-style partition batches. 
Connectors without streaming support can retain `planScanForPartitionBatch`.
   
   Please add coverage through the actual Hive mode-selection/dispatch path, 
using latch-controlled directory listing to verify concurrent progress, the 
concurrency bound, and complete unique split identities. The current 
partition-source helper tests bypass the streaming branch that causes this 
regression.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to