From 6bef18d19414f3680165472e37dc4444da765f13 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Mon, 11 Jan 2010 14:23:49 +0000
Subject: [PATCH] Fix SDK issue 4421: Remove generic AsynchronousConnection parameter from ConnectionFactory.
---
sdk/src/org/opends/sdk/ConnectionPool.java | 167 +++++++++++++++++++++++++++++--------------------------
1 files changed, 87 insertions(+), 80 deletions(-)
diff --git a/sdk/src/org/opends/sdk/ConnectionPool.java b/sdk/src/org/opends/sdk/ConnectionPool.java
index 6a5a60d..d0b8780 100644
--- a/sdk/src/org/opends/sdk/ConnectionPool.java
+++ b/sdk/src/org/opends/sdk/ConnectionPool.java
@@ -30,10 +30,8 @@
import java.util.Collection;
-import java.util.Stack;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import org.opends.sdk.requests.*;
@@ -42,7 +40,6 @@
import com.sun.opends.sdk.util.AbstractFutureResult;
import com.sun.opends.sdk.util.CompletedFutureResult;
-import com.sun.opends.sdk.util.FutureResultTransformer;
import com.sun.opends.sdk.util.StaticUtils;
@@ -50,10 +47,9 @@
/**
* A simple connection pool implementation.
*/
-final class ConnectionPool extends
- AbstractConnectionFactory<AsynchronousConnection>
+final class ConnectionPool extends AbstractConnectionFactory
{
- private final ConnectionFactory<?> connectionFactory;
+ private final ConnectionFactory connectionFactory;
private volatile int numConnections;
@@ -70,9 +66,11 @@
AsynchronousConnection, ConnectionEventListener
{
private final AsynchronousConnection connection;
+
private volatile boolean isClosed;
+
private PooledConnectionWapper(AsynchronousConnection connection)
{
this.connection = connection;
@@ -126,7 +124,7 @@
{
synchronized (pool)
{
- if(isClosed)
+ if (isClosed)
{
return;
}
@@ -145,31 +143,27 @@
connection.close();
if (StaticUtils.DEBUG_LOG.isLoggable(Level.WARNING))
{
- StaticUtils.DEBUG_LOG
- .warning(String
- .format(
- "Dead connection released and closed. "
- + "numConnections: %d, poolSize: %d, " +
- "pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ StaticUtils.DEBUG_LOG.warning(String.format(
+ "Dead connection released and closed. "
+ + "numConnections: %d, poolSize: %d, "
+ + "pendingFutures: %d", numConnections, pool.size(),
+ pendingFutures.size()));
}
if (StaticUtils.DEBUG_LOG.isLoggable(Level.WARNING))
{
- StaticUtils.DEBUG_LOG
- .warning(String
- .format(
- "Reconnect attempt starting. "
- + "numConnections: %d, poolSize: %d, " +
- "pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ StaticUtils.DEBUG_LOG.warning(String.format(
+ "Reconnect attempt starting. "
+ + "numConnections: %d, poolSize: %d, "
+ + "pendingFutures: %d", numConnections, pool.size(),
+ pendingFutures.size()));
}
- connectionFactory.getAsynchronousConnection(new ReconnectHandler());
+ connectionFactory
+ .getAsynchronousConnection(new ReconnectHandler());
}
+
public void close(UnbindRequest request, String reason)
throws NullPointerException
{
@@ -380,11 +374,15 @@
return isClosed;
}
+
+
public boolean isValid()
{
return !isClosed && connection.isValid();
}
+
+
public void connectionReceivedUnsolicitedNotification(
GenericExtendedResult notification)
{
@@ -396,9 +394,11 @@
public void connectionErrorOccurred(
boolean isDisconnectNotification, ErrorResultException error)
{
- // Remove this connection from the pool if its in there. If not, just
- // ignore and wait for the user to close and we can deal with it there.
- if(pool.remove(this))
+ // Remove this connection from the pool if its in there. If not,
+ // just
+ // ignore and wait for the user to close and we can deal with it
+ // there.
+ if (pool.remove(this))
{
numConnections--;
connection.removeConnectionEventListener(this);
@@ -412,27 +412,31 @@
StaticUtils.DEBUG_LOG
.warning(String
.format(
- "Connection error occured and removed from pool: "
- + error.getMessage()
- + " numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "Connection error occured and removed from pool: "
+ + error.getMessage()
+ + " numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures
+ .size()));
}
}
}
}
- private class ReconnectHandler
- implements ResultHandler<AsynchronousConnection>
+
+
+ private class ReconnectHandler implements
+ ResultHandler<AsynchronousConnection>
{
- public void handleErrorResult(ErrorResultException error) {
+ public void handleErrorResult(ErrorResultException error)
+ {
// The reconnect failed. Fail the connect attempt.
- numConnections --;
- // The reconnect failed. The underlying connection factory probably went
+ numConnections--;
+ // The reconnect failed. The underlying connection factory
+ // probably went
// down. Just fail all pending futures
synchronized (pool)
{
- while(!pendingFutures.isEmpty())
+ while (!pendingFutures.isEmpty())
{
pendingFutures.poll().handleErrorResult(error);
}
@@ -442,25 +446,26 @@
StaticUtils.DEBUG_LOG
.warning(String
.format(
- "Reconnect failed. Failed all pending futures: "
- + error.getMessage()
- + " numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "Reconnect failed. Failed all pending futures: "
+ + error.getMessage()
+ + " numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures.size()));
}
}
- public void handleResult(AsynchronousConnection connection) {
+
+
+ public void handleResult(AsynchronousConnection connection)
+ {
if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINE))
{
StaticUtils.DEBUG_LOG
.finest(String
.format(
- "Reconnect succeded. "
- + " numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "Reconnect succeded. "
+ + " numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures.size()));
}
synchronized (pool)
{
@@ -469,6 +474,8 @@
}
}
+
+
// Future used for waiting for pooled connections to become available.
private static final class FuturePooledConnection extends
AbstractFutureResult<AsynchronousConnection>
@@ -491,6 +498,8 @@
}
+
+
private void releaseConnection(AsynchronousConnection connection)
{
// See if there waiters pending.
@@ -517,10 +526,10 @@
StaticUtils.DEBUG_LOG
.finest(String
.format(
- "Connection released and directly "
- + "given to waiter. numConnections: %d, poolSize: %d, "
- + "pendingFutures: %d", numConnections,
- pool.size(), pendingFutures.size()));
+ "Connection released and directly "
+ + "given to waiter. numConnections: %d, poolSize: %d, "
+ + "pendingFutures: %d", numConnections, pool
+ .size(), pendingFutures.size()));
}
return;
}
@@ -530,12 +539,10 @@
pool.offer(connection);
if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINE))
{
- StaticUtils.DEBUG_LOG
- .finest(String
- .format(
- "Connection released to pool. numConnections: %d, " +
- "poolSize: %d, pendingFutures: %d", numConnections,
- pool.size(), pendingFutures.size()));
+ StaticUtils.DEBUG_LOG.finest(String.format(
+ "Connection released to pool. numConnections: %d, "
+ + "poolSize: %d, pendingFutures: %d", numConnections,
+ pool.size(), pendingFutures.size()));
}
}
@@ -551,7 +558,7 @@
* @param poolSize
* The maximum size of the connection pool.
*/
- ConnectionPool(ConnectionFactory<?> connectionFactory, int poolSize)
+ ConnectionPool(ConnectionFactory connectionFactory, int poolSize)
{
this.connectionFactory = connectionFactory;
this.poolSize = poolSize;
@@ -561,13 +568,14 @@
- public synchronized FutureResult<AsynchronousConnection>
- getAsynchronousConnection(ResultHandler<? super AsynchronousConnection> handler)
+ public synchronized FutureResult<AsynchronousConnection> getAsynchronousConnection(
+ ResultHandler<AsynchronousConnection> handler)
{
- // This entire method is synchronized to ensure new connects are done
+ // This entire method is synchronized to ensure new connects are
+ // done
// synchronously to avoid the "pending connect" case.
AsynchronousConnection conn;
- synchronized(pool)
+ synchronized (pool)
{
// Check to see if we have a connection in the pool
conn = pool.poll();
@@ -577,7 +585,8 @@
// reached
if (numConnections >= poolSize)
{
- // We reached max # of conns so wait for a connection to become available.
+ // We reached max # of conns so wait for a connection to
+ // become available.
FuturePooledConnection future = new FuturePooledConnection(
handler);
pendingFutures.add(future);
@@ -587,10 +596,10 @@
StaticUtils.DEBUG_LOG
.finest(String
.format(
- "No connections available. Wait-listed"
- + "numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "No connections available. Wait-listed"
+ + "numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures
+ .size()));
}
return future;
@@ -598,7 +607,7 @@
}
}
- if(conn == null)
+ if (conn == null)
{
try
{
@@ -610,10 +619,10 @@
StaticUtils.DEBUG_LOG
.finest(String
.format(
- "New connection established and aquired. "
- + "numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "New connection established and aquired. "
+ + "numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures
+ .size()));
}
}
catch (ErrorResultException e)
@@ -626,9 +635,8 @@
}
catch (InterruptedException e)
{
- ErrorResultException error =
- new ErrorResultException(Responses.newResult(
- ResultCode.CLIENT_SIDE_LOCAL_ERROR).setCause(e));
+ ErrorResultException error = new ErrorResultException(Responses
+ .newResult(ResultCode.CLIENT_SIDE_LOCAL_ERROR).setCause(e));
if (handler != null)
{
handler.handleErrorResult(error);
@@ -643,10 +651,9 @@
StaticUtils.DEBUG_LOG
.finest(String
.format(
- "Connection aquired from pool. "
- + "numConnections: %d, poolSize: %d, pendingFutures: %d",
- numConnections, pool.size(), pendingFutures
- .size()));
+ "Connection aquired from pool. "
+ + "numConnections: %d, poolSize: %d, pendingFutures: %d",
+ numConnections, pool.size(), pendingFutures.size()));
}
}
--
Gitblit v1.10.0