LucidDB / luciddb

DEFUNCT: See README
https://github.com/LucidDB/luciddb
Apache License 2.0
53 stars 24 forks source link

[FRG-294] synchronization on session object during DML statement execution causes sessions management view to hang #578

Closed dynamobi-build closed 12 years ago

dynamobi-build commented 12 years ago

[reporter="jvs", created="Fri, 21 Sep 2007 17:26:55 -0500 (GMT-05:00)"] FarragoDbStmtContext.execute synchronizes on session before calling executeImpl, which runs for a long time in getRowCounts.

So, info calls like FarragoDbSession.isClosed will hang.

dynamobi-build commented 12 years ago

[author="jvs", created="Fri, 21 Sep 2007 18:40:19 -0500 (GMT-05:00)"] Also causes shutdown hang if Fennel execution is not responding to abort requests for some reason.

dynamobi-build commented 12 years ago

[author="jvs", created="Mon, 3 Nov 2008 10:56:51 -0500 (GMT-05:00)"] kill_session also suffers from the same issue.

dynamobi-build commented 12 years ago

[author="jvs", created="Thu, 20 Nov 2008 15:08:36 -0500 (GMT-05:00)"] Fixed on //open/dev in eigenchange 11979.

dynamobi-build commented 12 years ago

[author="zfong", created="Wed, 13 May 2009 13:43:25 -0500 (GMT-05:00)"] There still seems to be a problem with this. I can kill a session running a long-running UDR if the UDR is invoked from a select statement. But the kill hangs if I try killing a session that's issued the long-running UDR through a delete statement. E.g.,


Session 1:
create schema s;
set schema 's';
create table t(a int);
insert into t values(1);
delete from t where sys_boot.mgmt.sleep(1000000) = 1;


Session 2:
Attempt to kill session 1. It hangs.

dynamobi-build commented 12 years ago

[author="zfong", created="Wed, 13 May 2009 13:50:29 -0500 (GMT-05:00)"] Here are the stacks for the two threads:


