Here is a minimal trigger that I create and then drop
CREATE TRIGGER T1 BEFORE INSERT ON PROGRAM
FOR EACH ROW CALL "DeadlockTrigger";
DROP TRIGGER T1;
/* START OF TRIGGER CLASS */
import java.sql.*;
public class DeadlockTrigger extends TriggerAdapter {
public void fire(Connection conn, ResultSet oldRow, ResultSet newRow)
throws SQLException {
// do nothing
}
public void remove() throws SQLException {
// This is the place where everything gets stuck
System.out.println("THIS I CAN SEE");
Connection conn =
DriverManager.getConnection("jdbc:h2:tcp://localhost/TV7");
System.out.println("THIS I CAN NOT");
}
}
Now when the trigger is dropped I try to create a connection to the database.
And that's when everything is deadlocked.
And here is the Thread Dump I get from the process.
2010-06-01 13:31:02
Full thread dump Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
"H2 TCP Server (tcp://127.0.1.1:9092) thread" prio=10 tid=0x09cf1400 nid=0xc28
waiting for monitor entry [0x87ffe000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.h2.engine.Engine.openSession(Engine.java:72)
- waiting to lock <0xa74db9d8> (a org.h2.engine.Database)
at org.h2.engine.Engine.openSession(Engine.java:141)
- locked <0x8d135218> (a org.h2.engine.Engine)
at org.h2.engine.Engine.getSession(Engine.java:120)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:118)
at java.lang.Thread.run(Thread.java:619)
"H2 Log Writer TV7" daemon prio=10 tid=0x09a82000 nid=0xc26 waiting for monitor
entry [0x8835c000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.h2.engine.Database.flush(Database.java:1701)
- waiting to lock <0xa74db9d8> (a org.h2.engine.Database)
at org.h2.store.WriterThread.run(WriterThread.java:85)
at java.lang.Thread.run(Thread.java:619)
"H2 File Lock Watchdog /opt/h2/TV7.lock.db" daemon prio=10 tid=0x09c3b400
nid=0xc25 waiting on condition [0x883ad000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.h2.store.FileLock.run(FileLock.java:482)
at java.lang.Thread.run(Thread.java:619)
"H2 TCP Server (tcp://127.0.1.1:9092) thread" prio=10 tid=0x099c8400 nid=0xc23
runnable [0x88583000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
- locked <0xa6dca7c0> (a java.io.BufferedInputStream)
at java.io.DataInputStream.readInt(DataInputStream.java:370)
at org.h2.value.Transfer.readInt(Transfer.java:145)
at org.h2.engine.SessionRemote.done(SessionRemote.java:500)
at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:113)
at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:322)
at
org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:221)
at org.h2.engine.SessionRemote.createSession(SessionRemote.java:215)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:111)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:95)
at org.h2.Driver.connect(Driver.java:58)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at archon.exodus.h2.DeadlockTrigger.remove(DeadlockTrigger.java:17)
at
org.h2.schema.TriggerObject.removeChildrenAndResources(TriggerObject.java:326)
at org.h2.engine.Database.removeSchemaObject(Database.java:1563)
- locked <0xa74db9d8> (a org.h2.engine.Database)
at org.h2.command.ddl.DropTrigger.update(DropTrigger.java:50)
at org.h2.command.CommandContainer.update(CommandContainer.java:70)
at org.h2.command.Command.executeUpdate(Command.java:198)
- locked <0xa74db9d8> (a org.h2.engine.Database)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:297)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:134)
at java.lang.Thread.run(Thread.java:619)
"DestroyJavaVM" prio=10 tid=0x884ad000 nid=0xc0f waiting on condition
[0x00000000]
java.lang.Thread.State: RUNNABLE
"H2 TCP Server (tcp://127.0.1.1:9092)" prio=10 tid=0x884a8800 nid=0xc1d runnable
[0x883fe000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
- locked <0xa74d4060> (a java.net.SocksSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.h2.server.TcpServer.listen(TcpServer.java:213)
at org.h2.tools.Server.run(Server.java:428)
at java.lang.Thread.run(Thread.java:619)
"H2 Console Server (http://127.0.1.1:8082)" prio=10 tid=0x09a06000 nid=0xc1a
runnable [0x88672000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
- locked <0xa74db748> (a java.net.SocksSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.h2.server.web.WebServer.listen(WebServer.java:283)
at org.h2.tools.Server.run(Server.java:428)
at java.lang.Thread.run(Thread.java:619)
"Low Memory Detector" daemon prio=10 tid=0x099d7c00 nid=0xc18 runnable
[0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread1" daemon prio=10 tid=0x099d6400 nid=0xc17 waiting on condition
[0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x099d3000 nid=0xc16 waiting on condition
[0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x099d1800 nid=0xc15 waiting on condition
[0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0x099bd000 nid=0xc14 in Object.wait()
[0x88a7e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x8d066a80> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x8d066a80> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x099bb800 nid=0xc13 in Object.wait()
[0x88acf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x8d0662f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x8d0662f0> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x099b8c00 nid=0xc12 runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x09945400 nid=0xc10 runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x09946800 nid=0xc11 runnable
"VM Periodic Task Thread" prio=10 tid=0x099d9c00 nid=0xc19 waiting on condition
JNI global references: 858
Heap
PSYoungGen total 11520K, used 4829K [0xa6b10000, 0xa8190000, 0xb3860000)
eden space 9920K, 32% used [0xa6b10000,0xa6e3b6c8,0xa74c0000)
from space 1600K, 99% used [0xa74c0000,0xa764c030,0xa7650000)
to space 1600K, 0% used [0xa8000000,0xa8000000,0xa8190000)
PSOldGen total 26304K, used 1343K [0x8d060000, 0x8ea10000, 0xa6b10000)
object space 26304K, 5% used [0x8d060000,0x8d1aff08,0x8ea10000)
PSPermGen total 16384K, used 6358K [0x89060000, 0x8a060000, 0x8d060000)
object space 16384K, 38% used [0x89060000,0x89695a08,0x8a060000)
DROP TRIGGER is executed h2 call's the triggers remove() method....
If something is blocked, please provide the full thread dump (you get
that using kill -QUIT <pid> on Linus and Ctrl+Break on Windows).
Regards,
Thomas
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
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.