zengji created THRIFT-5230:
------------------------------

             Summary: Fix connection leak and CancelledKeyException when 
handling Epoll bug
                 Key: THRIFT-5230
                 URL: https://issues.apache.org/jira/browse/THRIFT-5230
             Project: Thrift
          Issue Type: Bug
          Components: Java - Library
    Affects Versions: 0.13.0
         Environment: java version "1.8.0_161"
            Reporter: zengji


1. When Epoll bug occurs, the TThreadedSelectorServer.rebuildSelector rebuilds 
only the channel has events, the idle connection was ignored and caused 
connection leak

 
{code:java}
for (SelectionKey key : oldSelector.selectedKeys()) {
  if (!key.isValid() && key.readyOps() == 0)
    continue;
  SelectableChannel channel = key.channel();
  Object attachment = key.attachment();

  try {
    if (attachment == null) {
      channel.register(newSelector, key.readyOps());
    } else {
      channel.register(newSelector, key.readyOps(), attachment);
    }
  } catch (ClosedChannelException e) {
    LOGGER.error("Register new selector key error.", e);
  }
}

selector = newSelector;
try {
  oldSelector.close();
} catch (IOException e) {
  LOGGER.error("Close old selector error.", e);
}

{code}
 

2. In the same code block, the channel will be registered to a new selector and 
the previous selector will be closed, but the FrameBuffer is still holding the 
previous selector causing the FrameBuffer in a wrong state. When the 
FrameBuffer is trying to processing the channel, it may occur a 
CancelledKeyException.

This issue has been reported before:

https://issues.apache.org/jira/browse/THRIFT-4847



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to