Moving from H2 1.3.176 to 1.4.187 results in sporadic ArrayIndexOutOfBoundsExceptions?

118 views
Skip to first unread message

Steve McLeod

unread,
May 6, 2015, 9:06:17 AM5/6/15
to h2-da...@googlegroups.com
Today I released an update for my product, Poker Copilot. Until today, it used H2 1.3.176. Today's update uses H2 1.4.187, with MV_STORE=false appended to the database URL. After today's update, we are getting many H2 crash reports on both Windows and OS X. Poker Copilot is a mature product that has been using H2 for six years, and is used by many people each day; until this release we were getting infrequent crash reports. It does initially look like this is a sporadic H2 problem, although I am, of course, open to the idea that it is caused by my own programming mistakes.

On OS X, the database URL is 
jdbc:h2:/Users/steve/Library/Application Support/com.barbarysoftware.pokercopilot/database/pokercopilot;DATABASE_EVENT_LISTENER='com.barbarysoftware.pokercopilot.database.DatabaseListener';COMPRESS_LOB=DEFLATE;MV_STORE=false;CACHE_SIZE=65536

The most common crash reports are variants of:

 java.lang.
ArrayIndexOutOfBoundsException: 2048
        at org.h2.store.Data.writeVarLong(Data.java:1254)
        at org.h2.store.Data.writeValue(Data.java:523)
        at org.h2.index.PageBtreeIndex.writeRow(PageBtreeIndex.java:393)
        at org.h2.index.PageBtreeNode.writeData(PageBtreeNode.java:453)
        at org.h2.index.PageBtreeNode.write(PageBtreeNode.java:426)
        at org.h2.store.PageStore.writeBack(PageStore.java:1046)
        at org.h2.util.CacheLRU.removeOld(CacheLRU.java:215)
        at org.h2.util.CacheLRU.removeOldIfRequired(CacheLRU.java:141)
        at org.h2.util.CacheLRU.put(CacheLRU.java:115)
        at org.h2.store.PageStore.getPage(PageStore.java:857)
        at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:233)
        at org.h2.index.PageDataNode.getRowWithKey(PageDataNode.java:279)
        at org.h2.index.PageDataIndex.getRowWithKey(PageDataIndex.java:426)
        at org.h2.index.PageDataIndex.getRow(PageDataIndex.java:415)
        at org.h2.table.RegularTable.getRow(RegularTable.java:106)
        at org.h2.index.PageBtreeIndex.getRow(PageBtreeIndex.java:301)
        at org.h2.index.PageBtreeCursor.get(PageBtreeCursor.java:45)
        at org.h2.index.IndexCursor.get(IndexCursor.java:260)
        at org.h2.table.TableFilter.getValue(TableFilter.java:913)
        at org.h2.expression.ExpressionColumn.getValue(ExpressionColumn.java:186)
        at org.h2.command.dml.Select.queryFlat(Select.java:580)
        at org.h2.command.dml.Select.queryWithoutCache(Select.java:685)
        at org.h2.command.dml.Query.query(Query.java:322)
        at org.h2.command.dml.Query.query(Query.java:290)
        at org.h2.command.dml.Query.query(Query.java:36)
        at org.h2.command.CommandContainer.query(CommandContainer.java:90)
        at org.h2.command.Command.executeQuery(Command.java:197)
        ... 18 more

and 

Caused by: java.lang.ArrayIndexOutOfBoundsException: 2048
        at org.h2.store.Data.writeStringWithoutLength(Data.java:263)
        at org.h2.store.Data.writeValue(Data.java:566)
        at org.h2.index.PageBtreeIndex.writeRow(PageBtreeIndex.java:393)
        at org.h2.index.PageBtreeNode.writeData(PageBtreeNode.java:453)
        at org.h2.index.PageBtreeNode.write(PageBtreeNode.java:426)
        at org.h2.store.PageStore.writeBack(PageStore.java:1046)
        at org.h2.util.CacheLRU.removeOld(CacheLRU.java:215)
        at org.h2.util.CacheLRU.removeOldIfRequired(CacheLRU.java:141)
        at org.h2.util.CacheLRU.put(CacheLRU.java:115)
        at org.h2.store.PageStore.getPage(PageStore.java:857)
        at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:233)
        at org.h2.index.PageDataIndex.find(PageDataIndex.java:283)
        at org.h2.index.BaseIndex.find(BaseIndex.java:127)
        at org.h2.index.IndexCursor.find(IndexCursor.java:159)
        at org.h2.table.TableFilter.next(TableFilter.java:329)
        at org.h2.command.dml.Select.queryFlat(Select.java:573)
        at org.h2.command.dml.Select.queryWithoutCache(Select.java:685)
        at org.h2.command.dml.Query.query(Query.java:322)
        at org.h2.command.dml.Query.query(Query.java:290)
        at org.h2.command.dml.Query.query(Query.java:36)
        at org.h2.command.CommandContainer.query(CommandContainer.java:90)
        at org.h2.command.Command.executeQuery(Command.java:197)
        ... 18 more

