You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Dag H. Wanvik (JIRA)" <ji...@apache.org> on 2011/01/07 00:38:45 UTC
[jira] Commented: (DERBY-4960) Race condition in
FileContainer#allocCache when reopening RAFContainer after interrupt
[ https://issues.apache.org/jira/browse/DERBY-4960?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12978577#action_12978577 ]
Dag H. Wanvik commented on DERBY-4960:
--------------------------------------
Trying to synchronize here gave deadlock instead:
One thread owns allocCache and is wait for latch. Another thread owns the latch, sees interrupt and tries to reopen the container and in that process need to call allocCache.reset: hence deadlock.
Probably we can skip the call to allocCache.reset: when we reopen, since we are not really reusing the file container object for another container, we are just reopening it...
> Race condition in FileContainer#allocCache when reopening RAFContainer after interrupt
> --------------------------------------------------------------------------------------
>
> Key: DERBY-4960
> URL: https://issues.apache.org/jira/browse/DERBY-4960
> Project: Derby
> Issue Type: Bug
> Components: Store
> Affects Versions: 10.8.0.0
> Reporter: Dag H. Wanvik
>
> The symptom is an ArrayIndexOutOfBoundsException:
> java.lang.ArrayIndexOutOfBoundsException: -1
> at org.apache.derby.impl.store.raw.data.AllocationCache.validate(AllocationCache.java:581)
> at org.apache.derby.impl.store.raw.data.AllocationCache.getLastPageNumber(AllocationCache.java:122)
> at org.apache.derby.impl.store.raw.data.FileContainer.pageValid(FileContainer.java:2067)
> at org.apache.derby.impl.store.raw.data.FileContainer.getUserPage(FileContainer.java:2522)
> at org.apache.derby.impl.store.raw.data.FileContainer.getInsertablePage(FileContainer.java:2867)
> at org.apache.derby.impl.store.raw.data.FileContainer.getPageForInsert(FileContainer.java:3017)
> at org.apache.derby.impl.store.raw.data.BaseContainerHandle.getPageForInsert(BaseContainerHandle.java:372)
> at org.apache.derby.impl.store.access.heap.HeapController.doInsert(HeapController.java:244)
> at org.apache.derby.impl.store.access.heap.HeapController.insertAndFetchLocation(HeapController.java:599)
> at org.apache.derby.impl.sql.execute.RowChangerImpl.insertRow(RowChangerImpl.java:452)
> at org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(InsertResultSet.java:1028)
> at org.apache.derby.impl.sql.execute.InsertResultSet.open(InsertResultSet.java:505)
> at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:436)
> at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:317)
> at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1241)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1686)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeUpdate(EmbedPreparedStatement.java:308)
> at InterruptTest$WorkerThread.run(InterruptTest.java:261
> This can only happen if another thread has called allocCache.reset while the thread above is in the loop in validate, so as to set numExtents to 0.
> The synchronization of allocCache is documented in the Javadoc of the FileContainer class: all accesses to allocCache should synchronize.
> This is omitted when we reopen: FileContainer#openContainer calls readHeader -> readHeaderFromArray -> allocCache.reset
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.