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

Knut Anders Hatlen commented on DERBY-3655:
-------------------------------------------

If the finalizer calls free(), the object must have been gc'ed, so I'm not sure 
how anyone else could be able to call free() at the same time. Did you ever 
experience a NullPointerException without the synchronization?

What I think could happen which would require synchronization, is that 
LOBStreamControl.finalize() calls free() -> EmbedConnection.removeLOBFile() 
while EmbedConnection.clearLOBMapping() is iterating over lobFiles. This could 
cause a ConcurrentModificationException or something in EmbedConnection. To 
prevent this, we would have to add synchronization in EmbedConnection around 
the accesses to lobFiles. I don't think synchronization in LOBStreamControl 
would prevent it.

Another reason to synchronize accesses to EmbedConnection.lobFiles is that we 
could have code that did something like this:

  Blob b1 = conn.createBlob();
  Blob b2 = conn.createBlob();
  new Thread(new BlobHandler(b1, ...)).start();
  new Thread(new BlobHandler(b2, ...)).start();

In such a case, we could get calls to addLobFile/removeLobFile on the same 
EmbedConnection from different threads concurrently.

> errror in nightly regression test: 
> LobStreamsTest:encryptedjunit.framework.AssertionFailedError: 
> f:\jartest\JarResults.2008-04-29\ibm16_suites.All\system\singleUse\oneuse1e\tmp\lob6165.tmp
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3655
>                 URL: https://issues.apache.org/jira/browse/DERBY-3655
>             Project: Derby
>          Issue Type: Bug
>          Components: Regression Test Failure
>    Affects Versions: 10.3.3.0, 10.4.2.0
>         Environment: OS: Windows, Test: v10_4 branch insane jars, ibm16 jvm
> OS: Windows, Test: v10_3 branch insane jars, ibm142 jvm
>            Reporter: Mike Matrigali
>            Assignee: Kathey Marsden
>         Attachments: derby-3655_diff.txt, derby-3655_diff2.txt
>
>
> There was 1 failure:
> 1) LobStreamsTest:encryptedjunit.framework.AssertionFailedError: 
> f:\jartest\JarResults.2008-04-29\ibm16_suites.All\system\singleUse\oneuse1e\tmp\lob6165.tmp
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.removeDir(DropDatabaseSetup.java:130)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.removeDir(DropDatabaseSetup.java:128)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.access$000(DropDatabaseSetup.java:35)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup$1.run(DropDatabaseSetup.java:105)
>       at 
> java.security.AccessController.doPrivileged(AccessController.java:202)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.removeDirectory(DropDatabaseSetup.java:102)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.removeDirectory(DropDatabaseSetup.java:98)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.removeDatabase(DropDatabaseSetup.java:91)
>       at 
> org.apache.derbyTesting.junit.DropDatabaseSetup.tearDown(DropDatabaseSetup.java:77)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:20)
>       at junit.extensions.TestSetup.run(TestSetup.java:23)
>       at 
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
>       at junit.extensions.TestSetup.run(TestSetup.java:23)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to