[
https://issues.apache.org/jira/browse/DERBY-6092?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Knut Anders Hatlen updated DERBY-6092:
--------------------------------------
Attachment: d6092-1a-reorder-cleanup.diff
I think this problem could be avoided without introducing more synchronization
by reordering how the finalizer performs the cleanup. See the attached patch
d6092-1a-reorder-cleanup.diff.
The patch makes the finalizer's cleanup code remove the LOBFile from the list
of open files before attempting to close it. This way, when commit or rollback
calls clearLOBMapping(), it won't find the file in the list if the finalizer is
about to close it, and it won't attempt to close it a second time.
Conversely, if clearLOBMapping() is about to close the file when the finalizer
is run, the finalizer will have to wait until it's done before it can proceed
with removing the file from the list (because clearLOBMapping() synchronizes on
the list while it iterates over it). Since the patch makes the finalizer wait
with closing the file until it's removed from the list, it won't try to close
it until after clearLOBMapping() is done closing it. In this case, the file
will still be closed twice, but it won't be closed twice concurrently, and the
bug is avoided.
On Java 6 and newer the patch shouldn't be necessary for correctness. However,
it makes it slightly less likely that unnecessary work (that is, double
closing) is done, and it doesn't increase code complexity, so I think it's an
improvement regardless of the JVM bug it attempts to work around.
I'm running the full regression test suite on the patch now.
It would be good if someone who is able to reproduce the problem could check if
the patch helps.
> 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, d6092-1a-reorder-cleanup.diff,
> 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