Description
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
Attachments
Attachments
Issue Links
- is part of
-
DERBY-4741 Make embedded Derby work reliably in the presence of thread interrupts
- Closed