Details
Description
See also SSHD-1256.
The main acceptor loop does basically (somewhat simplified):
while (selectable) { registerHandles(); // Process registration queue: add new sockets (from bind()) to the selector with OP_ACCEPT, fulfills their open futures int selected = select(); if (/* nothing to do */) { break; // and end the thread; higher layers will create a new one if needed } if (selected > 0) { processHandles(selectedHandles()); // Handle and hand off new connections } unregisterHandles(); // Process cancel queue: cancel SelectionKey, close ServerSocketChannel, fulfill the cancel future }
With Java 11, unbinding a ServerSocketChannel changed:
Essentially the unbind gives up the socket only at the next select() call. This causes two problems in Apache MINA's acceptor:
- The unbind future is set "done" before the socket is actually released.
- If a new binding for one of the unbound sockets is registered before that select() has been done, registerHandles() gets a BindException ("address already in use").
So for Java >= 11, the code must ensure that there is a select() between processing unbindings and processing new bindings, and the unbind futures must be set "done" only after that select().
Attachments
Issue Links
- causes
-
SSHD-1256 PortForwardingTest.testRemoteForwardingSecondTimeInSameSession sometimes fails in Github CI
- Reopened