You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2012/03/27 19:55:42 UTC

svn commit: r1305931 - in /tomcat/trunk/modules/jdbc-pool: doc/ src/main/java/org/apache/tomcat/jdbc/pool/ src/main/java/org/apache/tomcat/jdbc/pool/jmx/

Author: fhanik
Date: Tue Mar 27 17:55:41 2012
New Revision: 1305931

URL: http://svn.apache.org/viewvc?rev=1305931&view=rev
Log:
https://issues.apache.org/bugzilla/show_bug.cgi?id=52066
Add in a configuration attribute to allow a thread interrupt state to be retained for the calling library to see


Modified:
    tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java

Modified: tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml (original)
+++ tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml Tue Mar 27 17:55:41 2012
@@ -463,6 +463,11 @@
       <p>(boolean) Set this to true to log errors during the validation phase to the log file. If set to true, errors will be logged as SEVERE. Default value is <code>false</code> for backwards compatibility.
       </p>
     </attribute>
+    <attribute name="propagateInterruptState" required="false">
+      <p>(boolean) Set this to true to propagate the interrupt state for a thread that has been interrupted (not clearing the interrupt state). Default value is <code>false</code> for backwards compatibility.
+      </p>
+    </attribute>
+    
   </attributes>
   </subsection>
 </section>

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java Tue Mar 27 17:55:41 2012
@@ -381,7 +381,9 @@ public class ConnectionPool {
                     }
                 } //while
             } catch (InterruptedException ex) {
-                Thread.interrupted();
+                if (!getPoolProperties().getPropagateInterruptState()) {
+                    Thread.interrupted();
+                }
             }
             if (pool.size()==0 && force && pool!=busy) pool = busy;
         }
