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.