Getting internal exception when trying to delete rows. The program ran for 
a number of days without any issue before the error started occurring.  The 
service inserts a few records every second or so, runs a query on the 
records every 60 seconds or so, and truncates records older than a week 
every 60 minutes.  (The inserts/queries/truncation happen simultaneously at 
times.) 

It uses connection pool in multi-threaded environment.  There should only 
be ~3 threads/connections accessing database concurrently at any given 
time, but one of the threads is often running a lengthy query (either 
SELECT or DELETE).  We are using MULTI_THREADED=1 option to avoid serious 
thread blocking issues.  Without that option, H2 seemed 
basically unusable to us.  I know MULTI_THREADED is still considered 
experimental. Any ideas to resolve appreciated, or let me know if I can 
provide more info.    I would try writing a test case, but again, things 
were working fine for days before this issue started occurring.

Database created/running with v1.3.168 on a 32-bit linux machine using Java 
6.  Connection string:

   - jdbc:h2:~/.dbdir/my-db;LOCK_TIMEOUT=10000;MULTI_THREADED=1
   
The trace file shows this initial error:

12-19 00:04:19 jdbc[3]: exception
org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: 
Undo entry not written"; SQL statement:
DELETE FROM DataPoint WHERE endTimestamp < ? [50000-168]
  at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
  at org.h2.message.DbException.get(DbException.java:158)
  at org.h2.message.DbException.convert(DbException.java:281)
  at org.h2.table.RegularTable.removeRow(RegularTable.java:379)
  at org.h2.command.dml.Delete.update(Delete.java:93)
  at org.h2.command.CommandContainer.update(CommandContainer.java:75)
  at org.h2.command.Command.executeUpdate(Command.java:230)
  at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
  at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
  at 
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:818)
  ...etc...
Caused by: java.lang.RuntimeException: Undo entry not written
  at org.h2.message.DbException.throwInternalError(DbException.java:228)
  at org.h2.store.PageLog.addUndo(PageLog.java:486)
  at org.h2.store.PageStore.update(PageStore.java:1055)
  at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:362)
  at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
  at org.h2.index.PageBtreeIndex.remove(PageBtreeIndex.java:241)
  at org.h2.table.RegularTable.removeRow(RegularTable.java:361)
  ... 28 more

That was then followed by:

12-19 01:04:29 jdbc[4]: exception
org.h2.jdbc.JdbcSQLException: Row not found when trying to delete from 
index "PUBLIC.IDX_RECEIVERUPLOADTS_DESC: ( /* key:1955899 */ 1955899, 
17.666666666666668, TIMESTAMP '2012-12-18 15:48:44.565', 'sim-josh-001', 1, 
'APJOSH1', '2', TIMESTAMP '2012-12-18 15:48:39.565', 'UPLOADED', TIMESTAMP 
'2012-12-18 15:48:50.393')"; SQL statement:
DELETE FROM DataPoint WHERE endTimestamp < ? [90112-168]
        at 
org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:169)
        at org.h2.message.DbException.get(DbException.java:146)
        at org.h2.index.PageBtreeLeaf.remove(PageBtreeLeaf.java:225)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeIndex.remove(PageBtreeIndex.java:241)
        at org.h2.table.RegularTable.removeRow(RegularTable.java:361)
        at org.h2.command.dml.Delete.update(Delete.java:93)
        at org.h2.command.CommandContainer.update(CommandContainer.java:75)
        at org.h2.command.Command.executeUpdate(Command.java:230)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)

After those initial exceptions, a repeating pattern every time the program 
tries to delete records would occur. Table lock timeouts would occur (I 
assume because the delete operation is running), with an eventual exception 
"Row not found while deleting".  Excerpt from trace file:

12-19 10:11:33 jdbc[4]: exception
org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "DATAPOINT"; SQL 
statement:
SELECT DISTINCT(receiverIdent) FROM DataPoint WHERE uploadStatus=? ORDER BY 
receiverIdent ASC [50200-168]

12-19 10:11:35 jdbc[3]: exception
org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "DATAPOINT"; SQL 
statement:
insert into DataPoint (id, dataValue, endTimestamp, nodeIdent, nodeType, 
receiverIdent, sensorInputIdent, startTimestamp, uploadStatus, 
uploadStatusUpdated) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?) [50200-168]

12-19 10:11:39 jdbc[5]: exception
org.h2.jdbc.JdbcSQLException: Row not found when trying to delete from 
index "PUBLIC.IDX_RECEIVERUPLOADTS_DESC: ( /* key:1955899 */ 1955899, 
17.666666666666668, TIMESTAMP '2012-
12-18 15:48:44.565', 'sim-josh-001', 1, 'APJOSH1', '2', TIMESTAMP 
'2012-12-18 15:48:39.565', 'UPLOADED', TIMESTAMP '2012-12-18 
15:48:50.393')"; SQL statement:
DELETE FROM DataPoint WHERE endTimestamp < ? [90112-168]
        at 
org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:169)
        at org.h2.message.DbException.get(DbException.java:146)
        at org.h2.index.PageBtreeLeaf.remove(PageBtreeLeaf.java:225)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeNode.remove(PageBtreeNode.java:324)
        at org.h2.index.PageBtreeIndex.remove(PageBtreeIndex.java:241)
        at org.h2.table.RegularTable.removeRow(RegularTable.java:361)
        at org.h2.command.dml.Delete.update(Delete.java:93)
        at org.h2.command.CommandContainer.update(CommandContainer.java:75)
        at org.h2.command.Command.executeUpdate(Command.java:230)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
        at 
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:818)
        ...etc...

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/h2-database/-/rkbaekWMUw4J.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to