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.