"RMI TCP Connection(48)-10.17.36.91" id=79 idx=0x140 tid=10358 prio=5 alive, in native, sleeping, native_waiting, daemon
    at java/lang/Thread.sleep(J)V(Native Method)
    at net/sf/farrago/syslib/FarragoManagementUDR.sleep(FarragoManagementUDR.java:218)
    at net/sf/farrago/dynamic/stmt14/Transformer1$2.fetchNext()Ljava/lang/Object;(Unknown Source)
    at net/sf/farrago/runtime/FarragoTransformImpl.execute(FarragoTransformImpl.java:100)
    at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
    at net/sf/farrago/fennel/FennelStorage.tupleStreamFetch(J[B)I(Native Method)
    at net/sf/farrago/fennel/FennelStreamGraph.fetch(FennelStreamGraph.java:212)
    at net/sf/farrago/runtime/FennelTupleIter.populateBuffer(FennelTupleIter.java:108)
    at net/sf/farrago/runtime/FennelAbstractTupleIter.fetchNext(FennelAbstractTupleIter.java:122)
    at org/eigenbase/runtime/TupleIterResultSet.next(TupleIterResultSet.java:98)
    at net/sf/farrago/runtime/FarragoTupleIterResultSet.next(FarragoTupleIterResultSet.java:137)
    at com/lucidera/farrago/LucidDbSessionPersonality.getRowCounts(LucidDbSessionPersonality.java:867)
    at net/sf/farrago/db/FarragoDbStmtContext.executeImpl(FarragoDbStmtContext.java:318)
    at net/sf/farrago/db/FarragoDbStmtContext.execute(FarragoDbStmtContext.java:213)
    ^-- Holding lock: net/sf/farrago/db/FarragoDbSession@0x133ee4b8[thin lock]
    at net/sf/farrago/jdbc/engine/FarragoJdbcEngineStatement.execute(FarragoJdbcEngineStatement.java:113)
    at de/simplicit/vjdbc/command/StatementExecuteCommand.execute(StatementExecuteCommand.java:34)
    at de/simplicit/vjdbc/server/command/ConnectionEntry.executeCommand(ConnectionEntry.java:161)
    ^-- Holding lock: de/simplicit/vjdbc/server/command/ConnectionEntry@0x1331c348[thin lock]
    at de/simplicit/vjdbc/server/command/CommandProcessor.process(CommandProcessor.java:158)
    at de/simplicit/vjdbc/server/rmi/CommandSinkRmiImpl.process(CommandSinkRmiImpl.java:37)
    at sun/reflect/GeneratedMethodAccessor1.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(Unknown Source)
    at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java/lang/reflect/Method.invoke(Method.java:585)
    at sun/rmi/server/UnicastServerRef.dispatch(UnicastServerRef.java:294)
    at sun/rmi/transport/Transport$1.run(Transport.java:153)
    at jrockit/vm/AccessController.doPrivileged(AccessController.java:255)
    at sun/rmi/transport/Transport.serviceCall(Transport.java:149)
    at sun/rmi/transport/tcp/TCPTransport.handleMessages(TCPTransport.java:466)
    at sun/rmi/transport/tcp/TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    at java/lang/Thread.run(Thread.java:595)
    at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
    -- end of trace


"RMI TCP Connection(50)-10.17.36.91" id=81 idx=0x148 tid=10365 prio=5 alive, in native, blocked, daemon
    -- Blocked trying to get lock: net/sf/farrago/db/FarragoDbSession@0x133ee4b8[thin lock]
    at jrockit/vm/Threads.sleep(I)V(Native Method)
    at jrockit/vm/Locks.waitForThinRelease(Locks.java:1208)
    at jrockit/vm/Locks.monitorEnterSecondStageHard(Locks.java:1341)
    at jrockit/vm/Locks.monitorEnterSecondStage(Locks.java:1258)
    at jrockit/vm/Locks.monitorEnter(Locks.java:2455)
    at net/sf/farrago/db/FarragoDbSession.closeAllocation(FarragoDbSession.java:691)
    ^-- Holding lock: java/lang/Class@0x19f96130[thin lock]
    at net/sf/farrago/db/FarragoDbSession.kill(FarragoDbSession.java:647)
    at net/sf/farrago/db/FarragoDatabase.killSession(FarragoDatabase.java:821)
    at net/sf/farrago/syslib/FarragoKillUDR.killSession(FarragoKillUDR.java:78)
    at net/sf/farrago/syslib/FarragoKillUDR.killSession(FarragoKillUDR.java:62)
    at net/sf/farrago/dynamic/stmt15/ExecutableStmt$2.calc_oj_var3_f_0$(Lnet/sf/farrago/dynamic/stmt15/ExecutableStmt$2;)V(Unknown Source)
    at net/sf/farrago/dynamic/stmt15/ExecutableStmt$2.fetchNext()Ljava/lang/Object;(Unknown Source)
    at org/eigenbase/runtime/TupleIterResultSet.next(TupleIterResultSet.java:98)
    at net/sf/farrago/runtime/FarragoTupleIterResultSet.next(FarragoTupleIterResultSet.java:137)
    at com/lucidera/farrago/LucidDbSessionPersonality.getRowCounts(LucidDbSessionPersonality.java:867)
    at net/sf/farrago/db/FarragoDbStmtContext.executeImpl(FarragoDbStmtContext.java:318)
    at net/sf/farrago/db/FarragoDbStmtContext.execute(FarragoDbStmtContext.java:213)
    ^-- Holding lock: net/sf/farrago/db/FarragoDbSession@0x271eefa8[thin lock]
    at net/sf/farrago/jdbc/engine/FarragoJdbcEngineStatement.execute(FarragoJdbcEngineStatement.java:113)
    at de/simplicit/vjdbc/command/StatementExecuteCommand.execute(StatementExecuteCommand.java:34)
    at de/simplicit/vjdbc/server/command/ConnectionEntry.executeCommand(ConnectionEntry.java:161)
    ^-- Holding lock: de/simplicit/vjdbc/server/command/ConnectionEntry@0x271eeee8[thin lock]
    at de/simplicit/vjdbc/server/command/CommandProcessor.process(CommandProcessor.java:158)
    at de/simplicit/vjdbc/server/rmi/CommandSinkRmiImpl.process(CommandSinkRmiImpl.java:37)
    at sun/reflect/GeneratedMethodAccessor1.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(Unknown Source)
    at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java/lang/reflect/Method.invoke(Method.java:585)
    at sun/rmi/server/UnicastServerRef.dispatch(UnicastServerRef.java:294)
    at sun/rmi/transport/Transport$1.run(Transport.java:153)
    at jrockit/vm/AccessController.doPrivileged(AccessController.java:255)
    at sun/rmi/transport/Transport.serviceCall(Transport.java:149)
    at sun/rmi/transport/tcp/TCPTransport.handleMessages(TCPTransport.java:466)
    at sun/rmi/transport/tcp/TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    at java/lang/Thread.run(Thread.java:595)
    at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)

dynamobi-build commented 12 years ago

[author="jvs", created="Wed, 13 May 2009 14:30:07 -0500 (GMT-05:00)"] The fix for killing the session is easy (below). However, that still leaves a hang with shutdown.


jvs@bagheera:~/open/dev/farrago/src/net/sf/farrago/db$ p4 diff FarragoDatabase.java
==== //open/dev/farrago/src/net/sf/farrago/db/FarragoDatabase.java#87 - /home/jvs/open/dev/farrago/src/net/sf/farrago/db/FarragoDatabase.java ====
818,820c818,820
< if (cancelOnly) {
< target.cancel();
< } else {




target.cancel();
if (!cancelOnly) {

dynamobi-build commented 12 years ago

[author="jvs", created="Wed, 13 May 2009 14:46:06 -0500 (GMT-05:00)"] Fix for the shutdown hang; I'll check both of these in.


jvs@bagheera:~/open/dev/farrago/src/net/sf/farrago/db$ p4 diff FarragoDatabase.java
==== //open/dev/farrago/src/net/sf/farrago/db/FarragoDatabase.java#87 - /home/jvs/open/dev/farrago/src/net/sf/farrago/db/FarragoDatabase.java ====
442a443,451

// kick off asynchronous cancel requests on each session;
// inside of closeAllocation, we'll wait for each
// of those to be honored
for (ClosableAllocation a : allocations) {
if (a instanceof FarragoDbSession) {
FarragoDbSession session = (FarragoDbSession) a;
session.cancel();
}
}

dynamobi-build commented 12 years ago

[author="jvs", created="Thu, 14 May 2009 02:37:04 -0500 (GMT-05:00)"] Fixes above checked in on //open/dev as eigenchange 12723.