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

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit fd2c99e97664c8c098eabd603e209027351abdb8
Author: Ali Alsuliman <[email protected]>
AuthorDate: Wed Aug 21 18:07:44 2024 -0700

    [ASTERIXDB-3472][HYR] Use CleanupUtils.fail/close in 
ProbeAndJoinActivityNode
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    In the close() of the hash-join ProbeAndJoinActivityNode,
    use CleanupUtils.fail()/close() when closing the next writer.
    
    The reason is if all the build partitions are spilled, pushing
    the frames from the ProbeAndJoinActivityNode to the next writer
    will happen in the close(), not nextFrame().
    
    In such cases, any exception that happens in the next writer
    is caught in ProbeAndJoinActivityNode.close(). After that,
    it calls fail()/close() on the next writer. Those fail()/close()
    should be done using CleanupUtils so that the original caught
    exception is not lost.
    
    Ext-ref: MB-62949
    Change-Id: I1cdee5ed457b72b4f6b3731fba3542898dec9bf3
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18707
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Michael Blow <[email protected]>
---
 .../hyracks/dataflow/std/join/OptimizedHybridHashJoin.java   |  2 +-
 .../std/join/OptimizedHybridHashJoinOperatorDescriptor.java  | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
index 04f5fe8ce2..ddf94db867 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
@@ -255,7 +255,7 @@ public class OptimizedHybridHashJoin {
         }
     }
 
-    public void fail() throws HyracksDataException {
+    public void fail() {
         for (RunFileWriter writer : buildRFWriters) {
             if (writer != null) {
                 CleanupUtils.fail(writer, null);
diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
index ed53a7ec7e..91e94dcaa2 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
@@ -47,6 +47,7 @@ import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.profiling.IOperatorStats;
 import org.apache.hyracks.api.job.profiling.NoOpOperatorStats;
+import org.apache.hyracks.api.util.CleanupUtils;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
@@ -440,6 +441,7 @@ public class OptimizedHybridHashJoinOperatorDescriptor 
extends AbstractOperatorD
                         }
                         return;
                     }
+                    Throwable ex = null;
                     try {
                         try {
                             state.hybridHJ.completeProbe(writer);
@@ -470,19 +472,21 @@ public class OptimizedHybridHashJoinOperatorDescriptor 
extends AbstractOperatorD
                             joinPartitionPair(bReader, pReader, bSize, pSize, 
1);
                         }
                     } catch (Exception e) {
+                        ex = e;
                         if (state.hybridHJ != null) {
                             state.hybridHJ.fail();
                         }
                         // Since writer.nextFrame() is called in the above 
"try" body, we have to call writer.fail()
                         // to send the failure signal to the downstream, when 
there is a throwable thrown.
-                        writer.fail();
+                        CleanupUtils.fail(writer, ex);
                         // Clear temp files as this.fail() nor this.close() 
will no longer be called after close().
                         state.hybridHJ.clearBuildTempFiles();
                         state.hybridHJ.clearProbeTempFiles();
-                        // Re-throw the whatever is caught.
-                        throw e;
                     } finally {
-                        writer.close();
+                        ex = CleanupUtils.close(writer, ex);
+                    }
+                    if (ex != null) {
+                        throw HyracksDataException.create(ex);
                     }
                 }
 

Reply via email to