[
https://issues.apache.org/jira/browse/DIRSERVER-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16482435#comment-16482435
]
Emmanuel Lecharny commented on DIRSERVER-2234:
----------------------------------------------
Good catch !
I'll add the missing {{session.closeNow();}}
> Kinit via TCP causes ApacheDS to create a NioProcessor thread at 100% CPU
> -------------------------------------------------------------------------
>
> Key: DIRSERVER-2234
> URL: https://issues.apache.org/jira/browse/DIRSERVER-2234
> Project: Directory ApacheDS
> Issue Type: Bug
> Affects Versions: 2.0.0-M24
> Environment: ApacheDS
> Reporter: Wenxiang Qiu
> Priority: Major
>
> ApacheDS uses a KerberosProtocolHandler as the handler of the
> IoAcceptor in KdcServer.java:
>
> {code:java}
> // Inject the protocol handler acceptor.setHandler( new
> KerberosProtocolHandler( this, store ) );
> {code}
> When a TCP connection is about to be closed,
> KerberosProtocolHandler$inputClosed(IoSession session) is invoked when
> {code:java}
> filterChain.fireInputClosed();
> {code}
> is reached in AbstractPollingIoProcessor.java. But
> KerberosProtocolHandler$inputClosed(IoSession session) does nothing:
> {code:java}
> public void inputClosed( IoSession session )
> {
> }
> {code}
> which leaves the session unclosed, which in turn prevents its SocketChannel
> from being deregistered from the selector in NioProcessor. As a result,
> {code:java}
> int selected = select(SELECT_TIMEOUT);
> {code}
> in AbstractPollingIoProcessor.Processor.run() keeps returning a readable
> channel, on which read() returns -1. This infinite loop consumes all
> available CPU.
>
> By constrast, LdapServer sets a LdapProtocolHandler to its acceptor, and
> LdapProtocolHandler inherits inputClosed(IoSession session) from
> IoHandlerAdapter:
> {code:java}
> public void inputClosed(IoSession session) throws Exception {
> session.close(true);
> }
> {code}
> which closes properly the session.
>
>
> How to reproduce:
> Simply run kinit with TCP (by setting udp_preference_limit = 1 in
> /etc/krb5.conf), and ApacheDS will be running at 100% CPU. Doing it again
> will consume more CPU resources depending on core number.
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)