and

org.h2.jdbc.JdbcSQLException: General error: "java.lang.ArrayIndexOutOfBoundsException"; SQL statement:
SET CACHE_SIZE 65536 [50000-187]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
        at org.h2.message.DbException.get(DbException.java:168)
        at org.h2.message.DbException.convert(DbException.java:295)
        at org.h2.command.Command.executeUpdate(Command.java:262)
        at org.h2.engine.Engine.openSession(Engine.java:196)
        at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145)
        at org.h2.engine.Engine.createSession(Engine.java:128)
        at org.h2.engine.Engine.createSession(Engine.java:26)
        at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
        at org.h2.Driver.connect(Driver.java:72)
        at org.h2.jdbcx.JdbcDataSource.getJdbcConnection(JdbcDataSource.java:190)
        at org.h2.jdbcx.JdbcDataSource.getXAConnection(JdbcDataSource.java:353)
        at org.h2.jdbcx.JdbcDataSource.getPooledConnection(JdbcDataSource.java:385)
        at org.h2.jdbcx.JdbcConnectionPool.getConnectionNow(JdbcConnectionPool.java:227)
        at org.h2.jdbcx.JdbcConnectionPool.getConnection(JdbcConnectionPool.java:199)
        at com.barbarysoftware.databaseframework.JdbcTemplateCore.getConnection(JdbcTemplateCore.java:46)
        ... 10 more
Caused by: java.lang.ArrayIndexOutOfBoundsException



I'll need to rectify this pretty quickly. Does this sound like a problem introduced in a specific update of H2? If so, what's the version I should use to avoid this problem?

Regards,
  
Steve McLeod
Founder, Poker Copilot




Thomas Mueller

unread,
May 8, 2015, 12:12:07 PM5/8/15
to h2-da...@googlegroups.com
Hi,

I don't know what the problem could be. There were no changes in this area.

What is strange is: The exception says it is trying to read past the end of a page that is 2048 bytes long. The default page size is 4096 bytes, did you set it manually to 2048 bytes? According to the database URL it doesn't look like.

Regards,
Thomas
--
You received this message because you are subscribed to the Google Groups "H2 Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email to h2-database...@googlegroups.com.
To post to this group, send email to h2-da...@googlegroups.com.
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Steve McLeod

unread,
May 9, 2015, 2:02:54 AM5/9/15
to h2-da...@googlegroups.com
Hi Thomas,

> The default page size is 4096 bytes, did you set it manually to 2048 bytes?

No, I didn't change it. Do note, that the databases were created with 1.3.176 and the crashes happened with 1.4.187.

I've reverted to 1.3.176. That stopped the crashes almost immediately, although we are still getting a few. These newer crash messages refer to 4096 bytes. eg:

Caused by: java.lang.ArrayIndexOutOfBoundsException: 4096
        at org.h2.store.Data.writeVarInt(Data.java:1187)
        at org.h2.store.Data.writeValue(Data.java:531)
        at org.h2.index.PageBtreeIndex.writeRow(PageBtreeIndex.java:394)
        at org.h2.index.PageBtreeNode.writeData(PageBtreeNode.java:454)
        at org.h2.index.PageBtreeNode.write(PageBtreeNode.java:427)
        at org.h2.store.PageStore.writeBack(PageStore.java:1047)
        at org.h2.util.CacheLRU.removeOld(CacheLRU.java:216)
        at org.h2.util.CacheLRU.removeOldIfRequired(CacheLRU.java:142)
        at org.h2.util.CacheLRU.put(CacheLRU.java:116)
To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages