diff options
author | laszlocsomor <laszlocsomor@google.com> | 2018-07-10 06:11:18 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-10 06:12:53 -0700 |
commit | d17467e3bf9ff0408d201b960af71939b55b873b (patch) | |
tree | 926b928b4fac9decd8433a616e0a0cf271a6bab0 /src/java_tools/singlejar | |
parent | 8c11fe9415e6d30069bdba559f6943747dd56e9f (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.java | 6 | ||||
-rw-r--r-- | src/java_tools/singlejar/javatests/com/google/devtools/build/zip/ZipWriterTest.java | 165 |
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)) { |