Extremely rare deadlock seen when starting up database (with index) for the
first time:
Found one Java-level deadlock:
=============================
"H2 Log Writer TEST":
waiting to lock monitor 0x0000000042c9bb80 (object 0x00000000ff22b5a0, a org.h2.store.PageStore),
which is held by "main"
"main":
waiting to lock monitor 0x0000000042c9a5d8 (object 0x00000000ff22a870, a org.h2.engine.Database),
which is held by "H2 Log Writer TEST"
Java stack information for the threads listed above:
===================================================
"H2 Log Writer TEST":
at org.h2.store.PageStore.flushLog(PageStore.java:978)
- waiting to lock <0x00000000ff22b5a0> (a org.h2.store.PageStore)
at org.h2.engine.Database.flush(Database.java:1779)
- locked <0x00000000ff22a870> (a org.h2.engine.Database)
at org.h2.store.WriterThread.run(WriterThread.java:84)
at java.lang.Thread.run(Thread.java:662)
"main":
at org.h2.engine.Database.lockMeta(Database.java:771)
- waiting to lock <0x00000000ff22a870> (a org.h2.engine.Database)
at org.h2.engine.Database.verifyMetaLocked(Database.java:759)
at org.h2.store.PageStore.addMeta(PageStore.java:1709)
- locked <0x00000000ff22b5a0> (a org.h2.store.PageStore)
at org.h2.index.PageBtreeIndex.<init>(PageBtreeIndex.java:62)
at org.h2.table.RegularTable.addIndex(RegularTable.java:223)
at org.h2.command.ddl.CreateIndex.update(CreateIndex.java:92)
at org.h2.command.CommandContainer.update(CommandContainer.java:73)
at org.h2.command.Command.executeUpdate(Command.java:226)
- locked <0x00000000ff232cf8> (a org.h2.engine.Session)
at org.h2.command.CommandList.update(CommandList.java:41)
at org.h2.command.CommandList.executeRemaining(CommandList.java:36)
at org.h2.command.CommandList.update(CommandList.java:42)
at org.h2.command.Command.executeUpdate(Command.java:226)
- locked <0x00000000ff232cf8> (a org.h2.engine.Session)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
- locked <0x00000000ff232cf8> (a org.h2.engine.Session)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
...snip...
Found 1 deadlock.
Occurred with h2 1.3.163 on Linux.
Code review shows one thread attempts to lock Database and then PageStore,
while the other attempts to lock PageStore then Database. Workarounds include
creating the index in a separate transaction, or using -Dh2.check=false to
avoid the "verifyMetaLocked" check.
Original issue reported on code.google.com by mccu...@gmail.com on 12 Mar 2012 at 2:21
Original issue reported on code.google.com by
mccu...@gmail.com
on 12 Mar 2012 at 2:21