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

Knut Anders Hatlen updated DERBY-6092:
--------------------------------------

    Attachment: CloseRAF.java

To test whether it is a JVM bug with double and/or concurrent close, I wrote 
the attached program CloseRAF.java. It first attempts to close a 
RandomAccessFile 1000 times in sequence. If that doesn't fail it continues 
trying (repeatedly) to close a RandomAccessFile from two concurrent threads.

I tested it on a Linux machine with Oracle Java 1.5.0_36, and it fails 
consistently (though it varies how long it takes before failure) with:

java.io.IOException: Bad file descriptor
        at java.io.RandomAccessFile.close0(Native Method)
        at java.io.RandomAccessFile.close(RandomAccessFile.java:532)
        at CloseRAF$1.run(CloseRAF.java:24)
        at java.lang.Thread.run(Thread.java:637)

I haven't seen it fail yet with Java 6 or Java 7 on the same machine.

If this can also be observed with IBM's JVM, it supports the theory that the 
test failure is caused by a JVM bug with concurrent close. It would happen if 
LOBStreamControl's finalize() method and the normal transaction commit logic 
ended up closing the same RAF at the same time.

Since a finalizer is involved, reproducing it depends on garbage collection 
happening at the right moment. I guess the trick with removing ORDER BY clauses 
in the test may have changed the amount of garbage produced, so that garbage 
collection happened at a different time.
                
> testPositionAgressive(org.apache.derbyTesting.functionTests.tests.jdbcapi.BlobClob4BlobTest)j
>  fails with : 'The handle is invalid.: java.io.IOException'.
> ---------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-6092
>                 URL: https://issues.apache.org/jira/browse/DERBY-6092
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.10.1.2, 10.11.0.0
>         Environment: IBM 1,5 
> java.specification.version: 1.5
> java.runtime.version: pwi32dev-20121015 (SR15 )
> java.fullversion: J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-20121012 
> (JIT enabled)
> J9VM - 20121010_124616_lHdSMr
> JIT  - 20120914_26053ifx1_r8
> GC   - 20120911_AA
>            Reporter: Kathey Marsden
>            Priority: Blocker
>         Attachments: CloseRAF.java, derby-6092_noorderby.diff
>
>
> There was 1 error:
> http://people.apache.org/~myrnavl/derby_test_results/main/windows/testlog/ibm15/1449432-suites.All_diff.txt
> 1) 
> testPositionAgressive(org.apache.derbyTesting.functionTests.tests.jdbcapi.BlobClob4BlobTest)java.sql.SQLException:
>  Java exception: 'The handle is invalid.: java.io.IOException'.
>       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.EmbedConnection.clearLOBMapping(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.commit(Unknown Source)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.commit(BaseJDBCTestCase.java:393)
>       at 
> org.apache.derbyTesting.functionTests.tests.jdbcapi.BlobClob4BlobTest.testPositionAgressive(BlobClob4BlobTest.java:1070)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at 
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:117)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBareOverridable(BaseJDBCTestCase.java:424)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBare(BaseJDBCTestCase.java:441)
>       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 
> 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)
>       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)
> Caused by: java.io.IOException: The handle is invalid.
>       at java.io.RandomAccessFile.close0(Native Method)
>       at java.io.RandomAccessFile.close(RandomAccessFile.java:573)
>       at org.apache.derby.impl.jdbc.LOBFile.close(Unknown Source)
>       at org.apache.derby.impl.jdbc.EncryptedLOBFile.close(Unknown Source)
>       ... 53 more

--
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

Reply via email to