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();