db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DERBY-6094) Derby ignores DriverManager.setLoginTimeout()
Date Thu, 07 Mar 2013 16:48:13 GMT

     [ https://issues.apache.org/jira/browse/DERBY-6094?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Rick Hillegas updated DERBY-6094:

    Attachment: derby-6094-01-ac-enforceDriverManagerLoginTimeout.diff

Attaching derby-6094-01-ac-enforceDriverManagerLoginTimeout.diff. This is the first rev of
a patch to fix this issue. The new regression test is vacuous and needs to be beefed up with
the actual test cases from the repro. I am attaching this patch because I would like to get
advice and early feedback from the community.

At a high level, the patch does the following:

1) Enforces login timeouts on the embedded driver and data sources.

2) Makes client-side login timeouts conform to the JDBC 4.2 spec. That is, makes them raise
SQLTimeoutException rather than the less refined SQLTransientException.

3) Adds a debug flag so that JUnit tests can be run with login timeouts set.

I would like the community's feedback on the following issues:

A) Login timeouts are NOT implemented for CDC/FP 1.1. This is because I used java.util.concurrent
classes to implement login timeouts and those classes are not available on CDC/FP 1.1. I think
that it should be possible to implement login timeouts using the Thread support in FP 1.1,
but I think that the java.util.concurrent approach is going to be easier to understand and
maintain and likely to be more robust. If someone cares about login timeouts on CDC/FP 1.1,
please speak up. We can log another JIRA for adding that feature. Note that I'm not volunteering
to do that work: it's not an important platform to me.

B) I am not sure what to do about Thread interrupts incurred during a timed login attempt.
I would like advice from the experts on Derby interrupt handling. The attached patch simply
wraps the interrupt exception in a SQLException. But maybe the right thing to do is to retry
the login attempt until the timer expires. Or something else. I tripped across this problem
while running InterruptResilienceTest with login timeouts. When I run that test like this...

java -Dderby.tests.login.timeout=10 junit.textui.TestRunner org.apache.derbyTesting.functionTests.tests.store.InterruptResilienceTest

...I get errors in testRAFReadWriteMultipleThreads. It looks to me like the following is happening:
A WorkerThread catches an interrupted lock exception, which it expects will happen from time
to time. The WorkerThread then goes on to create a new connection but gets another interrupt
before the login timeout expires.

Touches the following files:


M       java/build/org/apache/derbyBuild/splitmessages.java
M       java/engine/org/apache/derby/impl/jdbc/SQLExceptionFactory40.java
M       java/engine/org/apache/derby/loc/messages.xml
M       java/shared/org/apache/derby/shared/common/reference/SQLState.java
M       java/client/org/apache/derby/client/am/SQLExceptionFactory40.java
M       java/testing/org/apache/derbyTesting/functionTests/tests/lang/ErrorCodeTest.java

New SQLState for login timeouts. This is wrapped in a SQLTimeoutException on Java 6 and higher.


M       java/engine/org/apache/derby/jdbc/InternalDriver.java
M       java/engine/org/apache/derby/jdbc/Driver169.java
M       java/engine/org/apache/derby/jdbc/Driver20.java

The guts of (1). This is where the java.util.concurrent classes are used to enforce login
timeouts for the embedded driver.


M       java/engine/org/apache/derby/impl/jdbc/LOBStoredProcedure.java
M       java/engine/org/apache/derby/impl/jdbc/authentication/NativeAuthenticationServiceImpl.java
M       java/engine/org/apache/derby/impl/db/SlaveDatabase.java
M       java/engine/org/apache/derby/jdbc/EmbeddedBaseDataSource.java
M       java/engine/org/apache/derby/jdbc/EmbeddedSimpleDataSource.java
M       java/engine/org/apache/derby/catalog/SystemProcedures.java
M       java/testing/org/apache/derbyTesting/functionTests/tests/tools/RollBackWrappingWhenFailOnImportTest.java

The changes to the embedded driver resulted in an api change which percolated through the
classes above.


M       java/client/org/apache/derby/client/net/NetConnection.java

This is the enforcement of (2), the raising of SQLTimeoutException on the client when the
login timeout expires.


M       java/testing/org/apache/derbyTesting/junit/DriverManagerConnector.java
M       java/testing/org/apache/derbyTesting/junit/DataSourceConnector.java
M       java/testing/org/apache/derbyTesting/junit/TestConfiguration.java
M       java/testing/org/apache/derbyTesting/junit/XADataSourceConnector.java
M       java/testing/org/apache/derbyTesting/junit/JDBCDataSource.java
M       java/testing/org/apache/derbyTesting/junit/ConnectionPoolDataSourceConnector.java
M       java/testing/org/apache/derbyTesting/junit/Connector.java

The changes for (3). Adds a new debug flag: derby.tests.login.timeout. You can set this to
an integer, the length in seconds of the login timeout which you want to apply to all connection
attempts. I have run the full JUnit suite with this flag set to 10. The tests run cleanly
except for the following problems:

i) The errors in InterruptResilienceTest described above.

ii) I had to comment out NativeAuthenticationServiceTest. By itself, this test runs fine with
derby.tests.login.timeout=10. However, when running the full JUnit suite with derby.tests.login.timeout=10,
NativeAuthenticationServiceTest fails and its failure then chokes the rest of the suite. I
need to investigate what's going on here.


M       java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/_Suite.java
A       java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/LoginTimeoutTest.java

This is the shell of a new test which will contain the cases from the repro.

> Derby ignores DriverManager.setLoginTimeout()
> ---------------------------------------------
>                 Key: DERBY-6094
>                 URL: https://issues.apache.org/jira/browse/DERBY-6094
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions:
>            Reporter: Rick Hillegas
>         Attachments: derby-6094-01-ac-enforceDriverManagerLoginTimeout.diff, LoginTimeoutTest.java,
LoginTimeoutTest.java, LoginTimeoutTest.java, LoginTimeoutTest.java
> If you set a login timeout using the DriverManager, Derby ignores the setting. I will
attach a test case which shows this.

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message