On Mon, 26 Aug 2024 03:47:49 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> Can I please get a review of this change which proposes to fix the issue 
>> noted in https://bugs.openjdk.org/browse/JDK-8338445?
>> 
>> The JDK internal class `jdk.internal.loader.URLClassPath` is used by 
>> classloader implementations in the JDK (for example by the 
>> `java.net.URLClassLoader` and the 
>> `jdk.internal.loader.ClassLoaders$AppClassLoader`). The implementation in 
>> `URLClassPath` constructs internal `Loader`s for each URL that is in the 
>> classpath of that instance. `Loader` implementations hold on to underlying 
>> resources from which the classpath resources are served by the 
>> `URLClassPath`.
>> 
>> When constructing a `Loader`, the `URLClassPath` allows the loader 
>> implementation to parse a local classpath for that specific `Loader`. For 
>> example, the `JarLoader` (an internal class of the JDK) will parse 
>> `Class-Path` attribute in the jar file's manifest to construct additional 
>> URLs that will be included in the classpath through which resources will be 
>> served by `URLClassPath`. While parsing the local classpath, if the `Loader` 
>> instance runs into any `IOException` or a `SecurityException`, the 
>> `URLClassPath` will ignore that specific instance of the `Loader` and will 
>> not hold on to it as a classpath element.
>> 
>> As noted earlier, `Loader` instances may hold onto underlying resources. 
>> When the `URLClassPath` ignores such `Loader`(s) and doesn't call `close()` 
>> on them, then that results in potential resource leaks. The linked JBS issue 
>> demonstrates a case where the `JarFile` held by the `JarLoader` doesn't get 
>> closed (until GC garbage collects the `JarLoader` and thus the `JarFile`), 
>> when the `URLClassPath` ignores that `JarLoader` due to an `IOException` 
>> when the `JarLoader` is parsing the `Class-Path` value from the jar's 
>> manifest.
>> 
>> The commit in this PR addresses the issue by calling `close()` on such 
>> `Loader`s that get rejected by the `URLClassPath` when either an 
>> `IOException` or a `SecurityException` gets thrown when constructing the 
>> `Loader` or parsing the local classpath.
>> 
>> A new jtreg test has been introduced which consistently reproduces this 
>> issue (on Windows) and verifies the fix. Additionally tier1, tier2 and tier3 
>> testing has completed with this change without any failures.
>
> Jaikiran Pai has updated the pull request incrementally with three additional 
> commits since the last revision:
> 
>  - revert to old code comment
>  - use "JAR file" consistently in test's code comments
>  - rename closeLoaderIgnoreEx to closeQuietly

Simplify test data provision by replacing `MethodSource` with `ValueSource`.

> `@ValueSource` is one of the simplest possible sources. It lets you specify a 
> single array of literal values and can only be used for providing a single 
> argument per parameterized test invocation.

Find more details about "[Sources of 
Arguments](https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests-sources)"
 in JUnit's User-Guide.

test/jdk/java/net/URLClassLoader/JarLoaderCloseTest.java line 38:

> 36: import org.junit.jupiter.params.ParameterizedTest;
> 37: import org.junit.jupiter.params.provider.Arguments;
> 38: import org.junit.jupiter.params.provider.MethodSource;

Suggestion:

import org.junit.jupiter.params.provider.ValueSource;

test/jdk/java/net/URLClassLoader/JarLoaderCloseTest.java line 75:

> 73:                 Arguments.of("lib4.jar C:\\bar\\foo\\world/hello.jar")
> 74:         );
> 75:     }

Suggestion:

test/jdk/java/net/URLClassLoader/JarLoaderCloseTest.java line 84:

> 82:      */
> 83:     @ParameterizedTest
> 84:     @MethodSource("malformedClassPaths")

Suggestion:

    @ValueSource(strings={
        "C:\\foo\\bar\\hello/world.jar lib2.jar",
        "C:/hello/world/foo.jar",
        "lib4.jar C:\\bar\\foo\\world/hello.jar"
    })

test/jdk/java/net/URLClassLoader/JarLoaderCloseTest.java line 114:

> 112:                 Arguments.of("lib10.jar")
> 113:         );
> 114:     }

Suggestion:

test/jdk/java/net/URLClassLoader/JarLoaderCloseTest.java line 124:

> 122:      */
> 123:     @ParameterizedTest
> 124:     @MethodSource("missingButParsableClassPaths")

Suggestion:

    @ValueSource(strings={"/home/me/hello/world.jar lib9.jar", "lib10.jar"})

-------------

Changes requested by cstein (Committer).

PR Review: https://git.openjdk.org/jdk/pull/20691#pullrequestreview-2262297032
PR Review Comment: https://git.openjdk.org/jdk/pull/20691#discussion_r1732237021
PR Review Comment: https://git.openjdk.org/jdk/pull/20691#discussion_r1732236791
PR Review Comment: https://git.openjdk.org/jdk/pull/20691#discussion_r1732236240
PR Review Comment: https://git.openjdk.org/jdk/pull/20691#discussion_r1732237567
PR Review Comment: https://git.openjdk.org/jdk/pull/20691#discussion_r1732238441

Reply via email to