You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-dev@ws.apache.org by El...@nokia.com on 2005/11/01 00:44:07 UTC

[PATCH] Socket not closed when exception caught in listener loop

Hi,

We ran into an issue were our client application using XMLRpcClientLite
hangs if the maximum number of concurrent requests on the server is
exceeded, i.e. runners.activeCount() > XmlRpc.getMaxThreads(). I found
that a socket is  not closed in those circumstances and therefore the
client keeps waiting for the response. The proposed patch below would
take care of this issue.

Thanks,
Elias Zaretsky.


Index: WebServer.java
===================================================================
RCS file:
/home/cvspublic/ws-xmlrpc/src/java/org/apache/xmlrpc/WebServer.java,v
retrieving revision 1.28
diff -u -r1.28 WebServer.java
--- WebServer.java	22 Apr 2005 10:25:57 -0000	1.28
+++ WebServer.java	31 Oct 2005 22:48:56 -0000
@@ -445,9 +445,11 @@
         {
             while (listener != null)
             {
+                Socket socket = null;
+                Runner runner = null;
                 try
                 {
-                    Socket socket = serverSocket.accept();
+                    socket = serverSocket.accept();
                     try
                     {
                         socket.setTcpNoDelay(true);
@@ -459,7 +461,7 @@
 
                     if (allowConnection(socket))
                     {
-                        Runner runner = getRunner();
+                        runner = getRunner();
                         runner.handle(socket);
                     }
                     else
@@ -487,6 +489,19 @@
                             + err + ").");
                     err.printStackTrace();
                 }
+                finally
+                {
+                    if (runner == null && socket != null)
+                    {
+                        try 
+                        {
+                            socket.close();
+                        }
+                        catch (Throwable e) 
+                        {
+                        }
+                    }
+                }
             }
         }
         catch (Exception exception)

Re: [PATCH] Socket not closed when exception caught in listener loop

Posted by Henri Gomez <he...@gmail.com>.
commited, thanks

2005/11/1, Elias.Zaretsky@nokia.com <El...@nokia.com>:
> Hi,
>
> We ran into an issue were our client application using XMLRpcClientLite
> hangs if the maximum number of concurrent requests on the server is
> exceeded, i.e. runners.activeCount() > XmlRpc.getMaxThreads(). I found
> that a socket is  not closed in those circumstances and therefore the
> client keeps waiting for the response. The proposed patch below would
> take care of this issue.
>
> Thanks,
> Elias Zaretsky.
>
>
> Index: WebServer.java
> ===================================================================
> RCS file:
> /home/cvspublic/ws-xmlrpc/src/java/org/apache/xmlrpc/WebServer.java,v
> retrieving revision 1.28
> diff -u -r1.28 WebServer.java
> --- WebServer.java      22 Apr 2005 10:25:57 -0000      1.28
> +++ WebServer.java      31 Oct 2005 22:48:56 -0000
> @@ -445,9 +445,11 @@
>          {
>              while (listener != null)
>              {
> +                Socket socket = null;
> +                Runner runner = null;
>                  try
>                  {
> -                    Socket socket = serverSocket.accept();
> +                    socket = serverSocket.accept();
>                      try
>                      {
>                          socket.setTcpNoDelay(true);
> @@ -459,7 +461,7 @@
>
>                      if (allowConnection(socket))
>                      {
> -                        Runner runner = getRunner();
> +                        runner = getRunner();
>                          runner.handle(socket);
>                      }
>                      else
> @@ -487,6 +489,19 @@
>                              + err + ").");
>                      err.printStackTrace();
>                  }
> +                finally
> +                {
> +                    if (runner == null && socket != null)
> +                    {
> +                        try
> +                        {
> +                            socket.close();
> +                        }
> +                        catch (Throwable e)
> +                        {
> +                        }
> +                    }
> +                }
>              }
>          }
>          catch (Exception exception)
>