aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/singlejar
diff options
context:
space:
mode:
authorGravatar laszlocsomor <laszlocsomor@google.com>2018-07-10 06:11:18 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-10 06:12:53 -0700
commitd17467e3bf9ff0408d201b960af71939b55b873b (patch)
tree926b928b4fac9decd8433a616e0a0cf271a6bab0 /src/java_tools/singlejar
parent8c11fe9415e6d30069bdba559f6943747dd56e9f (diff)
Bazel server, tools: ensure Writers are closed
Follow-up to commit 09d20311d982606093ed881d779bb05a5ee70ed3. Use try-with-resources to ensure Writer objects are closed eagerly. Eagerly closing Writers avoids hanging on to file handles until the garbage collector finalizes the object, meaning Bazel on Windows (and other processes) can delete or mutate these files. Hopefully this avoids intermittent file deletion errors that sometimes occur on Windows. See https://github.com/bazelbuild/bazel/issues/5512 RELNOTES: none PiperOrigin-RevId: 203934471
Diffstat (limited to 'src/java_tools/singlejar')
-rw-r--r--src/java_tools/singlejar/java/com/google/devtools/build/singlejar/SingleJar.java6
-rw-r--r--src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java165
2 files changed, 86 insertions, 85 deletions
diff --git a/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/SingleJar.java b/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/SingleJar.java
index fb1b99714b..cb546c55ce 100644
--- a/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/SingleJar.java
+++ b/src/java_tools/singlejar/java/com/google/devtools/build/singlejar/SingleJar.java
@@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@@ -178,9 +179,8 @@ public class SingleJar {
InputStream buildInfo = createBuildData();
ZipCombiner combiner = null;
- try {
- combiner = new ZipCombiner(outputMode, createEntryFilter(normalize, allowedPaths),
- fileSystem.getOutputStream(outputJar));
+ try (OutputStream out = fileSystem.getOutputStream(outputJar)) {
+ combiner = new ZipCombiner(outputMode, createEntryFilter(normalize, allowedPaths), out);
if (launcherBin != null) {
combiner.prependExecutable(fileSystem.getInputStream(launcherBin));
}
diff --git a/src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java b/src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java
index 05f4797eaf..511b99a8b6 100644
--- a/src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java
+++ b/src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java
@@ -103,19 +103,19 @@ public class ZipWriterTest {
}
@Test public void testSingleEntry() throws IOException {
- ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8);
byte[] content = "content".getBytes(UTF_8);
- crc.update(content);
- ZipFileEntry entry = new ZipFileEntry("foo");
- entry.setSize(content.length);
- entry.setCompressedSize(content.length);
- entry.setCrc(crc.getValue());
- entry.setTime(cal.getTimeInMillis());
-
- writer.putNextEntry(entry);
- writer.write(content);
- writer.closeEntry();
- writer.close();
+ try (ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8)) {
+ crc.update(content);
+ ZipFileEntry entry = new ZipFileEntry("foo");
+ entry.setSize(content.length);
+ entry.setCompressedSize(content.length);
+ entry.setCrc(crc.getValue());
+ entry.setTime(cal.getTimeInMillis());
+
+ writer.putNextEntry(entry);
+ writer.write(content);
+ writer.closeEntry();
+ }
byte[] buf = new byte[128];
try (ZipFile zipFile = new ZipFile(test)) {
@@ -131,44 +131,46 @@ public class ZipWriterTest {
}
@Test public void testMultipleEntry() throws IOException {
- ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8);
- writer.setComment("file comment");
-
byte[] fooContent = "content".getBytes(UTF_8);
- crc.update(fooContent);
- long fooCrc = crc.getValue();
- ZipFileEntry rawFoo = new ZipFileEntry("foo");
- rawFoo.setMethod(Compression.STORED);
- rawFoo.setSize(fooContent.length);
- rawFoo.setCompressedSize(fooContent.length);
- rawFoo.setCrc(crc.getValue());
- rawFoo.setTime(cal.getTimeInMillis());
- rawFoo.setComment("foo comment");
-
- writer.putNextEntry(rawFoo);
- writer.write(fooContent);
- writer.closeEntry();
-
byte[] barContent = "stuff".getBytes(UTF_8);
- byte[] deflatedBarContent = new byte[128];
- crc.reset();
- crc.update(barContent);
- long barCrc = crc.getValue();
- deflater.setInput(barContent);
- deflater.finish();
- int deflatedSize = deflater.deflate(deflatedBarContent);
- ZipFileEntry rawBar = new ZipFileEntry("bar");
- rawBar.setMethod(Compression.DEFLATED);
- rawBar.setSize(barContent.length);
- rawBar.setCompressedSize(deflatedSize);
- rawBar.setCrc(barCrc);
- rawBar.setTime(cal.getTimeInMillis());
-
- writer.putNextEntry(rawBar);
- writer.write(deflatedBarContent, 0, deflatedSize);
- writer.closeEntry();
-
- writer.close();
+ long fooCrc = -1;
+ long barCrc = -1;
+ int deflatedSize = -1;
+ try (ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8)) {
+ writer.setComment("file comment");
+
+ crc.update(fooContent);
+ fooCrc = crc.getValue();
+ ZipFileEntry rawFoo = new ZipFileEntry("foo");
+ rawFoo.setMethod(Compression.STORED);
+ rawFoo.setSize(fooContent.length);
+ rawFoo.setCompressedSize(fooContent.length);
+ rawFoo.setCrc(crc.getValue());
+ rawFoo.setTime(cal.getTimeInMillis());
+ rawFoo.setComment("foo comment");
+
+ writer.putNextEntry(rawFoo);
+ writer.write(fooContent);
+ writer.closeEntry();
+
+ byte[] deflatedBarContent = new byte[128];
+ crc.reset();
+ crc.update(barContent);
+ barCrc = crc.getValue();
+ deflater.setInput(barContent);
+ deflater.finish();
+ deflatedSize = deflater.deflate(deflatedBarContent);
+ ZipFileEntry rawBar = new ZipFileEntry("bar");
+ rawBar.setMethod(Compression.DEFLATED);
+ rawBar.setSize(barContent.length);
+ rawBar.setCompressedSize(deflatedSize);
+ rawBar.setCrc(barCrc);
+ rawBar.setTime(cal.getTimeInMillis());
+
+ writer.putNextEntry(rawBar);
+ writer.write(deflatedBarContent, 0, deflatedSize);
+ writer.closeEntry();
+ }
byte[] buf = new byte[128];
try (ZipFile zipFile = new ZipFile(test)) {
@@ -214,25 +216,25 @@ public class ZipWriterTest {
}
@Test public void testRawZipEntry() throws IOException {
- ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8);
byte[] content = "content".getBytes(UTF_8);
- crc.update(content);
- ZipFileEntry entry = new ZipFileEntry("foo");
- entry.setVersion((short) 1);
- entry.setVersionNeeded((short) 2);
- entry.setSize(content.length);
- entry.setCompressedSize(content.length);
- entry.setCrc(crc.getValue());
- entry.setTime(cal.getTimeInMillis());
- entry.setFlags(ZipUtil.get16(new byte[]{ 0x08, 0x00 }, 0));
- entry.setInternalAttributes(ZipUtil.get16(new byte[]{ 0x34, 0x12 }, 0));
- entry.setExternalAttributes(ZipUtil.get32(new byte[]{ 0x0a, 0x09, 0x78, 0x56 }, 0));
- entry.setLocalHeaderOffset(rand.nextInt(Integer.MAX_VALUE));
-
- writer.putNextEntry(entry);
- writer.write(content);
- writer.closeEntry();
- writer.close();
+ try (ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8)) {
+ crc.update(content);
+ ZipFileEntry entry = new ZipFileEntry("foo");
+ entry.setVersion((short) 1);
+ entry.setVersionNeeded((short) 2);
+ entry.setSize(content.length);
+ entry.setCompressedSize(content.length);
+ entry.setCrc(crc.getValue());
+ entry.setTime(cal.getTimeInMillis());
+ entry.setFlags(ZipUtil.get16(new byte[] {0x08, 0x00}, 0));
+ entry.setInternalAttributes(ZipUtil.get16(new byte[] {0x34, 0x12}, 0));
+ entry.setExternalAttributes(ZipUtil.get32(new byte[] {0x0a, 0x09, 0x78, 0x56}, 0));
+ entry.setLocalHeaderOffset(rand.nextInt(Integer.MAX_VALUE));
+
+ writer.putNextEntry(entry);
+ writer.write(content);
+ writer.closeEntry();
+ }
byte[] buf = new byte[128];
try (ZipFile zipFile = new ZipFile(test)) {
@@ -258,24 +260,23 @@ public class ZipWriterTest {
}
@Test public void testPrefixFile() throws IOException, InterruptedException {
- ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8);
+ byte[] content = "content".getBytes(UTF_8);
+ try (ZipWriter writer = new ZipWriter(new FileOutputStream(test), UTF_8)) {
+ writer.startPrefixFile();
+ writer.write("#!/bin/bash\necho 'hello world'\n".getBytes(UTF_8));
+ writer.endPrefixFile();
- writer.startPrefixFile();
- writer.write("#!/bin/bash\necho 'hello world'\n".getBytes(UTF_8));
- writer.endPrefixFile();
+ crc.update(content);
+ ZipFileEntry entry = new ZipFileEntry("foo");
+ entry.setSize(content.length);
+ entry.setCompressedSize(content.length);
+ entry.setCrc(crc.getValue());
+ entry.setTime(cal.getTimeInMillis());
- byte[] content = "content".getBytes(UTF_8);
- crc.update(content);
- ZipFileEntry entry = new ZipFileEntry("foo");
- entry.setSize(content.length);
- entry.setCompressedSize(content.length);
- entry.setCrc(crc.getValue());
- entry.setTime(cal.getTimeInMillis());
-
- writer.putNextEntry(entry);
- writer.write(content);
- writer.closeEntry();
- writer.close();
+ writer.putNextEntry(entry);
+ writer.write(content);
+ writer.closeEntry();
+ }
byte[] buf = new byte[128];
try (ZipFile zipFile = new ZipFile(test)) {