[ 
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.

Reply via email to