RFR(S): 8155590: Dubious collection management in sun.net.www.http.KeepAliveCache

Roger Riggs roger.riggs at oracle.com
Wed Oct 18 18:37:13 UTC 2017


Hi Christoph,


Right, my mistake, I meant CME.  My point was that ArrayDeque does not 
throw CME from remove().
It is not multi-thread safe and does not check for CME.

That remove might have been coded using the iterator:

synchronized boolean remove(HttpClient h) {
     for (Iterator<KeepAliveEntry> it =this.iterator();
          it.hasNext();) {
         KeepAliveEntry curr = it.next();
         if (curr.hc == h) {
             it.remove();
             return true;
         }
     }
     return false;
}


your choice

Thanks, Roger





On 10/18/17 9:47 AM, Langer, Christoph wrote:
>
> Hi Roger,
>
> maybe we have a little disconnect here in understanding. I thought you 
> mean ClassCastException with CCE but I don’t see this mentioned 
> anywhere. My comment talks about ConcurrentModificationException 
> (CME). I mentioned that because, when the Collection is modified while 
> iterating (which I do by calling super.remove()) then the next call to 
> the Iterator would throw a CME. But we don’t go back to the iterator 
> as we return after removing.
>
> Nevertheless, I can still remove the comment or change it… let me know.
>
> Thanks
>
> Christoph
>
> *From:*Roger Riggs [mailto:roger.riggs at oracle.com]
> *Sent:* Mittwoch, 18. Oktober 2017 17:28
> *To:* Langer, Christoph <christoph.langer at sap.com>; 
> net-dev at openjdk.java.net
> *Subject:* Re: RFR(S): 8155590: Dubious collection management in 
> sun.net.www.http.KeepAliveCache
>
> Hi Christoph,
>
> Looks ok.
>
> The comment in remove() about CCE can be removed. ArrayDeque is not 
> thread safe
> and doesn't check for CCE (and the method is synchronized).
>
> Thanks, Roger
>
> On 10/18/17 6:05 AM, Langer, Christoph wrote:
>
>     Hi Roger,
>
>     thanks for looking. So you motivated me to do some more cleanup. J
>
>     Here is the new webrev:
>     http://cr.openjdk.java.net/~clanger/webrevs/8155590.1/
>     <http://cr.openjdk.java.net/%7Eclanger/webrevs/8155590.1/>
>
>     I replaced the Stack with an ArrayDeque and did some more rather
>     cosmetical changes to make KeepAliveCache more appealing. I
>     verified the change by running the jtreg tests
>     jdk/sun/net/www/http/* and it all passes.
>
>     As for the CCE: I don’t think this should be checked as the
>     Stack/ArrayDeque is typed to KeepAliveEntry and no code appears to
>     be in place which could trick this.
>
>     Best regards
>
>     Christoph
>
>     *From:*net-dev [mailto:net-dev-bounces at openjdk.java.net] *On
>     Behalf Of *Roger Riggs
>     *Sent:* Dienstag, 17. Oktober 2017 16:53
>     *To:* net-dev at openjdk.java.net <mailto:net-dev at openjdk.java.net>
>     *Subject:* Re: RFR(S): 8155590: Dubious collection management in
>     sun.net.www.http.KeepAliveCache
>
>     Hi,
>
>     Keep the synchronized, it will be low overhead since the Vector
>     operations
>     are synchronized and in the same thread.
>
>     I think a CCE could occur during the iteration to find the entry
>     when Vector.Itr.next() checks.
>
>     (It you want to more radical fix, replace the Vector with
>     something more current.
>     It would be one less Vector).
>
>     Roger
>
>
>     On 10/16/17 2:33 AM, Langer, Christoph wrote:
>
>         Hi Vyom,
>
>         thanks for your feedback.
>
>         I’m not so sure about dropping “synchronized”. In the new
>         remove method of ClientVector we are iterating ourself. If
>         this is not done under synchronization, there is risk to run
>         into a ConcurrentModificationException. But under the
>         assumption that all access to ClientVector comes from
>         synchronized methods of KeepAliveCache, one could argue to
>         drop all synchronized modifiers for ClientVector, though.
>
>         Let’s wait for other opinions J
>
>         Best regards
>
>         Christoph
>
>         *From:*net-dev [mailto:net-dev-bounces at openjdk.java.net] *On
>         Behalf Of *vyom tewari
>         *Sent:* Montag, 16. Oktober 2017 10:27
>         *To:* net-dev at openjdk.java.net <mailto:net-dev at openjdk.java.net>
>         *Subject:* Re: RFR(S): 8155590: Dubious collection management
>         in sun.net.www.http.KeepAliveCache
>
>         Hi Christoph,
>
>         Thanks for doing this, i think you don't need to synchronize
>         the "remove(HttpClient h)".  This remove is get called from
>         synchronize "remove (HttpClient h, Object obj)" and the
>         underline data structure is which is
>         java.util.Vector(ClientVector extends java.util.Stack) is also
>         thread safe.
>
>         What do you think ?
>
>         Thanks,
>
>         Vyom
>
>         On Monday 16 October 2017 12:52 PM, Langer, Christoph wrote:
>
>             Hi,
>
>             Here is a proposal for a fix for bug 8155590. I already
>             made this fix a while ago in our JDK clone and I’d like to
>             contribute this.
>
>             Bug: https://bugs.openjdk.java.net/browse/JDK-8155590
>
>             Webrev:
>             http://cr.openjdk.java.net/~clanger/webrevs/8155590.0/
>             <http://cr.openjdk.java.net/%7Eclanger/webrevs/8155590.0/>
>
>             Please review.
>
>             Thanks
>
>             Christoph
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/net-dev/attachments/20171018/21911bc9/attachment-0001.html>


More information about the net-dev mailing list