RFR [9] 8180155: WebSocket secure connection get stuck after onOpen

Pavel Rappo pavel.rappo at oracle.com
Thu Jun 1 11:32:38 UTC 2017


Hi Daniel,

Thanks a lot for looking into this! I agree there's an issue exactly where you
pointed at. I'm sure it would be a good idea to write a test that covers this.
Unfortunately it would be quite a challenging task.

I tried to rewrite the state machine the way that both fixes this bug and makes
the code easier to follow (I'm biased here obviously).

Please have a look at the updated webrev and tell me if you're generally happy
with this approach:

    http://cr.openjdk.java.net/~prappo/8180155/webrev.01/

So here are a couple of points to keep in mind while reasoning about the code:

  1. There's at most one channel readiness event registered at any given time
  2. There's at most one thread executing `pushContinuously` at any given time
     (enforced by CooperativeHandler)

Thanks!

> On 31 May 2017, at 12:13, Daniel Fuchs <daniel.fuchs at oracle.com> wrote:
> 
> Hi Pavel,
> 
> Receiver.java:
> 
> 120     private void pushContinuously() {
> 121         while (true) {
> 122             if (!readable.get()) {
> 123                 if (!initialized) {
> 124                     initialized = true;
> 125                     try {
> 126                         channel.registerEvent(event);
> 127                     } catch (IOException e) {
> 128                         messageConsumer.onError(e);
> 129                     }
> 130                 }
> 131                 break;
> 132             } else if (demand.get() > 0 && !handler.isStopped()) {
> 133                 pushOnce();
> 134             } else {
> 135                 break;
> 136             }
> 137         }
> 138     }
> 
> I think you might have an issue here, if the initialBuffer
> already contains all the data that there is to be read, then
> the readable.get() will be false, initialized will be false,
> pushOnce() will not be called, and you're going to register
> an event that will never be triggered.
> 
> best regards,
> 
> -- daniel
> 
> On 31/05/2017 11:30, Pavel Rappo wrote:
>> Hello,
>> Please review the following change:
>>  http://cr.openjdk.java.net/~prappo/8180155/webrev.00/
>> This change addresses 2 separate issues:
>>     https://bugs.openjdk.java.net/browse/JDK-8180155
>>     https://bugs.openjdk.java.net/browse/JDK-8156518
>> The first one is a busy-wait for data on the socket which manifests itself as
>> non-returning invocation of WebSocket.request(long).
>> The second one is an issue with a timeout for an asynchronous HTTP request.
>> This issue affects both HttpClient and WebSocket implementations.
>> Thanks,
>> -Pavel
> 



More information about the net-dev mailing list