[ https://issues.apache.org/jira/browse/DIRMINA-1021?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15027920#comment-15027920 ]
Doug Kelly commented on DIRMINA-1021: ------------------------------------- I'm not sure I understand your comment entirely: this is exactly what happens, according to my analysis in a debugger. As you commented, {{removeSessions()}} polls the queue, which means the session is no longer in removingSessions. However, {{removeNow()}} is never called, which calls {{destroy()}} and the {{fireSessionDestroyed()}} handlers. Could this patch be masking the issue because the channel should be AutoCloseable and something is still holding a reference, keeping the channel open? Maybe calling {{removeNow()}} is masking the problem by forcibly closing the underlying channel and calling {{fireSessionDestroyed()}}? From what I can tell, the connection still showed up in the session list, meaning {{getManagedSessions()}} was still tracking it, which would make sense with the "someone else is holding a reference" idea. Sessions appear to only be removed by {{IoServiceListenerSupport.fireSessionDestroyed()}} which further supports the idea. Is there another way you would propose fixing this? > MINA-CORE does not remove sessions if exceptions occur while closing > -------------------------------------------------------------------- > > Key: DIRMINA-1021 > URL: https://issues.apache.org/jira/browse/DIRMINA-1021 > Project: MINA > Issue Type: Bug > Affects Versions: 2.0.8 > Environment: mina-ssh 0.14.0 > mina-core 2.0.8 > Multiple OSes / Java configurations: > * Mac OS X El Capitan on Java 8 (1.8.0_60) > * CentOS 6.4 on Java 8 (1.8.0_60) > * CentOS 6.5 on Java 8 (1.8.0_20-b26). > Reporter: Doug Kelly > Attachments: attempt-removing-sessions-closing.patch > > > MINA SSHD isn't removing sessions when using the MINA/NIO backend if an > exception as received as the session is closing (such as a connection reset > is received with data still in the write buffer). When this case happens, it > seems that {{NioProcessor.getState}} returns the state as {{CLOSING}} (I'm > assuming since the underlying channel is now closed), which means that the > {{AbstractPollingIoProcessor.removeSessions()}} won't ever prune the session, > since a {{CLOSING}} state is simply ignored. The result is a resource leak > over time, since these sessions are never pruned (it's a slow leak, since > entering this condition is racy – on my workstation, I can produce it through > randomly interrupting connections anywhere from 1/6 to 1/10th of the time). > (This may either be major or critical; reprioritize as necessary.) > I specifically see this error with Gerrit 2.10.4 and Gerrit 2.11.5 (using > mina-sshd 0.14.0 / mina-core 2.0.8), and it looks like the code path is > unchanged in mina-sshd 1.0.0 / mina-core 2.0.9. I was unsure if this is > specifically a bug in mina-core or, if it's something unique to mina-sshd. My > local development system runs Mac OS X El Capitan on Java 8 (1.8.0_60), but > I've also seen this on Linux (CentOS 6.4, again Java 1.8.0_60 and CentOS 6.5 > on Java 1.8.0_20-b26). > The fix may be as simple as attempting to remove the session if {{OPENED}} or > {{CLOSING}}, but I'm unsure what side-effects this may have with other > backends. I'll be happy to test it locally, but I'm fairly ignorant when it > comes to MINA's code. > The attached patch (to mina-core) seems to resolve the issue by following the > reproduction case I have on the [Gerrit issue > tracker|https://code.google.com/p/gerrit/issues/detail?id=3685]. -- This message was sent by Atlassian JIRA (v6.3.4#6332)