@@ -626,7 +628,9 @@ public class ConnectionPool {
                 //retrieve an existing connection
                 con = idle.poll(timetowait, TimeUnit.MILLISECONDS);
             } catch (InterruptedException ex) {
-                Thread.interrupted();//clear the flag, and bail out
+                if (!getPoolProperties().getPropagateInterruptState()) {
+                    Thread.interrupted();
+                }
                 SQLException sx = new SQLException("Pool wait interrupted.");
                 sx.initCause(ex);
                 throw sx;

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java Tue Mar 27 17:55:41 2012
@@ -1268,4 +1268,20 @@ public class DataSourceProxy implements 
         return getPoolProperties().getLogValidationErrors();
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean getPropagateInterruptState() {
+        return getPoolProperties().getPropagateInterruptState();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setPropagateInterruptState(boolean propagateInterruptState) {
+        getPoolProperties().setPropagateInterruptState(propagateInterruptState);
+    }
+
 }

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java Tue Mar 27 17:55:41 2012
@@ -847,4 +847,21 @@ public interface PoolConfiguration {
      */
     public boolean getLogValidationErrors();
 
+    /**
+     * Returns true if the pool is configured to propagate interrupt state of a thread.
+     * A thread waiting for a connection, can have its wait interrupted, and by default
+     * will clear the interrupt flag and throw a {@link PoolExhaustedException}
+     * @return true if the pool is configured to propagate and not clear the thread interrupt state
+     */
+    public boolean getPropagateInterruptState();
+
+    /**
+     * Configure the pool to propagate interrupt state for interrupted threads waiting for a connection
+     * A thread waiting for a connection, can have its wait interrupted, and by default
+     * will clear the interrupt flag and throw a {@link PoolExhaustedException}
+     * If set to true, this behavior will change, while the {@link PoolExhaustedException} is still thrown, the threads interrupted state is still set.
+     * @param propagateInterruptState - set to true to not clear, but propagate, a threads interrupted state.
+     */
+    public void setPropagateInterruptState(boolean propagateInterruptState);
+
 }

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java Tue Mar 27 17:55:41 2012
@@ -88,6 +88,7 @@ public class PoolProperties implements P
     protected boolean rollbackOnReturn = false;
     protected boolean useDisposableConnectionFacade = true;
     protected boolean logValidationErrors = false;
+    protected boolean propagateInterruptState = false;
 
 
     /**
@@ -1229,6 +1230,22 @@ public class PoolProperties implements P
         return this.logValidationErrors;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean getPropagateInterruptState() {
+        return propagateInterruptState;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setPropagateInterruptState(boolean propagateInterruptState) {
+        this.propagateInterruptState = propagateInterruptState;
+    }
+
     @Override
     protected Object clone() throws CloneNotSupportedException {
         // TODO Auto-generated method stub

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java?rev=1305931&r1=1305930&r2=1305931&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java Tue Mar 27 17:55:41 2012
@@ -30,6 +30,7 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.jdbc.pool.PoolConfiguration;
 import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
+import org.apache.tomcat.jdbc.pool.PoolExhaustedException;
 import org.apache.tomcat.jdbc.pool.PoolUtilities;
 import org.apache.tomcat.jdbc.pool.Validator;
 
@@ -811,6 +812,21 @@ public class ConnectionPool extends Noti
     }
 
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean getPropagateInterruptState() {
+        return getPoolProperties().getPropagateInterruptState();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setPropagateInterruptState(boolean propagateInterruptState) {
+        getPoolProperties().setPropagateInterruptState(propagateInterruptState);
+    }
 
 
 



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


RE: svn commit: r1305931 - in /tomcat/trunk/modules/jdbc-pool: doc/ src/main/java/org/apache/tomcat/jdbc/pool/ src/main/java/org/apache/tomcat/jdbc/pool/jmx/

Posted by "Filip Hanik (mailing lists)" <de...@hanik.com>.
> If InterruptedException was thrown by JRE it alone means that
> interrupted flag has been cleared.  So Thread.interrupted() call is a
> NOOP.
> 
> (Effectively the interruption state means "to interrupt the next
> wait() etc. call immediately when they are called".  When the actual
> interruption happens the exception is created and the flag is
> cleared.)
> 
> To propagate the interruption state the code would be
> 
> if (propagate) {
>     Thread.currentThread().interrupt();
> }
[Filip Hanik] 
You are correct. I will adjust this.
> 
> 
> Best regards,
> Konstantin Kolinko
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org



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


Re: svn commit: r1305931 - in /tomcat/trunk/modules/jdbc-pool: doc/ src/main/java/org/apache/tomcat/jdbc/pool/ src/main/java/org/apache/tomcat/jdbc/pool/jmx/

Posted by Konstantin Kolinko <kn...@gmail.com>.
2012/3/27  <fh...@apache.org>:
> Author: fhanik
> Date: Tue Mar 27 17:55:41 2012
> New Revision: 1305931
>
> URL: http://svn.apache.org/viewvc?rev=1305931&view=rev
> Log:
> https://issues.apache.org/bugzilla/show_bug.cgi?id=52066
> Add in a configuration attribute to allow a thread interrupt state to be retained for the calling library to see
>
>
> Modified:
>    tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
>    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
>    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
>    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
>    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
>    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
>

> Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=1305931&r1=1305930&r2=1305931&view=diff
> ==============================================================================
> --- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java (original)
> +++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java Tue Mar 27 17:55:41 2012
> @@ -381,7 +381,9 @@ public class ConnectionPool {
>                     }
>                 } //while
>             } catch (InterruptedException ex) {
> -                Thread.interrupted();
> +                if (!getPoolProperties().getPropagateInterruptState()) {
> +                    Thread.interrupted();
> +                }
>             }
>             if (pool.size()==0 && force && pool!=busy) pool = busy;
>         }
> @@ -626,7 +628,9 @@ public class ConnectionPool {
>                 //retrieve an existing connection
>                 con = idle.poll(timetowait, TimeUnit.MILLISECONDS);
>             } catch (InterruptedException ex) {
> -                Thread.interrupted();//clear the flag, and bail out
> +                if (!getPoolProperties().getPropagateInterruptState()) {
> +                    Thread.interrupted();
> +                }
>                 SQLException sx = new SQLException("Pool wait interrupted.");
>                 sx.initCause(ex);
>                 throw sx;
>

If InterruptedException was thrown by JRE it alone means that
interrupted flag has been cleared.  So Thread.interrupted() call is a
NOOP.

(Effectively the interruption state means "to interrupt the next
wait() etc. call immediately when they are called".  When the actual
interruption happens the exception is created and the flag is
cleared.)

To propagate the interruption state the code would be

if (propagate) {
    Thread.currentThread().interrupt();
}


Best regards,
Konstantin Kolinko

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