Return-Path: X-Original-To: apmail-db-derby-dev-archive@www.apache.org Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4655FD0D0 for ; Thu, 7 Mar 2013 16:48:16 +0000 (UTC) Received: (qmail 50075 invoked by uid 500); 7 Mar 2013 16:48:16 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 49706 invoked by uid 500); 7 Mar 2013 16:48:15 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 49519 invoked by uid 99); 7 Mar 2013 16:48:13 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 07 Mar 2013 16:48:13 +0000 Date: Thu, 7 Mar 2013 16:48:13 +0000 (UTC) From: "Rick Hillegas (JIRA)" To: derby-dev@db.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Updated] (DERBY-6094) Derby ignores DriverManager.setLoginTimeout() MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ 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: 10.10.0.0 > 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