RFR: JDK-8225507: (zipfs): No space left on device not thrown with ZipFileSystem
Lance Andersen
lance.andersen at oracle.com
Wed Feb 5 23:34:32 UTC 2020
Hi Jaikiran,
I think overall the patch is correct but it would be good to get some extra eyes on this.
> On Jan 31, 2020, at 1:32 AM, Jaikiran Pai <jai.forums2013 at gmail.com> wrote:
>
> Initial discussion about this was done here
> https://mail.openjdk.java.net/pipermail/nio-dev/2020-January/007014.html
>
> I looked into this in a bit more detail. The first place where this
> IOException is caught and swallowed involves the following code:
>
> try {
> if (e.type == Entry.COPY) {
> // entry copy: the only thing changed is the "name"
> // and "nlen" in LOC header, so we update/rewrite the
> // LOC in new file and simply copy the rest (data and
> // ext) without enflating/deflating from the old zip
> // file LOC entry.
> if (buf == null)
> buf = new byte[8192];
> written += copyLOCEntry(e, true, os, written, buf);
> } else { // NEW, FILECH or CEN
> e.locoff = written;
> written += e.writeLOC(os); // write loc header
> written += writeEntry(e, os);
> }
> elist.add(e);
> } catch (IOException x) {
> x.printStackTrace(); // skip any in-accurate entry
> }
>
> In this, the copyLOCEntry(...), the writeLOC(...) and the
> writeEntry(...) methods can potentially throw the IOException. Looking
> at each of these methods,
>
> - The copyLOCEntry throws an IOException if it fails to write out
> data to the OutputStream. It additionally throws a ZipException (which
> is an IOException) if it fails to read a LOC.
>
> - The Entry#writeLOC method takes a OutputStream and writes out LOC
> data to that stream and can potentially throw an IOException if the
> writes to the stream fail.
>
> - The writeEntry method writes out the actual data to the
> OutputStream and uses the "transferTo" API. Additionally this method
> also deletes (any) temp file that might have been created for holding
> the "Entry" content. Either of these cases can throw an IOException.
>
> So in all these above 3 methods, the potential IOException(s) are all
> genuine issue that I think should propagate back. The only one that I'm
> unsure is the case in writeEntry, where it does a Files.delete(e.file)
> where e.file is any temporary file that was created previously to hold
> on to the entry data. Should any IOException on this line propagate
> back? Perhaps it should, or else it would potentially leave the temp
> file (containing the actual data) around without the user knowing that
> it got left behind.
I think this is something we need to decide. I could argue this both ways.
>
> The other place where the IOException gets swallowed is this block:
>
> try {
> if (buf == null)
> buf = new byte[8192];
> written += copyLOCEntry(e, false, os, written, buf);
> elist.add(e);
> } catch (IOException x) {
> x.printStackTrace(); // skip any wrong entry
> }
>
> In this case the only potential call which can trigger the IOException
> is the copyLOCEntry, which is actually the same method that we analyzed
> above.
>
> So overall, I think propagating these IOException(s) should be fine
> since they expose any real underlying issue.
>
> I've created a webrev which includes this change and is placed here[1].
> If the idea to propagate this exception back and the above analysis
> seems right, can I get a review and a sponsor for the patch please?
>
> Given the nature of this issue, I couldn't think of any easy and
> consistent test case to add for this change. However, I have ran the
> test/jdk/jdk/nio/ jtreg tests and they have allowed passed:
I don’t believe there is a way to automate a test for this.
Best
Lance
>
> jtreg -jdk:build/macosx-x86_64-server-release/images/jdk test/jdk/jdk/nio/
>
>
> Test results: passed: 21
>
>
> [1] https://cr.openjdk.java.net/~jpai/webrev/8225507/1/webrev/
>
> -Jaikiran
>
>
>
<http://oracle.com/us/design/oracle-email-sig-198324.gif>
<http://oracle.com/us/design/oracle-email-sig-198324.gif> <http://oracle.com/us/design/oracle-email-sig-198324.gif>
<http://oracle.com/us/design/oracle-email-sig-198324.gif>Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
Oracle Java Engineering
1 Network Drive
Burlington, MA 01803
Lance.Andersen at oracle.com <mailto:Lance.Andersen at oracle.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/nio-dev/attachments/20200205/c5f102e8/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: oracle_sig_logo.gif
Type: image/gif
Size: 658 bytes
Desc: not available
URL: <https://mail.openjdk.java.net/pipermail/nio-dev/attachments/20200205/c5f102e8/oracle_sig_logo-0001.gif>
More information about the nio-dev
mailing list