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/08 02:55:45 UTC

[jira] Closed: (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:all-tabpanel ]

Dag H. Wanvik closed DERBY-4960.
--------------------------------

    Resolution: Fixed

Committed version 2 as svn 1056591, closing.


> 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
>            Assignee: Dag H. Wanvik
>         Attachments: derby-4960-1.diff, derby-4960-1.stat, derby-4960-2.diff, derby-4960-2.stat, InterruptTest.java
>
>
> 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.