You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/06/08 22:27:26 UTC
tomee git commit: better synchronization for validator in case of
AllConnectionsEqual=false
Repository: tomee
Updated Branches:
refs/heads/master a54f41a8b -> ed862e9b0
better synchronization for validator in case of AllConnectionsEqual=false
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/ed862e9b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/ed862e9b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/ed862e9b
Branch: refs/heads/master
Commit: ed862e9b01b0da1cfd0d232487c3f0b45321305b
Parents: a54f41a
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Thu Jun 9 00:26:56 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Thu Jun 9 00:26:56 2016 +0200
----------------------------------------------------------------------
.../GeronimoConnectionManagerFactory.java | 102 ++++++++++---------
.../GeronimoConnectionManagerFactoryTest.java | 26 +++++
2 files changed, 78 insertions(+), 50 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/ed862e9b/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
index 460f98b..cebe9cc 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
@@ -297,26 +297,26 @@ public class GeronimoConnectionManagerFactory {
// partition by contector properties such as username and password on a jdbc connection
return new PartitionedPool(poolMaxSize,
- poolMinSize,
- connectionMaxWaitMilliseconds,
- connectionMaxIdleMinutes,
- allConnectionsEqual,
- !allConnectionsEqual,
- assumeOneMatch,
- true,
- false);
+ poolMinSize,
+ connectionMaxWaitMilliseconds,
+ connectionMaxIdleMinutes,
+ allConnectionsEqual,
+ !allConnectionsEqual,
+ assumeOneMatch,
+ true,
+ false);
} else if ("by-subject".equalsIgnoreCase(partitionStrategy)) {
// partition by caller subject
return new PartitionedPool(poolMaxSize,
- poolMinSize,
- connectionMaxWaitMilliseconds,
- connectionMaxIdleMinutes,
- allConnectionsEqual,
- !allConnectionsEqual,
- assumeOneMatch,
- false,
- true);
+ poolMinSize,
+ connectionMaxWaitMilliseconds,
+ connectionMaxIdleMinutes,
+ allConnectionsEqual,
+ !allConnectionsEqual,
+ assumeOneMatch,
+ false,
+ true);
}
throw new IllegalArgumentException("Unknown partition strategy " + partitionStrategy);
@@ -481,7 +481,7 @@ public class GeronimoConnectionManagerFactory {
final AutoConnectionTracker autoConnectionTracker) {
this.stack = stack;
this.lock = lock;
- this.pool = pool;
+ this.pool = pool == null ? new Object() : pool;
this.autoConnectionTracker = autoConnectionTracker;
if (!SinglePoolConnectionInterceptor.class.isInstance(stack) && !SinglePoolMatchAllConnectionInterceptor.class.isInstance(stack)) {
@@ -491,46 +491,48 @@ public class GeronimoConnectionManagerFactory {
@Override
public void run() {
- if (lock != null) {
- lock.writeLock().lock();
- }
+ synchronized (pool) {
+ if (lock != null) {
+ lock.writeLock().lock();
+ }
- try {
- final Map<ManagedConnection, ManagedConnectionInfo> connections;
- if (stack instanceof SinglePoolConnectionInterceptor) {
- connections = new HashMap<>();
- for (final ManagedConnectionInfo info : (List<ManagedConnectionInfo>) pool) {
+ try {
+ final Map<ManagedConnection, ManagedConnectionInfo> connections;
+ if (stack instanceof SinglePoolConnectionInterceptor) {
+ connections = new HashMap<>();
+ for (final ManagedConnectionInfo info : (List<ManagedConnectionInfo>) pool) {
+ connections.put(info.getManagedConnection(), info);
+ }
+ } else if (stack instanceof SinglePoolMatchAllConnectionInterceptor) {
+ connections = (Map<ManagedConnection, ManagedConnectionInfo>) pool;
+ } else {
+ connections = new HashMap<>();
+ }
+ for (final ManagedConnectionInfo info : autoConnectionTracker.connections()) {
connections.put(info.getManagedConnection(), info);
}
- } else if (stack instanceof SinglePoolMatchAllConnectionInterceptor) {
- connections = (Map<ManagedConnection, ManagedConnectionInfo>) pool;
- } else {
- connections = new HashMap<>();
- }
- for (final ManagedConnectionInfo info : autoConnectionTracker.connections()) {
- connections.put(info.getManagedConnection(), info);
- }
- // destroy invalid connections
- try {
- final Set<ManagedConnection> invalids = ValidatingManagedConnectionFactory.class.cast(getManagedConnectionFactory())
- .getInvalidConnections(connections.keySet());
- if (invalids != null) {
- for (final ManagedConnection invalid : invalids) {
- final ManagedConnectionInfo mci = connections.get(invalid);
- if (mci != null) {
- stack.returnConnection(new ConnectionInfo(mci), ConnectionReturnAction.DESTROY);
- continue;
+ // destroy invalid connections
+ try {
+ final Set<ManagedConnection> invalids = ValidatingManagedConnectionFactory.class.cast(getManagedConnectionFactory())
+ .getInvalidConnections(connections.keySet());
+ if (invalids != null) {
+ for (final ManagedConnection invalid : invalids) {
+ final ManagedConnectionInfo mci = connections.get(invalid);
+ if (mci != null) {
+ stack.returnConnection(new ConnectionInfo(mci), ConnectionReturnAction.DESTROY);
+ continue;
+ }
+ log.error("Can't find " + invalid + " in " + pool);
}
- log.error("Can't find " + invalid + " in " + pool);
}
+ } catch (final ResourceException e) {
+ log.error(e.getMessage(), e);
+ }
+ } finally {
+ if (lock != null) {
+ lock.writeLock().unlock();
}
- } catch (final ResourceException e) {
- log.error(e.getMessage(), e);
- }
- } finally {
- if (lock != null) {
- lock.writeLock().unlock();
}
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/ed862e9b/container/openejb-core/src/test/java/org/apache/openejb/resource/GeronimoConnectionManagerFactoryTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/resource/GeronimoConnectionManagerFactoryTest.java b/container/openejb-core/src/test/java/org/apache/openejb/resource/GeronimoConnectionManagerFactoryTest.java
index e2a5646..bc60098 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/resource/GeronimoConnectionManagerFactoryTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/resource/GeronimoConnectionManagerFactoryTest.java
@@ -53,6 +53,32 @@ public class GeronimoConnectionManagerFactoryTest {
factory.setPartitionStrategy("none");
factory.setTransactionManager(new TransactionManagerImpl());
factory.setPoolMinSize(1);
+ factory.setAllConnectionsEqual(true);
+ final GenericConnectionManager mgr = factory.create();
+ mgr.doStart();
+ try {
+ mgr.allocateConnection(mcf, new ConnectionRequestInfo() { // just to use it
+ });
+ sleep(2500);
+ assertTrue(mcf.evicted.get());
+ assertTrue(mcf.destroyed.get());
+ } finally {
+ mgr.doStop();
+ }
+ }
+
+ @Test
+ public void evictionNotAllEquals() throws Exception {
+ final MyMcf mcf = new MyMcf();
+
+ final GeronimoConnectionManagerFactory factory = new GeronimoConnectionManagerFactory();
+ factory.setValidationInterval(new Duration("1 second"));
+ factory.setTransactionSupport("local");
+ factory.setMcf(mcf);
+ factory.setPooling(true);
+ factory.setPartitionStrategy("none");
+ factory.setTransactionManager(new TransactionManagerImpl());
+ factory.setPoolMinSize(1);
factory.setAllConnectionsEqual(false);
final GenericConnectionManager mgr = factory.create();
mgr.doStart();