Repository: commons-compress
Updated Branches:
  refs/heads/master 979260717 -> f132d6c50


COMPRESS-470 make sure all ScatterZipOutputStreams are closed


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/2f75fbb5
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/2f75fbb5
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/2f75fbb5

Branch: refs/heads/master
Commit: 2f75fbb5269bd5b2c7b799b7a4f93992fa1f9196
Parents: 9792607
Author: Stefan Bodewig <bode...@apache.org>
Authored: Sun Nov 18 16:59:31 2018 +0100
Committer: Stefan Bodewig <bode...@apache.org>
Committed: Sun Nov 18 16:59:31 2018 +0100

----------------------------------------------------------------------
 src/changes/changes.xml                             |  4 ++++
 .../archivers/zip/ParallelScatterZipCreator.java    | 16 ++++++++++++++++
 .../archivers/zip/ScatterZipOutputStream.java       |  5 +++++
 3 files changed, 25 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/2f75fbb5/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 5b9619a..e16e763 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -58,6 +58,10 @@ The <action> type attribute can be add,update,fix,remove.
         TarArchiveInputStream has a new constructor-arg lenient that
         can be used to accept certain broken archives.
       </action>
+      <action issue="COMPRESS-470" type="fix" date="2018-11-18">
+        Fixed another potential resource leak in
+        ParallelScatterZipCreator#writeTo.
+      </action>
     </release>
     <release version="1.18" date="2018-08-16"
              description="Release 1.18">

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/2f75fbb5/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
index a381d0a..f2a1679 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
@@ -239,6 +239,7 @@ public class ParallelScatterZipCreator {
     public void writeTo(final ZipArchiveOutputStream targetStream)
             throws IOException, InterruptedException, ExecutionException {
 
+        try {
         // Make sure we catch any exceptions from parallel phase
         try {
             for (final Future<?> future : futures) {
@@ -261,6 +262,9 @@ public class ParallelScatterZipCreator {
         }
 
         scatterDoneAt = System.currentTimeMillis();
+        } finally {
+            ensureStreamsAreClosed();
+        }
     }
 
     /**
@@ -271,5 +275,17 @@ public class ParallelScatterZipCreator {
     public ScatterStatistics getStatisticsMessage() {
         return new ScatterStatistics(compressionDoneAt - startedAt, 
scatterDoneAt - compressionDoneAt);
     }
+
+    private void ensureStreamsAreClosed() {
+        synchronized (streams) {
+            for (final ScatterZipOutputStream scatterStream : streams) {
+                try {
+                    scatterStream.close();
+                } catch (IOException ex) {
+                    // no way to properly log this
+                }
+            }
+        }
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/2f75fbb5/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
index 7001c84..006c531 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.zip.Deflater;
 
 /**
@@ -49,6 +50,7 @@ public class ScatterZipOutputStream implements Closeable {
     private final Queue<CompressedEntry> items = new ConcurrentLinkedQueue<>();
     private final ScatterGatherBackingStore backingStore;
     private final StreamCompressor streamCompressor;
+    private AtomicBoolean isClosed = new AtomicBoolean();
 
     private static class CompressedEntry {
         final ZipArchiveEntryRequest zipArchiveEntryRequest;
@@ -124,6 +126,9 @@ public class ScatterZipOutputStream implements Closeable {
      */
     @Override
     public void close() throws IOException {
+        if (!isClosed.compareAndSet(false, true)) {
+            return;
+        }
         try {
             backingStore.close();
         } finally {

Reply via email to