8201474: (so) Socket adaptor connect(InetAddress, timeout) succeeds when connection fails

Hamlin Li huaming.li at oracle.com
Tue Apr 17 07:04:27 UTC 2018



On 17/04/2018 2:50 PM, Alan Bateman wrote:
> On 17/04/2018 06:26, Hamlin Li wrote:
>>
>> :
>>
>> Yes, you're right too.
>> But, the root cause for "pollConnected changed the channel state to 
>> ST_CONNECTED" is that pollConnect only check whether return result of 
>> Net.poll(...) > 0, it does not check whether it is/includes POLLERR, 
>> POLLHUP, POLLNVAL, so endFinishConnect is passed true for parameter 
>> completed when events is/includes POLLERR, POLLHUP, POLLNVAL, this 
>> will cause "state = ST_CONNECTED;" in endFinishConnect.
>> To fix this, completed should be calculated separately from polled, 
>> so when POLLERR, POLLHUP, POLLNVAL is included in result of 
>> Net.poll(), polled == true, but completed == false, endFinishConnect 
>> will not set "state = ST_CONNECTED;". In this way, there is no need 
>> to treat pollConnect differently from other pollXXX, and pass false 
>> explicitly to completed parameter of endFinishConnect.
>> Hope I have explained clearly.
> It's important that the pollXXX methods return true whenever any 
> events, including POLLERR or POLLHUP, are polled. Consider the following:
>
> Socket s = sc.socket();
> s.setSoTimeout(10*1000);
> int n = s.getInputStream().read(b);
>
> Assuming no bytes are available, this will block in poll. Now suppose 
> the connection is terminated, say RST. In that case, you should see a 
> POLLHUP. It's important that the pollRead returns true so the socket 
> adaptor can attempt a read and throw the exception. If POLLHUP is 
> ignored then this will spin.
>
> I know you aren't suggesting it returning false but it's important to 
> understand that before coming to the Thread.interrupt case (which is 
> what I think you are really asking about). If the thread is 
> interrupted when blocked in poll then the begin/end around the 
> blocking call will ensure that the channel is closed. This will cause 
> the poll to wakeup. It doesn't matter if pollXXX throws 
> AsynchronousCloseException or not as the socket adaptor will follow it 
> with a read or finishConnect and that will cause the IOException to be 
> thrown. In other words, the value passed to end doesn't really matter. 
> It did matter in the endFinishConnect case because that caused the 
> channel state to change and we don't want that.
>
> As I said in the other mail, it might be better if we add 
> beginPoll/endPoll methods that the pollXXX methods could use instead 
> of the beginRead/beginFinishConnect etc. That would make it a bit 
> easier to understand.
Hi Alan,

I think we both understand each other, but choose different ways, that's 
fine, as you know my concerns.
Thank you for discussing.

-Hamlin
>
> -Alan
>
>
>



More information about the nio-dev mailing list