Merge branch 'gerrit/trinity' into 'gerrit/goldfish'

Ext-ref: MB-62982
Change-Id: Ib995f39fe3b83cf695a9f9be771989a23c4f0dad
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameReader.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameReader.java
index 62eacc8..3e7e2ab 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameReader.java
@@ -20,7 +20,7 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public interface IFrameReader {
+public interface IFrameReader extends AutoCloseable {
     void open() throws HyracksDataException;
 
     boolean nextFrame(IFrame frame) throws HyracksDataException;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameWriter.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameWriter.java
index 19d7afb..a49f226 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameWriter.java
@@ -56,7 +56,7 @@
  * Note: If the call to {@link IFrameWriter#open()} failed, the {@link IFrameWriter#close()} must still be called by the
  * producer.
  */
-public interface IFrameWriter {
+public interface IFrameWriter extends AutoCloseable {
     /**
      * First call to allocate any resources.
      */
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IPartitionCollector.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IPartitionCollector.java
index 4a977ec..7b52875 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IPartitionCollector.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IPartitionCollector.java
@@ -25,7 +25,7 @@
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.partitions.PartitionId;
 
-public interface IPartitionCollector {
+public interface IPartitionCollector extends AutoCloseable {
     public JobId getJobId();
 
     public ConnectorDescriptorId getConnectorId();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
index 0c5c233..0bf74ee 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
@@ -63,6 +63,7 @@
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.api.resources.IDeallocatable;
 import org.apache.hyracks.api.result.IResultPartitionManager;
+import org.apache.hyracks.api.util.CleanupUtils;
 import org.apache.hyracks.api.util.ExceptionUtils;
 import org.apache.hyracks.api.util.JavaSerializationUtils;
 import org.apache.hyracks.control.common.job.PartitionState;
@@ -406,6 +407,7 @@
         if (aborted) {
             return;
         }
+        Throwable originalEx = null;
         try {
             collector.open();
             try {
@@ -430,23 +432,24 @@
                             buffer.compact();
                         }
                     } catch (Exception e) {
-                        try {
-                            writer.fail();
-                        } catch (HyracksDataException e1) {
-                            e.addSuppressed(e1);
-                        }
-                        throw e;
+                        originalEx = e;
+                        CleanupUtils.fail(writer, originalEx);
                     } finally {
-                        writer.close();
+                        originalEx = CleanupUtils.closeSilently(writer, originalEx);
                     }
                 } finally {
-                    reader.close();
+                    originalEx = CleanupUtils.closeSilently(reader, originalEx);
                 }
+            } catch (Exception e) {
+                originalEx = ExceptionUtils.suppress(originalEx, e);
             } finally {
-                collector.close();
+                originalEx = CleanupUtils.closeSilently(collector, originalEx);
             }
         } catch (Exception e) {
-            throw HyracksDataException.create(e);
+            originalEx = ExceptionUtils.suppress(originalEx, e);
+        }
+        if (originalEx != null) {
+            throw HyracksDataException.create(originalEx);
         }
     }