[
https://issues.apache.org/jira/browse/DIRMINA-638?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12667699#action_12667699
]
John Costello commented on DIRMINA-638:
---------------------------------------
Removing the socket testing code from the DefaultSocketSessionConfig has had an
unintended side effect for stand alone applications that use the
NioSocketAcceptor. Before binding to the port, the receive buffer size on the
ServerSocket is always set to value from the DefaultSocketSessionConfig, which
previously would have been the OS default, but is now 1024 bytes. Upgrading
from 2.0.0-M2 to 2.0.0-M4 caused a huge drop in read performance in several
applications which previously had no trouble keeping up with the rate of
incoming messages. I was able to observe the receive buffer size on the server
app staying pegged at close to 1400 bytes, and confirmed using a debugger that
the socket recieve buffer size was being set to 1024 bytes, which is a rather
small default.
As a fix, I propose changing NioSocketAcceptor.open to check
DefaultSocketSessionConfig.isReceiveBufferChanged before setting the receive
buffer size on the ServerSocket. This will let the OS default be used in most
cases which I think should be the expected behavior. I've attached a tar file
containing patches with the proposed changes for NioSocketAcceptor,
DefaultSocketSessionConfig and AbstractSocketSessionConfig
> DefaultSocketSessionConfig creates some connection to itself.
> -------------------------------------------------------------
>
> Key: DIRMINA-638
> URL: https://issues.apache.org/jira/browse/DIRMINA-638
> Project: MINA
> Issue Type: Bug
> Affects Versions: 1.1.7
> Reporter: Emmanuel Lecharny
> Assignee: Emmanuel Lecharny
> Priority: Blocker
> Fix For: 1.1.8
>
> Attachments: mina-proposed-changes.tar
>
>
> For some unknown reason, the DefaultSocketSessionConfig class is creating a
> ServerSocket, and create a connection :
> static {
> initializeTestAddresses();
> boolean success = false;
> for (Entry<InetSocketAddress, InetAddress> e :
> TEST_ADDRESSES.entrySet()) {
> success = initializeDefaultSocketParameters(e.getKey(),
> e.getValue());
> if (success) {
> break;
> }
> }
> private static void initializeTestAddresses() {
> try {
> TEST_ADDRESSES.put(new InetSocketAddress(0),
> InetAddress.getByAddress(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,
> 0, 0, 1 }));
> TEST_ADDRESSES.put(new InetSocketAddress(0),
> InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }));
> } catch (UnknownHostException e) {
> ExceptionMonitor.getInstance().exceptionCaught(e);
> }
> }
> private static boolean
> initializeDefaultSocketParameters(InetSocketAddress bindAddress, InetAddress
> connectAddress) {
> ServerSocket ss = null;
> Socket socket = null;
> try {
> ss = new ServerSocket();
> ss.bind(bindAddress);
> socket = new Socket();
> socket.connect(new InetSocketAddress(connectAddress,
> ss.getLocalPort()), 10000);
> initializeDefaultSocketParameters(socket);
> return true;
> } catch (IOException ioe) {
> return false;
> } finally {
> if (socket != null) {
> try {
> socket.close();
> } catch (IOException e) {
> ExceptionMonitor.getInstance().exceptionCaught(e);
> }
> }
> if (ss != null) {
> try {
> ss.close();
> } catch (IOException e) {
> ExceptionMonitor.getInstance().exceptionCaught(e);
> }
> }
> }
> }
> The _only_ reason why this code exists is to setup the default values for the
> socket configuration.
> Not only is this bad code, but also a totally wrong thing to do : in many
> environment, creating sockets this way will lead to breakages (Applet, etc).
> It as to be fixed urgently.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.