sagarswathi / h2database

Automatically exported from code.google.com/p/h2database
0 stars 1 forks source link

Extremely rare deadlock between Database and PageStore #383

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
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

GoogleCodeExporter commented 8 years ago
This should be fixed in version 1.3.170.

Thanks for reporting the issue, and sorry that it took so long!

Original comment by thomas.t...@gmail.com on 30 Nov 2012 at 7:07