[
https://issues.apache.org/jira/browse/DIRSERVER-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Emmanuel Lecharny resolved DIRSERVER-2234.
------------------------------------------
Resolution: Fixed
Fix Version/s: 2.0.0-M25
Fixed by commit 0179ba91f1f98e6a3540a836f31ea658dc7ba1e8
> 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
> Fix For: 2.0.0-M25
>
>
> 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)