RFR(XS): 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()

Langer, Christoph christoph.langer at sap.com
Fri Nov 15 12:44:54 UTC 2019


Hi Volker,

Looks awesome now ��

Please remove the "import java.nio.file.Files;" statement before pushing.

Cheers
Christoph


> -----Original Message-----
> From: Volker Simonis <simonisv at amazon.de>
> Sent: Freitag, 15. November 2019 12:30
> To: Langer, Christoph <christoph.langer at sap.com>; Volker Simonis
> <simonisv at amazon.com>
> Cc: core-libs-dev at openjdk.java.net; Lance Andersen
> <lance.andersen at oracle.com>
> Subject: Re: RFR(XS): 8234011: (zipfs) Memory leak in
> ZipFileSystem.releaseDeflater()
> 
> On 14.11.19 18:24, Langer, Christoph wrote:
> > Hi Volker,
> >
> > funny, I didn’t get aware of your mails until I now recognized that my
> > mail client moved your mail into the “Amazon-advertisement-spam” folder
> > of my mailbox. �� I have to check and modify my filter rules…
> >
> > Ok, let’s continue the little bike-shed about the test then.
> >
> > First, thanks for making the adaptions. The test looks better already. I
> > still have a few points:
> >
> > 1. The imports of java.io.File and java.util.HashMap can be removed now.
> >
> 
> Done.
> 
> > 2. The two try statements in lines 54 and 55 look a bit awkward. I guess
> > you could just use the one try-with-resource from line 55 and put the
> > cleanup in its finally block.
> >
> 
> Done.
> 
> > 3. Maybe you also want to attempt a Files.deleteIfExists(zipFile);
> > before opening the Zip file system? Otherwise there is a remote
> > possibility that ReleaseDeflaterTest.zip already exists and the test
> > will fail because of this.
> >
> 
> That doesn't harm. The file will just be reused.
> 
> > 4. I’m also not a fan of the SkippedException here. I for myself would
> > probably not get aware of a skip. And if somebody changes the
> > implementation of ZipFileSystem, why shouldn’t he/she/… immediately
> > recognize this and adapt the test in the same change?
> >
> 
> OK, changed it to a RuntimeException now.
> 
> Here's the new webrev:
> 
> http://cr.openjdk.java.net/~simonis/webrevs/2019/8234011.v3
> 
> > Best regards
> >
> > Christoph
> >
> > *From:* Lance Andersen <lance.andersen at oracle.com>
> > *Sent:* Donnerstag, 14. November 2019 17:38
> > *To:* Volker Simonis <simonisv at amazon.com>
> > *Cc:* Langer, Christoph <christoph.langer at sap.com>; Simonis, Volker
> > <simonisv at amazon.de>; core-libs-dev at openjdk.java.net
> > *Subject:* Re: RFR(XS): 8234011: (zipfs) Memory leak in
> > ZipFileSystem.releaseDeflater()
> >
> >     On Nov 14, 2019, at 11:27 AM, Volker Simonis <simonisv at amazon.com
> >     <mailto:simonisv at amazon.com>> wrote:
> >
> >     On 14.11.19 16:27, Lance Andersen wrote:
> >
> >         Hi Volker,
> >
> >             On Nov 14, 2019, at 8:53 AM, Volker Simonis
> >             <simonisv at amazon.com
> >             <mailto:simonisv at amazon.com><mailto:simonisv at amazon.com>>
> wrote:
> >
> >             On 13.11.19 18:54, Lance Andersen wrote:
> >
> >                 Hi Volker,
> >                 Thank you for doing this.
> >                 As Christoph mentioned,  you can just do Path.of() and
> >                 create the file in the work directory for the test.
> >
> >
> >             Done.
> >
> >
> >                 If possible, I would use TestNG as that is consistent
> >                 with the vast majority of the tests.
> >
> >
> >             I don't particularly like to nest one test harness within
> >             another one :)
> >             But seriously, I think using JUnit or TestNG makes sens if
> >             you write a whole test suit which uses the features of such
> >             a test harness (e.g. tear up, tear down, etc.)
> >
> >         Well you could use @AfterMethod or @AfterClass to clean up files
> >         etc… ;-)
> >
> >             But for small trivial tests I really prefer to use plain
> >             JTreg. This also has the big advantage that is becomes
> >             trivial to run such a test stand-alone which may come handy
> >             if you have to debug it.
> >
> >         Easy enough to add a main method to call your test method (there
> >         are some testng tests I have seen in the workspace that do that)
> >
> >
> >             So if you don't insist, I'll prefer to leave the test as it is.
> >
> >         While I would prefer it for new tests, I am not insisting you
> >         need to change the test….. ;-)
> >
> >
> >     OK, thanks. I might consider using it in the future :)
> >
> >
> >
> >
> >                 I also believe the rest of the comments below are worth
> >                 addressing.
> >
> >
> >             Besides that, I've addressed all the other points mentioned
> >             by Christoph. Please find the new webrev at:
> >
> >             http://cr.openjdk.java.net/~simonis/webrevs/2019/8234011.v1/
> >
> >         line 55 you can remove the creation of the HashMap
> >
> >
> >     Good catch! Removed.
> >
> >
> >         line 73, do you really need the equals check seeing you do not
> >         do anything?
> >
> >
> >     Removed. It was a leftover of local testing.
> >
> >
> >         I am not sure throwing a SkippedException is correct,  I would
> >         probably throw a RuntimeException
> >
> >
> >     As I wrote in the answer to Christoph, this is a relatively new
> >     feature of JTreg [1] which I think was introduced for exactly such
> >     kind of situations where a tests detects at runtime only, that for
> >     some reasons he can't test the issue he was supposed to test. More
> >     and more tests are adapting it now [2]. The SkippedException will be
> >     handled specially by JTreg and let the test pass, but with status
> >     "Passed.Skipped" (plus exception message) instead of just "Passed"
> >     (plis "Execution successful").
> >
> >     Here's the next webrev:
> >
> >     http://cr.openjdk.java.net/~simonis/webrevs/2019/8234011.v2/
> >
> > Thank you for the updates.  I am still a bit skeptical of the use of
> > SkippedException here as you would never see the test is no longer
> > passing due to an implementation change unless you are specifically
> > looking for it.
> >
> > That being said,  if others who have more experience with using this
> > Exception in a similar scenario are good, then I am good.
> >
> > So once we get a couple of other views on this from others with a thumbs
> > up for using SkippedException here, we are good to go :-)
> >
> > Best
> >
> > Lance
> >
> >
> >
> >
> >     Thanks,
> >     Volker
> >
> >     [1]https://openjdk.java.net/jtreg/faq.html#what-if-a-test-does-not-
> apply-in-a-given-situation
> >     [2]https://bugs.openjdk.java.net/browse/JDK-8208655
> >
> >
> >         Best
> >         Lance
> >
> >
> >             Thank you and best regards,
> >             Volker
> >
> >
> >                 Thank you again for the fix
> >                 Best
> >                 Lance
> >
> >                     On Nov 13, 2019, at 11:26 AM, Langer, Christoph
> >                     <christoph.langer at sap.com
> >
> <mailto:christoph.langer at sap.com><mailto:christoph.langer at sap.com>
> >                     <mailto:christoph.langer at sap.com>> wrote:
> >
> >                     Hi Volker,
> >
> >                     good catch in ZipFileSystem ��The fix is the right
> >                     thing to do.
> >
> >                     I have a few remarks to the test, though:
> >
> >                     Line 52, initialization of the File object: I think
> >                     you should just do Path zipFile =
> >                     Paths.get("file.zip"); When the test is run in the
> >                     jtreg framework, it's running in its own scratch
> >                     directory, so no need to use java.io.tmpdir. You can
> >                     also leave cleanup to jtreg and don't need to delete
> >                     the file in the end (in the finally block). However,
> >                     you should probably check whether the file exists in
> >                     the beginning and delete it in that case.
> >
> >                     Line 55ff: You don't need to use this URI thing any
> >                     more. You can simply do: try (FileSystem fs =
> >                     FileSystems.newFileSystem(zipFile, Map.of("create",
> >                     true))) { (line 58).
> >
> >                     Line 61/62: You're using a Vector, wow ��You should
> >                     rather use ArrayList, I think...
> >
> >                     Line 85: This should rather be:
> >                                         @SuppressWarnings("unchecked")
> >                                         int inflater_count =
> >                     ((List<Inflater>)inflaters.get(fs)).size();
> >                     Same for line 89.
> >
> >                     Line 93 (Catch clause): I think we should fail in
> >                     that case, too. Otherwise, if the implementation
> >                     would change, the test could run unnoticed for
> >                     years, testing basically nothing...
> >
> >                     Best regards,
> >                     Christoph
> >
> >
> >
> >                         -----Original Message-----
> >                         From: core-libs-dev
> >                         <core-libs-dev-bounces at openjdk.java.net
> >                         <mailto:core-libs-dev-
> bounces at openjdk.java.net><mailto:core-libs-dev-
> bounces at openjdk.java.net>
> >                         <mailto:core-libs-dev-bounces at openjdk.java.net>>
> >                         On Behalf
> >                         Of Simonis, Volker
> >                         Sent: Mittwoch, 13. November 2019 16:23
> >                         To:core-libs-dev at openjdk.java.net
> >                         <mailto:core-libs-dev at openjdk.java.net><mailto:core-libs-
> dev at openjdk.java.net>
> >                         <mailto:core-libs-dev at openjdk.java.net>
> >                         Subject: RFR(XS): 8234011: (zipfs) Memory leak in
> >                         ZipFileSystem.releaseDeflater()
> >
> >                         Hi,
> >
> >                         can I please get a review for this trivial fix
> >                         of an old copy-and-paste error:
> >
> >                         http://cr.openjdk.java.net/~simonis/webrevs/2019/8234011/
> >                         https://bugs.openjdk.java.net/browse/JDK-8234011
> >
> >                         ZipFileSystem caches MAX_FLATER (currently 20)
> >                         Inflater/Deflater objects.
> >                         However the logic for reusing Deflaters is wrong
> >                         because it references the
> >                         Inflater List when checking against the number
> >                         of already cached objects.
> >                         This seems like a day-one copy and paste error.
> >
> >                         Notice that this issue is not as critical as it
> >                         appears, because retaining of
> >                         additional Deflaters only happens when more than
> >                         MAX_FLATER are used
> >                         and released concurrently. I.e. the maximum
> >                         number of cached Deflaters is
> >                         the maximal number of Deflaters that are
> >                         released while no new Deflater is
> >                         requested. In practice this is usually still a
> >                         small number, less than
> >                         MAX_FLATERS. Nevertheless we can easily
> >                         construct an example which
> >                         demonstrates the memory leak (see the JTRegtest
> >                         in the patch) and because
> >                         the fix is trivial we should really fix this.
> >
> >                         Thank you and best regards,
> >                         Volker
> >
> >
> >
> >                         Amazon Development Center Germany GmbH
> >                         Krausenstr. 38
> >                         10117 Berlin
> >                         Geschaeftsfuehrung: Christian Schlaeger, Ralf
> >                         Herbrich
> >                         Eingetragen am Amtsgericht Charlottenburg unter
> >                         HRB 149173 B
> >                         Sitz: Berlin
> >                         Ust-ID: DE 289 237 879
> >
> >                 <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><mailto:Lance.Andersen at oracle.com
> >
> >                 <mailto:Lance.Andersen at oracle.com>
> >
> >
> >
> >
> >
> >             Amazon Development Center Germany GmbH
> >             Krausenstr. 38
> >             10117 Berlin
> >             Geschaeftsfuehrung: Christian Schlaeger, Ralf Herbrich
> >             Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
> >             Sitz: Berlin
> >             Ust-ID: DE 289 237 879
> >
> >         <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>
> >         <mailto:Lance.Andersen at oracle.com>
> >
> >
> >
> >
> >
> >     Amazon Development Center Germany GmbH
> >     Krausenstr. 38
> >     10117 Berlin
> >     Geschaeftsfuehrung: Christian Schlaeger, Ralf Herbrich
> >     Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
> >     Sitz: Berlin
> >     Ust-ID: DE 289 237 879
> >
> > <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>
> >
> >
> >
> 
> 
> 
> 
> Amazon Development Center Germany GmbH
> Krausenstr. 38
> 10117 Berlin
> Geschaeftsfuehrung: Christian Schlaeger, Ralf Herbrich
> Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
> Sitz: Berlin
> Ust-ID: DE 289 237 879
> 



More information about the core-libs-dev mailing list