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());
}