Re: [h2] Database corrupt after computer power failure.

2015-05-09 Thread Thomas Mueller
Hi,

Until this problem is fixed, it might make sense to use the PageStore
storage engine, by appending ;mv_store=false to the database URL.

Regards,
Thomas


On Friday, May 8, 2015, Mikael Nordenberg mik...@ikanos.se wrote:

 Thank you for your response and time to investigate this.

 That is very interesting!
 I attach another case when this happened, in case it can be used to verify
 your assumption.
 I have not been able to reproduce this on a test machine yet.
 But it has happened twice in just a matter of days on one client machine,
 so it may be reproducible on that PC.
 (The affected PC runs Windows 7, and uses a Samsung 850 EVO SSD drive if
 that matters.)

 /Mikael


 Den fredag 8 maj 2015 kl. 18:12:07 UTC+2 skrev Thomas Mueller:

 Hi,

 Thanks a lot! I have analyzed the database file, and I think I know what
 the problem is. It looks like the disk (or operating system) re-ordered
 write operations, so that changes later in time (and later in the file)
 were written, but one earlier change (both in time and in the file) was not
 written.

 (Detail for later reference: various entries (in chunks 'aad4' to 'aadb',
 from 16:05:10.378 to 16:05:13.916) think that chunk 'aad3' (later than
 16:05:09.369, earlier than 16:05:10.378) is in block 2, but block 2
 actually contains the earlier chunk 'aa7b' from 16:04:24.742).

 The MVStore should detect this and automatically discard chunks that were
 written later than 16:05:10.378. It does not currently do that, this is a
 problem. I will implement this for the next release.

 I think what also can happen is write re-ordering causes a file to be
 truncated too early. This would explain a different corruption problem. The
 fix for that would need to be different however (truncation would need to
 wait for 45 seconds).

 Regards,
 Thomas




 On Thursday, May 7, 2015, Mikael Nordenberg mik...@ikanos.se wrote:

 Same corruption happened again today on a clients computer when power
 disappeared.
 Will try to reproduce tomorrow in our lab.

 /Mikael

 Den torsdag 7 maj 2015 kl. 15:42:48 UTC+2 skrev Mikael Nordenberg:

 Hi,

 We are using H2 version 1.4.185 with mv-store.
 After an unclean shutdown the database file was corrupt. The database
 is attached.
 Opening the database results in http://pastebin.com/PXceifPx

 The database is used from a single thread.
 Hope this gives anything...

 /Mikael

  --
 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+unsubscr...@googlegroups.com.
 To post to this group, send email to h2-database@googlegroups.com.
 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 h2-database+unsubscr...@googlegroups.com
 javascript:_e(%7B%7D,'cvml','h2-database%2bunsubscr...@googlegroups.com');
 .
 To post to this group, send email to h2-database@googlegroups.com
 javascript:_e(%7B%7D,'cvml','h2-database@googlegroups.com');.
 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 h2-database+unsubscr...@googlegroups.com.
To post to this group, send email to h2-database@googlegroups.com.
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.


Re: [h2] Moving from H2 1.3.176 to 1.4.187 results in sporadic ArrayIndexOutOfBoundsExceptions?

2015-05-09 Thread Steve McLeod
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)

On Saturday, 9 May 2015 02:12:07 UTC+10, Thomas Mueller wrote:

 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


 On Wednesday, May 6, 2015, Steve McLeod steve@gmail.com javascript: 
 wrote:

 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)