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

Volker Simonis simonisv at amazon.de
Fri Nov 15 15:34:06 UTC 2019


On 15.11.19 13:44, Langer, Christoph wrote:
> Hi Volker,
> 
> Looks awesome now ��
> 

Thanks :)

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

It's needed for "Files.deleteIfExists(zipFile)" in the finally block..

> 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
>>
> 




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