Thanks for this fix Julia!

WRT to the test, I'd suggest this to make it more maintainable:

        static final int REQUEST_COUNT = 5;
        static final int URI_COUNT     = 6;
 67     static final CyclicBarrier barrier =
             new CyclicBarrier(REQUEST_COUNT * URI_COUNT);


 257     void doClient(List<URI> uris) {
             assert uris.size() == URI_COUNT;
 258         barrier.reset();
 ...
 263         for (int i = 0; i < REQUEST_COUNT; i++) {

this should ensure that the number of parties involved in the
cyclic barrier remain consistent with the number of requests that
the test sends concurrently.

best regards,

-- daniel

On 01/11/2019 16:48, Julia Boes wrote:
Hi,

This fix addresses an issue in AuthenticationFilter.Cache::remove that can lead to a ConcurrentModificationException. The cache is implemented as LinkedList, the method iterates over the list and potentially removes items without using an iterator.

To reproduce the bug, multiple requests are sent asynchronously so that successful response headers might arrive concurrently and compete in updating the cache. This increases the chances to trigger the removal of a previously cached credential while storing the credentials of the next response. Under these circumstances, ConcurrentModificationException is thrown with very high frequency (if not always).

The proposed fix replaces LinkedList with CopyOnWriteArrayList to preclude the exception.

Bug: https://bugs.openjdk.java.net/browse/JDK-8232853

Webrev: http://cr.openjdk.java.net/~jboes/webrevs/8232853/webrev.01/index.html

The test fails reliably without the fix, and passes with it (jdk_net tests run 50 times).


Regards,

Julia



Reply via email to