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

Volker Simonis simonisv at amazon.de
Fri Nov 15 11:30:28 UTC 2019


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