From ceaa081dc80f044426d063f8328d0b9bc9a70ae4 Mon Sep 17 00:00:00 2001 From: Duncan Mackintosh Date: Thu, 14 Jul 2011 16:30:28 +0100 Subject: [PATCH] CBNL CORE: Refactored provisiond's AsyncBasicDetector to use far less NioSocketConnectors for service detection, which should substantially reduce file handle consumption and eliminate a crashed state where thousands of file handles are never released --- .../netmgt/provision/support/ConnectorWrapper.java | 20 ++++++ .../support/SessionDelegateIoHandler.java | 71 ++++++++++++++++++++ 2 files changed, 91 insertions(+), 0 deletions(-) create mode 100644 opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/ConnectorWrapper.java create mode 100644 opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/SessionDelegateIoHandler.java diff --git a/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/ConnectorWrapper.java b/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/ConnectorWrapper.java new file mode 100644 index 0000000..64fa08f --- /dev/null +++ b/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/ConnectorWrapper.java @@ -0,0 +1,20 @@ +package org.opennms.netmgt.provision.support; + +import org.apache.mina.transport.socket.nio.NioSocketConnector; + +/** + * Wrapper class for doing ref counting on NioSocketConnectors + * @author Duncan Mackintosh + * + */ +class ConnectorWrapper { + NioSocketConnector m_connector = new NioSocketConnector(); + // Start with 0 references because we always increment + int m_references = 0; + + ConnectorWrapper(int timeoutInMillis) { + m_connector.setConnectTimeoutMillis(timeoutInMillis); + } + + +} \ No newline at end of file diff --git a/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/SessionDelegateIoHandler.java b/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/SessionDelegateIoHandler.java new file mode 100644 index 0000000..95df33a --- /dev/null +++ b/opennms-provision/opennms-provision-api/src/main/java/org/opennms/netmgt/provision/support/SessionDelegateIoHandler.java @@ -0,0 +1,71 @@ +package org.opennms.netmgt.provision.support; + +import org.apache.mina.core.service.IoHandler; +import org.apache.mina.core.session.IdleStatus; +import org.apache.mina.core.session.IoSession; + +/** + * An IoHandler that delegates all processing down to an attribute stored in + * the individual IoSession. This permits us to have different classes of + * handler for each connection without having to create a new Connector each + * time. + * + * @author Duncan Mackintosh + * + */ +public class SessionDelegateIoHandler implements IoHandler { + + public void sessionCreated(IoSession session) throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).sessionCreated(session); + } + + public void sessionOpened(IoSession session) throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).sessionOpened(session); + } + + public void sessionClosed(IoSession session) throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).sessionClosed(session); + } + + public void sessionIdle(IoSession session, IdleStatus status) + throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).sessionIdle(session, status); + } + + public void exceptionCaught(IoSession session, Throwable cause) + throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).exceptionCaught(session, cause); + } + + public void messageReceived(IoSession session, Object message) + throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).messageReceived(session, message); + } + + public void messageSent(IoSession session, Object message) + throws Exception { + if (session.getAttribute(IoHandler.class)==null) { + return; + } + ((IoHandler)session.getAttribute(IoHandler.class)).messageSent(session, message); + } + +} -- 1.7.1