You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by km...@apache.org on 2013/08/02 18:06:14 UTC

svn commit: r1509754 - in /db/derby/code/branches/10.8: ./ java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java

Author: kmarsden
Date: Fri Aug  2 16:06:13 2013
New Revision: 1509754

URL: http://svn.apache.org/r1509754
Log:
DERBY-6092 testPositionAgressive(org.apache.derbyTesting.functionTests.tests.jdbcapi.BlobClob4BlobTest)j fails with : 'The handle is invalid.: java.io.IOException'

Merged from 10.10 revision 1466378
Contributed by Knut Anders Hatlen


Modified:
    db/derby/code/branches/10.8/   (props changed)
    db/derby/code/branches/10.8/java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java

Propchange: db/derby/code/branches/10.8/
------------------------------------------------------------------------------
  Merged /db/derby/code/trunk:r1466362
  Merged /db/derby/code/branches/10.10:r1466378

Modified: db/derby/code/branches/10.8/java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java?rev=1509754&r1=1509753&r2=1509754&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java (original)
+++ db/derby/code/branches/10.8/java/engine/org/apache/derby/impl/jdbc/LOBStreamControl.java Fri Aug  2 16:06:13 2013
@@ -530,8 +530,22 @@ class LOBStreamControl {
      * @throws IOException if the file cannot be closed or deleted
      */
     private void releaseTempFile(LOBFile file) throws IOException {
-        file.close();
+        // Remove the file from the list of open files *first*, then close it.
+        //
+        // Why? This code may be called from finalize(), and may end up running
+        // at the same time the transaction is committed or rolled back. If two
+        // threads call RandomAccessFile.close() at the same time, Java 5 could
+        // fail (see DERBY-6092). By removing it from the list before closing
+        // it, we make sure that EmbedConnection.clearLOBMapping() won't see
+        // it if we get to the file first. Conversely, if clearLOBMapping()
+        // gets to it first, the call to removeLobFile() will block until
+        // clearLOBMapping() is done, so we won't attempt to close the file
+        // until after clearLOBMapping() is done, rather than at the same time.
+        //
+        // Calling close() concurrently is safe on Java 6 and newer, after the
+        // fix for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6322678 .
         conn.removeLobFile(file);
+        file.close();
         deleteFile(file.getStorageFile());
     }