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); } }
