> Steve, thanks a lot for your help!
>

My pleasure! This is probably the remaining impediment stopping me from 
moving Poker Copilot to H2 1.4, so I had a good reason for finding the 
problem.



 

>
> On Wednesday, August 5, 2015, Thomas Mueller <[email protected] 
> <javascript:>> wrote:
>
>> Hi,
>>
>> I can reproduce the problem now, and I think I know what the problem is. 
>> I hope to have a fix ready in a few days.
>>
>> Regards,
>> Thomas
>>
>>
>> On Wednesday, August 5, 2015, Steve McLeod <[email protected]> 
>> wrote:
>>
>>> Here's a stack trace in the same scenario from h2 1.4.188 
>>>
>>> org.h2.jdbc.JdbcSQLException: General error: 
>>> "java.lang.ArrayIndexOutOfBoundsException: 4096"; SQL statement:
>>> ROLLBACK [50000-188]
>>> 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.jdbc.JdbcConnection.rollbackInternal(JdbcConnection.java:1500)
>>> at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:488)
>>> at 
>>> org.h2.jdbcx.JdbcXAConnection$PooledJdbcConnection.close(JdbcXAConnection.java:465)
>>> at 
>>> com.barbarysoftware.databaseframework.JdbcTemplateCore.update(JdbcTemplateCore.java:278)
>>> ...
>>> Caused by: java.lang.ArrayIndexOutOfBoundsException: 4096
>>> 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.store.PageStore.writeBack(PageStore.java:418)
>>> at org.h2.store.PageStore.checkpoint(PageStore.java:436)
>>> at org.h2.store.PageStore.commit(PageStore.java:1480)
>>> at org.h2.engine.Database.commit(Database.java:1995)
>>> at org.h2.engine.Session.rollback(Session.java:614)
>>> at 
>>> org.h2.command.dml.TransactionCommand.update(TransactionCommand.java:49)
>>> at org.h2.command.CommandContainer.update(CommandContainer.java:78)
>>> at org.h2.command.Command.executeUpdate(Command.java:254)
>>> ... 17 more
>>>
>>> On Wednesday, 5 August 2015 13:08:37 UTC+2, Steve McLeod wrote:
>>>>
>>>> More info:
>>>>
>>>> I've been unable to reproduce this using the MVStore.
>>>>
>>>> I can make this problem happen when I only use h2 1.3.176 and I can 
>>>> make it happen when I only use h2 1.4.188.
>>>>
>>>> I initially create the database and load some data with 
>>>> h2.storeLocalTime=false, then restart the app with h2.storeLocalTime=true 
>>>> and load some more data. Usually database corruption ensues.
>>>>
>>>>  I've stripped almost every config option from the database url so that 
>>>> it just reads:
>>>>
>>>> jdbc:h2:/Users/steve/Library/Application 
>>>> Support/com.barbarysoftware.pokercopilot/database/pokercopilot;MV_STORE=false
>>>>
>>>> I believe this confirms it is not a new issue, but it has become 
>>>> apparent now because the default value of h2.storeLocalTime changes from 
>>>> 1.3 to 1.4, and I'm trying to move our app from 1.3 to 1.4.
>>>>
>>>> Here's the most recent stack trace:
>>>>
>>>> org.h2.jdbc.JdbcSQLException: General error: 
>>>> "java.lang.ArrayIndexOutOfBoundsException: 2048" [50000-176]
>>>> at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
>>>> at org.h2.message.DbException.get(DbException.java:167)
>>>> at org.h2.message.DbException.convert(DbException.java:294)
>>>> at org.h2.table.RegularTable.addRow(RegularTable.java:138)
>>>> at org.h2.engine.UndoLogRecord.undo(UndoLogRecord.java:111)
>>>> at org.h2.engine.Session.rollbackTo(Session.java:595)
>>>> at org.h2.command.Command.executeUpdate(Command.java:278)
>>>> at 
>>>> org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:158)
>>>> at 
>>>> org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:144)
>>>> at 
>>>> com.barbarysoftware.databaseframework.JdbcTemplateCore.update(JdbcTemplateCore.java:311)
>>>> ... 15 more
>>>> Caused by: java.lang.ArrayIndexOutOfBoundsException: 2048
>>>> at org.h2.store.Data.writeByte(Data.java:379)
>>>> at org.h2.store.Data.writeValue(Data.java:441)
>>>> 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)
>>>> at org.h2.util.CacheLRU.update(CacheLRU.java:123)
>>>> at org.h2.store.PageStore.update(PageStore.java:1097)
>>>> at org.h2.index.PageDataLeaf.addRowTry(PageDataLeaf.java:209)
>>>> at org.h2.index.PageDataLeaf.split(PageDataLeaf.java:377)
>>>> at org.h2.index.PageDataNode.addRowTry(PageDataNode.java:139)
>>>> at org.h2.index.PageDataIndex.addTry(PageDataIndex.java:174)
>>>> at org.h2.index.PageDataIndex.add(PageDataIndex.java:137)
>>>> at org.h2.table.RegularTable.addRow(RegularTable.java:120)
>>>> ... 21 more
>>>>
>>>>
>>>> On Wednesday, 5 August 2015 11:18:36 UTC+2, Steve McLeod wrote:
>>>>>
>>>>> My latest findings:
>>>>>
>>>>> I can reproduce (again, sporadically) the problem by exclusively using 
>>>>> h2 1.4.188 as follows:
>>>>> 1) set System.setProperty("h2.storeLocalTime", "false"), start the 
>>>>> app, import some data; then
>>>>> 2) restart the app with System.setProperty("h2.storeLocalTime", 
>>>>> "true") and import some more data.
>>>>>
>>>>> Once the error occurs, the database is in a corrupted state.
>>>>>
>>>>> I've managed to create and save a corrupted database, which is zipped 
>>>>> to only 5 MB. The zip file includes a trace.db file. Thomas, let me know 
>>>>> if 
>>>>> it is useful for you to see this corrupted database.
>>>>>
>>>>> So far I've been doing this with MV_STORE=false. 
>>>>>
>>>>> I'll continue posting more info as I narrow down the problem.
>>>>>
>>>>>
>>>>> On Tuesday, 4 August 2015 18:48:06 UTC+2, Steve McLeod wrote:
>>>>>>
>>>>>> Hi Thomas,
>>>>>>
>>>>>> The database is created with 1.3.176. The error happens in 1.4.188. 
>>>>>>
>>>>>> I don't normally set h2.storeLocalTime - I just observed that it has 
>>>>>> a different default in 1.4 to 1.3, and at one point my investigations 
>>>>>> led 
>>>>>> me to code dependent on the value. To investigate further, I tried 
>>>>>> reloading the database created in 1.3.176, this time running 
>>>>>> System.setProperty("h2.storeLocalTime", "true") immediately before 
>>>>>> loading 
>>>>>> the H2 JDBC driver (which I do using Class.forName("org.h2.Driver")), 
>>>>>> and 
>>>>>> was able to sporadically reproduce the problem.
>>>>>>
>>>>>> Here's a stack trace (right now it is happening with a simple INSERT 
>>>>>> statement)
>>>>>>
>>>>>>  sql = INSERT INTO hand (gameid, casinoid, gamenumber, starttime) 
>>>>>> VALUES (?, ?, ?, ?)
>>>>>>  org.h2.jdbc.JdbcSQLException: General error: 
>>>>>> "java.lang.ArrayIndexOutOfBoundsException"; SQL statement:
>>>>>>  INSERT INTO hand (gameid, casinoid, gamenumber, starttime) VALUES 
>>>>>> (?, ?, ?, ?) [50000-188]
>>>>>>   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.table.RegularTable.addRow(RegularTable.java:137)
>>>>>>   at org.h2.command.dml.Insert.insertRows(Insert.java:156)
>>>>>>   at org.h2.command.dml.Insert.update(Insert.java:114)
>>>>>>   at org.h2.command.CommandContainer.update(CommandContainer.java:78)
>>>>>>   at org.h2.command.Command.executeUpdate(Command.java:254)
>>>>>>   at 
>>>>>> org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157)
>>>>>>   at 
>>>>>> org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:143)
>>>>>>   at // non-h2 removed
>>>>>>
>>>>>> Caused by: java.lang.ArrayIndexOutOfBoundsException
>>>>>>
>>>>>> I'll keep investigating...
>>>>>>
>>>>>> I can also supply a database that has the problem, but it is 768 MB 
>>>>>> after zipping...so I think I'll try to write some repro code instead.
>>>>>>
>>>>>>
>>>>>> On Tuesday, 4 August 2015 18:01:59 UTC+2, Thomas Mueller wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Maybe you can reproduce the problem more easily if you set the 
>>>>>>> system property "h2.check2" to "true".
>>>>>>>
>>>>>>> I couldn't reproduce the problem so far, and the code looks correct 
>>>>>>> to me (I debugged it and added some trace output, both for 
>>>>>>> storeLocalTime 
>>>>>>> true and false). Maybe it's a bug in an old version, or some strange 
>>>>>>> combination.
>>>>>>>
>>>>>>> Could you post the exact stack trace including error message and 
>>>>>>> error code?
>>>>>>>
>>>>>>> Which version of H2 do you use exactly (1.3.x and 1.4.x), and what 
>>>>>>> is the "create_build" in the database file (select * from 
>>>>>>> information_schema.settings)? How do you set the system property (in 
>>>>>>> which 
>>>>>>> version of H2, how, and when)? It would need to be set before loading 
>>>>>>> the 
>>>>>>> H2 driver.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Thomas
>>>>>>>
>>>>>>>
>>>>>>> On Tuesday, August 4, 2015, Steve McLeod <[email protected]> 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> After some more investigation, I think this happens when the 
>>>>>>>> database was created with H2 1.3.x, it is opened with H2 1.4.x, a 
>>>>>>>> SELECT 
>>>>>>>> query is performed that exceeds the "maxmemoryrows" value (a default 
>>>>>>>> of 
>>>>>>>> 10,000 rows), and their is a TIMESTAMP column in the result.
>>>>>>>>
>>>>>>>> It seems that the ResultDiskBuffer created to buffer the 
>>>>>>>> org.h2.result.ResultSet is getting a wrong result for row length from 
>>>>>>>> org.h2.store.Data.getValueLen(Value v, DataHandler handler) 
>>>>>>>> when v.getType() is of Value.TIMESTAMP. So a call to 
>>>>>>>> ByteArrayOutputStream.checkCapacity is given wrong input.
>>>>>>>>
>>>>>>>> That's what I think, but as the code is foreign to me, I could be 
>>>>>>>> very wrong in my analysis.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Monday, 3 August 2015 12:06:35 UTC+2, Steve McLeod wrote:
>>>>>>>>>
>>>>>>>>> It seems the problem is essentially caused by this:
>>>>>>>>>
>>>>>>>>> In H2 1.3, h2.storeLocalTime=false
>>>>>>>>> In H2 1.4, h2.storeLocalTime=true
>>>>>>>>>
>>>>>>>>> 1. Create a database with 1.3 that uses columns of type DATETIME
>>>>>>>>> 2. Subsequently open it with 1.4
>>>>>>>>> 3. You'll get sporadic exceptions when executing SQL select 
>>>>>>>>> statements. Here's a stack trace:
>>>>>>>>>
>>>>>>>>> org.h2.jdbc.JdbcSQLException: General error: 
>>>>>>>>> "java.lang.ArrayIndexOutOfBoundsException: 2048"
>>>>>>>>>
>>>>>>>>>   at 
>>>>>>>>> org.h2.message.DbException.getJdbcSQLException(DbException.java:344)  
>>>>>>>>>      
>>>>>>>>>                      
>>>>>>>>>   at org.h2.message.DbException.get(DbException.java:167)         
>>>>>>>>>                                    
>>>>>>>>>   at org.h2.message.DbException.convert(DbException.java:294)     
>>>>>>>>>                                    
>>>>>>>>>   at org.h2.command.Command.executeQuery(Command.java:209)       
>>>>>>>>>                                     
>>>>>>>>>   at 
>>>>>>>>> org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:109)
>>>>>>>>>  
>>>>>>>>>                  
>>>>>>>>>
>>>>>>>>> Caused by: java.lang.ArrayIndexOutOfBoundsException: 2048         
>>>>>>>>>       
>>>>>>>>> at org.h2.store.Data.writeVarLong(Data.java:1259)                 
>>>>>>>>>      
>>>>>>>>> at org.h2.store.Data.writeValue(Data.java:526)                     
>>>>>>>>>     
>>>>>>>>> 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)                     
>>>>>>>>>     
>>>>>>>>> at org.h2.store.PageStore.getPage(PageStore.java:858)             
>>>>>>>>>      
>>>>>>>>> at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:234)     
>>>>>>>>>      
>>>>>>>>> at org.h2.index.PageDataNode.getNextPage(PageDataNode.java:233)   
>>>>>>>>>      
>>>>>>>>> at org.h2.index.PageDataLeaf.getNextPage(PageDataLeaf.java:400)   
>>>>>>>>>      
>>>>>>>>> at org.h2.index.PageDataCursor.nextRow(PageDataCursor.java:95)     
>>>>>>>>>     
>>>>>>>>> at org.h2.index.PageDataCursor.next(PageDataCursor.java:53)       
>>>>>>>>>      
>>>>>>>>> at org.h2.index.IndexCursor.next(IndexCursor.java:278)             
>>>>>>>>>     
>>>>>>>>> at org.h2.table.TableFilter.next(TableFilter.java:361)             
>>>>>>>>>     
>>>>>>>>> at org.h2.command.dml.Select.queryFlat(Select.java:533)           
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Select.queryWithoutCache(Select.java:646)   
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Query.query(Query.java:323)                 
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Query.query(Query.java:291)                 
>>>>>>>>>      
>>>>>>>>> at org.h2.index.ViewIndex.find(ViewIndex.java:283)                 
>>>>>>>>>     
>>>>>>>>> at org.h2.index.ViewIndex.find(ViewIndex.java:179)                 
>>>>>>>>>     
>>>>>>>>> at org.h2.index.BaseIndex.find(BaseIndex.java:128)                 
>>>>>>>>>     
>>>>>>>>> at org.h2.index.IndexCursor.find(IndexCursor.java:160)             
>>>>>>>>>     
>>>>>>>>> at org.h2.table.TableFilter.next(TableFilter.java:330)             
>>>>>>>>>     
>>>>>>>>> at org.h2.command.dml.Select.queryGroup(Select.java:327)           
>>>>>>>>>     
>>>>>>>>> at org.h2.command.dml.Select.queryWithoutCache(Select.java:641)   
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Query.query(Query.java:323)                 
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Query.query(Query.java:291)                 
>>>>>>>>>      
>>>>>>>>> at org.h2.command.dml.Query.query(Query.java:37)                   
>>>>>>>>>     
>>>>>>>>> at org.h2.command.CommandContainer.query(CommandContainer.java:91) 
>>>>>>>>>     
>>>>>>>>> at org.h2.command.Command.executeQuery(Command.java:197)           
>>>>>>>>>     
>>>>>>>>>
>>>>>>>>> The same problem occurs if I override  h2.storeLocalTime to be 
>>>>>>>>> true on 1.3 and then open an existing database.
>>>>>>>>>
>>>>>>>>> The problem is sporadic; I've been unable to create a short test 
>>>>>>>>> case. But my findings are feasible, right?
>>>>>>>>>
>>>>>>>>> I'd say this is a significant problem.
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>> 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 [email protected].
>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>> Visit this group at http://groups.google.com/group/h2-database.
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>> -- 
>>> 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 [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/h2-database.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to