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

jackietien pushed a commit to branch rc/2.0.5
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit f0be2153d4e1119a9673b7f91b85630b98f7f9de
Author: Jackie Tien <[email protected]>
AuthorDate: Tue Jul 22 19:49:57 2025 +0800

    Avoid potential deadlock in TableFunctionLeafOperator
    
    (cherry picked from commit 9fb66af40840d527c0f7170579dfc1f3dc3d5736)
---
 .../operator/process/function/TableFunctionLeafOperator.java | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/function/TableFunctionLeafOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/function/TableFunctionLeafOperator.java
index 581b75b5738..a52e12358bb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/function/TableFunctionLeafOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/function/TableFunctionLeafOperator.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.rpc.TSStatusCode;
 import 
org.apache.iotdb.udf.api.relational.table.TableFunctionProcessorProvider;
 import 
org.apache.iotdb.udf.api.relational.table.processor.TableFunctionLeafProcessor;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.read.common.block.TsBlock;
@@ -44,6 +45,7 @@ public class TableFunctionLeafOperator implements 
ProcessOperator {
   private final TsBlockBuilder blockBuilder;
 
   private final TableFunctionLeafProcessor processor;
+  private volatile boolean init = false;
 
   public TableFunctionLeafOperator(
       OperatorContext operatorContext,
@@ -51,10 +53,18 @@ public class TableFunctionLeafOperator implements 
ProcessOperator {
       List<TSDataType> outputDataTypes) {
     this.operatorContext = operatorContext;
     this.processor = processorProvider.getSplitProcessor();
-    this.processor.beforeStart();
     this.blockBuilder = new TsBlockBuilder(outputDataTypes);
   }
 
+  @Override
+  public ListenableFuture<?> isBlocked() {
+    if (!init) {
+      init = true;
+      processor.beforeStart();
+    }
+    return NOT_BLOCKED;
+  }
+
   @Override
   public OperatorContext getOperatorContext() {
     return this.operatorContext;

Reply via email to