Author: isudana
Date: Sun Jul 13 07:35:52 2014
New Revision: 1610131

URL: http://svn.apache.org/r1610131
Log:
fix for SYNAPSE-989

Modified:
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
 Sun Jul 13 07:35:52 2014
@@ -157,8 +157,9 @@ public class DeliveryAgent {
      *
      * @param host name of the remote host
      * @param port remote port number
+     * @param conn connection made available to process the request
      */
-    public void connected(String host, int port) {
+    public void connected(String host, int port, NHttpClientConnection conn) {
         Queue<MessageContext> queue = null;
         lock.lock();
         try {
@@ -168,13 +169,19 @@ public class DeliveryAgent {
         }
 
         while (queue.size() > 0) {
-            NHttpClientConnection conn = targetConnections.getConnection(host, 
port);
+            if (conn == null) {
+                // Try to get an existing connection from pool. Here we should 
not ask to create
+                // new connections as it may ended up with extra connections. 
New connections are
+                // created upon request submission.
+                conn = targetConnections.getExistingConnection(host, port);
+            }
             if (conn != null) {
                 MessageContext messageContext = queue.poll();
 
                 if (messageContext != null) {
                     tryNextMessage(messageContext, conn);
                 }
+                conn = null;
             } else {
                 break;
             }

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
 Sun Jul 13 07:35:52 2014
@@ -19,8 +19,6 @@
 
 package org.apache.synapse.transport.passthru;
 
-import java.io.IOException;
-
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.WSDL2Constants;
@@ -32,12 +30,18 @@ import org.apache.http.HttpException;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.*;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.NHttpClientEventHandler;
+import org.apache.http.nio.NHttpServerConnection;
 import org.apache.synapse.transport.nhttp.NhttpConstants;
 import org.apache.synapse.transport.passthru.config.TargetConfiguration;
 import org.apache.synapse.transport.passthru.connections.HostConnections;
 import 
org.apache.synapse.transport.passthru.jmx.PassThroughTransportMetricsCollector;
 
+import java.io.IOException;
+
 /**
  * This class is handling events from the transport -- > client.
  */
@@ -77,7 +81,7 @@ public class TargetHandler implements NH
         targetConfiguration.getConnections().addConnection(conn);
 
         // notify about the new connection
-        deliveryAgent.connected(pool.getHost(), pool.getPort());
+        deliveryAgent.connected(pool.getHost(), pool.getPort(), conn);
         
         conn.getContext().setAttribute(PassThroughConstants.REQ_DEPARTURE_TIME,
                 System.currentTimeMillis());

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
 Sun Jul 13 07:35:52 2014
@@ -118,7 +118,9 @@ public class HostConnections {
         }
         lock.lock();
         try {
-            freeConnections.add(conn);
+            // Adding to busyConnections to make sure the first requester get 
it.
+            // Otherwise someone else might acquire it.
+            busyConnections.add(conn);
         } finally {
             lock.unlock();
         }

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
 Sun Jul 13 07:35:52 2014
@@ -104,6 +104,23 @@ public class TargetConnections {
     }
 
     /**
+     * Return an existing connection to the host:port pair from connection 
pool.
+     * If a connection is not available, return <code>null</code>
+     *
+     * @param host host
+     * @param port port
+     * @return returns a connection if already available in the pool
+     */
+    public NHttpClientConnection getExistingConnection(String host, int port) {
+        if (log.isDebugEnabled()) {
+            log.debug("Trying to get an existing connection to the " + host + 
":" + port);
+        }
+
+        HostConnections pool = getConnectionPool(host, port);
+        return pool.getConnection();
+    }
+
+    /**
      * This connection is no longer needed. So we need to close connection.
      *
      * @param conn connection to shutdownConnection
@@ -188,17 +205,16 @@ public class TargetConnections {
 
     private HostConnections getConnectionPool(String host, int port) {
         String key = host + ":" + port;
-        // see weather a pool already exists for this host:port
-        HostConnections pool = poolMap.get(key);
+        HostConnections pool;
         synchronized (poolMap) {
+            // see weather a pool already exists for this host:port
+            pool = poolMap.get(key);
             if (pool == null) {
                 pool = new HostConnections(host, port, maxConnections);
                 poolMap.put(key, pool);
             }
         }
-
         return pool;
     }
 
-
 }


Reply via email to