[ 
https://issues.apache.org/jira/browse/DERBY-5243?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13037991#comment-13037991
 ] 

Dag H. Wanvik edited comment on DERBY-5243 at 5/24/11 11:30 PM:
----------------------------------------------------------------

[Edited: first analysis was slightly wrong]:

I did some tracing of this, and I suspect to be a bug in the JDK (1.4.2 and 5). 
In this case, after we have seen an interrupt exception (08000) due seeing the 
thread interrupted in BasicNoPutResultSetImpl#checkCancellationFlag, we want to 
reestablish the connection and reprepare the statement test, the flag should 
still be set after the exception was received.

In the test code, the assert is made after we have performed those two 
operations (reopen, prepare) have been performed, but by adding more trace I 
can see it already cleared when we start handling the exception: It gets 
cleared while the thread is still inside EmbedConnection.movePosition's call to 
handleException. 

While it is processing that (writing to derby.log among other things), I can 
see in my trace that another thread gets interrupted and throws in the same 
way, which may or may not be relevant. When i next see a trace from the first 
thread, its flag has been cleared. None of the threads have been involved in 
NIO during this time inside handleException, although both could have received 
yet another interrupt. But that shouldn't clear the flag, surely. The 
Thread#isInterrupted method is a native method, which could explain why we see 
this only on Linux.


      was (Author: dagw):
    I did some tracing of this, and I suspect to be a bug in the JDK (1.4.2 and 
5). In this case, after we have seen an interrupt exception (08000) due to 
interrupted locking, we want to reestablish the connection and reprepare the 
statement test, the flag still being set after the exception was received. In 
the test code, the assert is made after we have performed those two operations 
(reopen, prepare) have been performed, but in fact I can see it already cleared 
when we start handling the exception. It gets cleared while the thread is still 
inside EmbedConnection.movePosition's call to handleException. While it is 
processing that (writing to derby.log among other things), I can see in my 
trace that another thread gets interrupted during NIO file channel IO. When i 
next see a trace from the first thread, its flag has been cleared. The thread 
that loses its interrupted flag has not, I believe, been involved in NIO during 
this time inside handleException, although it could have received yet another 
interrupt. But that shouldn't clear the flag, surely.

  
> assert failure in test testRAFReadWriteMultipleThreads: interrupted flag 
> cleared
> --------------------------------------------------------------------------------
>
>                 Key: DERBY-5243
>                 URL: https://issues.apache.org/jira/browse/DERBY-5243
>             Project: Derby
>          Issue Type: Bug
>          Components: Test
>    Affects Versions: 10.8.1.2
>         Environment: Linux, Sun JDK 1.4.2u25 and JDK 5. Not seen or JDK 6 or 
> 7, or other OS than Linux
>            Reporter: Dag H. Wanvik
>            Priority: Minor
>         Attachments: DERBY-5243-instrument.diff, DERBY-5243-instrument.stat
>
>
> This is another instance of an interrupted thread losing its interrupted flag 
> after calling Derby, but I believe this is distinct from other we have seen.
> 1) 
> testRAFReadWriteMultipleThreads(org.apache.derbyTesting.functionTests.tests.store.InterruptResilienceTest)java.sql.SQLException:
>  The exception 'junit.framework.AssertionFailedError: WorkerThread 0' was 
> thrown while evaluating an expression.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown 
> Source)
>       at 
> org.apache.derbyTesting.functionTests.tests.store.InterruptResilienceTest.testRAFReadWriteMultipleThreads(InterruptResilienceTest.java:532)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at 
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:112)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
>       at 
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
> Caused by: java.sql.SQLException: Java exception: 'WorkerThread 0: 
> junit.framework.AssertionFailedError'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       ... 45 more
> Caused by: junit.framework.AssertionFailedError: WorkerThread 0
>       at 
> org.apache.derbyTesting.junit.BaseTestCase.fail(BaseTestCase.java:771)
>       at 
> org.apache.derbyTesting.functionTests.tests.store.InterruptResilienceTest.tstRAFReadWriteMultipleThreads(InterruptResilienceTest.java:323)
>       at 
> org.apache.derby.exe.ac070a00b0x0130x06edxad12x000062ebfce90.g0(Unknown 
> Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at org.apache.derby.impl.services.reflect.ReflectMethod.invoke(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.CallStatementResultSet.open(Unknown Source)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
>       at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown 
> Source)
>       ... 41 more
> Caused by: junit.framework.AssertionFailedError
>       at 
> org.apache.derbyTesting.functionTests.tests.store.InterruptResilienceTest$WorkerThread.run(InterruptResilienceTest.java:430)

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to