Author: fhanik
Date: Thu Jan  6 23:53:11 2011
New Revision: 1056125

URL: http://svn.apache.org/viewvc?rev=1056125&view=rev
Log:
Fix bug https://issues.apache.org/bugzilla/show_bug.cgi?id=50477


Added:
    
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java
   (with props)
Modified:
    tomcat/trunk/modules/jdbc-pool/.classpath
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java

Modified: tomcat/trunk/modules/jdbc-pool/.classpath
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/.classpath?rev=1056125&r1=1056124&r2=1056125&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/.classpath (original)
+++ tomcat/trunk/modules/jdbc-pool/.classpath Thu Jan  6 23:53:11 2011
@@ -6,5 +6,6 @@
        <classpathentry kind="var" 
path="TOMCAT_LIBS_BASE/tomcat7-deps/dbcp/tomcat-dbcp.jar" 
sourcepath="/TOMCAT_LIBS_BASE/tomcat6-deps/dbcp/src/java"/>
        <classpathentry kind="con" 
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
        <classpathentry combineaccessrules="false" kind="src" 
path="/tomcat-7.0.x"/>
+       <classpathentry kind="lib" path="includes/h2/bin/h2-1.2.129.jar"/>
        <classpathentry kind="output" path="bin"/>
 </classpath>

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=1056125&r1=1056124&r2=1056125&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 Thu Jan  6 23:53:11 2011
@@ -140,6 +140,10 @@ public class ConnectionPool {
      * @throws SQLException
      */
     public Future<Connection> getConnectionAsync() throws SQLException {
+        PooledConnection pc = this.borrowConnection(0, null, null);
+        if (pc!=null) {
+            return new ConnectionFuture(pc);
+        } 
         //we can only retrieve a future if the underlying queue supports it.
         if (idle instanceof FairBlockingQueue<?>) {
             Future<PooledConnection> pcf = 
((FairBlockingQueue<PooledConnection>)idle).pollAsync();
@@ -1040,15 +1044,21 @@ public class ConnectionPool {
         Connection result = null;
         SQLException cause = null;
         AtomicBoolean cancelled = new AtomicBoolean(false);
+        volatile PooledConnection pc = null;
         public ConnectionFuture(Future<PooledConnection> pcf) {
             this.pcFuture = pcf;
         }
         
+        public ConnectionFuture(PooledConnection pc) {
+            this.pc = pc;
+        }
         /**
          * {...@inheritdoc}
          */
         public boolean cancel(boolean mayInterruptIfRunning) {
-            if ((!cancelled.get()) && cancelled.compareAndSet(false, true)) {
+            if (pc!=null) {
+                return false;
+            } else if ((!cancelled.get()) && cancelled.compareAndSet(false, 
true)) {
                 //cancel by retrieving the connection and returning it to the 
pool
                 ConnectionPool.this.cancellator.execute(this);
             }
@@ -1070,7 +1080,7 @@ public class ConnectionPool {
          * {...@inheritdoc}
          */
         public Connection get(long timeout, TimeUnit unit) throws 
InterruptedException, ExecutionException, TimeoutException {
-            PooledConnection pc = pcFuture.get(timeout,unit);
+            PooledConnection pc = 
this.pc!=null?this.pc:pcFuture.get(timeout,unit);
             if (pc!=null) {
                 if (result!=null) return result;
                 if (configured.compareAndSet(false, true)) {
@@ -1097,14 +1107,14 @@ public class ConnectionPool {
          * {...@inheritdoc}
          */
         public boolean isCancelled() {
-            return pcFuture.isCancelled() || cancelled.get();
+            return pc==null && (pcFuture.isCancelled() || cancelled.get());
         }
 
         /**
          * {...@inheritdoc}
          */
         public boolean isDone() {
-            return pcFuture.isDone();
+            return pc!=null || pcFuture.isDone();
         }
         
         /**

Added: 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java?rev=1056125&view=auto
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java
 (added)
+++ 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java
 Thu Jan  6 23:53:11 2011
@@ -0,0 +1,50 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.test;
+
+import java.sql.Connection;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.tomcat.jdbc.pool.DataSourceProxy;
+
+/**
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class Async0IdleTestBug50477 extends DefaultTestCase {
+    public Async0IdleTestBug50477(String name) {
+        super(name);
+    }
+    
+ 
+    public void testAsync0Idle0Size() throws Exception {
+        System.out.println("[testPoolThreads20Connections10FairAsync] Starting 
fairness - Tomcat JDBC - Fair - Async");
+        init();
+        this.datasource.getPoolProperties().setMaxActive(10);
+        this.datasource.getPoolProperties().setFairQueue(true);
+        this.datasource.getPoolProperties().setInitialSize(0);
+        try {
+            Future<Connection> cf = 
((DataSourceProxy)datasource).getConnectionAsync();
+            Connection con  = cf.get(5, TimeUnit.SECONDS);
+        }finally {
+            tearDown();
+        }
+    }
+}
+

Propchange: 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/Async0IdleTestBug50477.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to