8201315: (se) Allow SelectableChannel.register to be invoked while selection operation is in progress

Hamlin Li huaming.li at oracle.com
Tue Apr 10 10:33:16 UTC 2018


Hi Alan,

Just a minor comment about the new test, should line 101(result.get();) 
be moved into the finally block just before line 104(pool.shutdown();)? 
So that sel is auto closed before trying to get the result of selectLoop.

Thank you

-Hamlin


On 10/04/2018 1:56 AM, Alan Bateman wrote:
> One of the issues brought up in the "Callback Based Selectors" 
> discussion is that the register methods are specified to block if 
> there is a selection operation in progress. This leads to the idiom of 
> the gate object to coordinate new registrations with selection 
> operations.
>
> I've looked into the implications of changing the existing API so that 
> register can be invoked while a selection operation is in operation. 
> The approach that I think strikes a balance between concurrency and 
> preserving compatibility is to re-specify the Selector's key set to 
> support concurrent operations, leaving the selected-key and 
> cancelled-key set as is.
>
> To re-cap: the order that the key sets are locked is (i) keys, (ii) 
> selected-keys, and (iii) cancelled-keys. We can't do anything that 
> would result in these sets being locked in a different order as it 
> risks deadlocking with user code, e.g. code that synchronizes on keys 
> and invokes cancel for each key.
>
> The steps in a selection operation that access the sets are:
>
> 1. Processing cancelled keys: removes the cancelled keys from each of 
> the sets
> 2. Processing events: adds keys to the selected-key set
>
> It would be feasible to limit the scope of the locking to just these 
> steps but it adds a lot of locking to preserve the specified ordering, 
> more so because the cancelled-keys set can be processed twice (before 
> and after polling for readiness events).
>
> Another point is that we have to be conservative with the selected-key 
> set as that is the most user facing of the sets. Existing code will 
> synchronize on this set when processing selected-keys. I think it 
> would be too risky to not synchronize on the selected-key set.
>
> The webrev below has the spec changes with the proposal. The changes 
> mean that register can be invoked while a selection operation is in 
> progress, the new registration will come into effect at the next 
> selection operation. Same thing for interestOps where the change will 
> also come into effect at the next selection operation. It means that 
> register, interestOps and cancel can be followed by wakeup without 
> other coordination or explicit locking.
>
> There are two aspect to the compatibility implications:
>
> 1. 3rd party Selector (or rather SelectorProvider) implementations 
> will need to be updated. These seem few and far between so I'm not too 
> concerned about this.
>
> 2. Code that synchronizes on the key set in order to get a snapshot of 
> the current registrations. I need help in assessing this but I haven't 
> found any existing code so far where this is an issue. In general, 
> there doesn't seem to be a lot of code synchronizing on the key set, 
> all the action is instead processing the selected-key set.
>
> http://cr.openjdk.java.net/~alanb/8201315/webrev/index.html
>
> If we go ahead with this then it will need a CSR and release note.
>
> -Alan.



More information about the nio-dev mailing list