RFR of JDK-8208280,java/nio/channels/Selector/RegisterDuringSelect.java fails with "key not removed from key set"
huaming.li at oracle.com
Mon Jul 30 05:38:34 UTC 2018
On 2018/7/27 4:52 PM, Alan Bateman wrote:
> On 27/07/2018 07:58, Hamlin Li wrote:
>> Would you please review the following patch?
>> bug: https://bugs.openjdk.java.net/browse/JDK-8208280
>> webrev: http://cr.openjdk.java.net/~mli/8208280/webrev.00/
>> The issue may occur intermittently, the main reason is that on
>> windows Pipe is implemented as a pair of socket, so sinked byte might
>> not be immediately available at source side. Steps for the issue to
>> 1. 2nd sel.wakeup() is invoked before 2nd select() and the sinked 1
>> byte is not read out by resetWakeupSocket0 because it might not be
>> immediately available at source side and ioctlsocket may report 0
>> byte, so select() return quickly before invocation of native select()
>> 2. the previously sinked 1 byte arrives at source side;
>> 3. 3rd select() is invoked and finishes quickly before
>> key.cancel()/sel.wakeup() is invoked because previously sinked 1 byte
>> is still in source side;
>> 4. after 3rd select() returns, key.cancel() is invoked but it has no
>> effect on sel.keys(), so sel.keys() still contains the just canceled
> Thread.sleep is going to be problematic here. Also the duration is
> nothing to do with the timeout factor specified to jtreg so I don't
> think we should be using adjustTimeout either. Instead I think we will
> need to change this test to synchronize with the selection operations.
As the root cause is 2nd wakeup will impact not only 2nd select but
possibly 3rd select at some situation, so I think it's better to
separate all the tests totally, i.e. setup selector for every test
freshly, rather than reuse selector among these tests.
new webrev: http://cr.openjdk.java.net/~mli/8208280/webrev.01/
More information about the nio-dev