You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2013/03/11 17:50:06 UTC
svn commit: r1455230 - in /db/derby/code/trunk/java:
engine/org/apache/derby/jdbc/Driver20.java
testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java
Author: rhillegas
Date: Mon Mar 11 16:50:06 2013
New Revision: 1455230
URL: http://svn.apache.org/r1455230
Log:
DERBY-6094: Make login timeouts recover from interrupts and retry.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/jdbc/Driver20.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/jdbc/Driver20.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/jdbc/Driver20.java?rev=1455230&r1=1455229&r2=1455230&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/jdbc/Driver20.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/jdbc/Driver20.java Mon Mar 11 16:50:06 2013
@@ -52,10 +52,13 @@ import java.util.concurrent.ExecutionExc
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeUnit;
+import org.apache.derby.iapi.util.InterruptStatus;
/**
This class extends the local JDBC driver in order to determine at JBMS
@@ -66,11 +69,13 @@ import java.util.concurrent.TimeUnit;
public abstract class Driver20 extends InternalDriver implements Driver {
- private static ExecutorService _executorPool;
+ private static ThreadPoolExecutor _executorPool;
static
{
- _executorPool = Executors.newCachedThreadPool();
- ((ThreadPoolExecutor) _executorPool).setThreadFactory( new DaemonThreadFactory() );
+ _executorPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
+ 60L, TimeUnit.SECONDS,
+ new SynchronousQueue<Runnable>());
+ _executorPool.setThreadFactory( new DaemonThreadFactory() );
}
private static final String[] BOOLEAN_CHOICES = {"false", "true"};
@@ -245,21 +250,37 @@ public abstract class Driver20 extends I
return connect( url, info, DriverManager.getLoginTimeout() );
}
+ private static final String driver20 = "driver20";
/**
* Use java.util.concurrent package to enforce login timeouts.
*/
protected EmbedConnection timeLogin( String url, Properties info, int loginTimeoutSeconds )
throws SQLException
{
- LoginCallable callable = new LoginCallable( this, url, info );
- Future<EmbedConnection> task = _executorPool.submit( callable );
-
try {
- return task.get( loginTimeoutSeconds, TimeUnit.SECONDS );
+ LoginCallable callable = new LoginCallable( this, url, info );
+ Future<EmbedConnection> task = _executorPool.submit( callable );
+ long startTime = System.currentTimeMillis();
+ long interruptedTime = startTime;
+
+ while ((startTime - interruptedTime) / 1000.0 < loginTimeoutSeconds) {
+ try {
+ return task.get( loginTimeoutSeconds, TimeUnit.SECONDS );
+ }
+ catch (InterruptedException ie) {
+ interruptedTime = System.currentTimeMillis();
+ InterruptStatus.setInterrupted();
+ continue;
+ }
+ catch (ExecutionException ee) { throw processException( ee ); }
+ catch (TimeoutException te) { throw Util.generateCsSQLException( SQLState.LOGIN_TIMEOUT ); }
+ }
+
+ // Timed out due to interrupts, throw.
+ throw Util.generateCsSQLException( SQLState.LOGIN_TIMEOUT );
+ } finally {
+ InterruptStatus.restoreIntrFlagIfSeen();
}
- catch (InterruptedException ie) { throw processException( ie ); }
- catch (ExecutionException ee) { throw processException( ee ); }
- catch (TimeoutException te) { throw Util.generateCsSQLException( SQLState.LOGIN_TIMEOUT ); }
}
/** Process exceptions raised while running a timed login */
private SQLException processException( Throwable t )
@@ -270,7 +291,7 @@ public abstract class Driver20 extends I
}
/** Thread factory to produce daemon threads which don't block VM shutdown */
- public static final class DaemonThreadFactory implements ThreadFactory
+ private static final class DaemonThreadFactory implements ThreadFactory
{
public Thread newThread( Runnable r )
{
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java?rev=1455230&r1=1455229&r2=1455230&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/InterruptResilienceTest.java Mon Mar 11 16:50:06 2013
@@ -134,6 +134,10 @@ public class InterruptResilienceTest ext
thisConf = TestConfiguration.getCurrent();
threadNo = 0; // counter for multiple threads tests
+
+ // test that we recover from login timeouts
+ DriverManager.setLoginTimeout( 10 );
+
allDone = false; // flag for threads to terminate
}
@@ -143,6 +147,8 @@ public class InterruptResilienceTest ext
protected void tearDown()
throws java.lang.Exception {
+ DriverManager.setLoginTimeout( 0 );
+
// Forget about uncommitted changes
rollback();