(This question was asked in derby-dev, but I replied to derby-user).
Jagadish Prasath Ramu wrote:
Hi,
I am investigating an issue where Sun Application server hangs
"temporarily"/"permanently" while talking to Derby Server.
I could not reproduce the temporary hang. However I could make the hang
permanent.
Permanent Hang Steps :
derby.properties will have the following settings:
derby.drda.maxThreads=32
derby.drda.timeslice=2000
In appserver connection-pool, steady-pool-size is 34 (when the pool is
initialized 34 connections will be created).
Hi Jagadish,
I can easily reproduce this with ij, for instance by setting
derby.drda.maxThreads to two and then making three connections to the
network server.
On the third connection, ij hangs. If I disconnect one of the other two,
the third connection "unhangs".
To me it seems Derby will not handle more concurrent connections than
specified by maxThreads.
From the Admin guide:
"derby.drda.maxThreads
Use the derby.drda.maxThreads property to set a maximum number of
connection threads that Network Server will allocate. If all of the
connection threads are currently being used and the Network Server has
already allocated the maximum number of threads, the threads will be
shared by using the derby.drda.timeslice property to determine when
sessions will be swapped.
Syntax
derby.drda.maxThreads=numthreads
Default
0"
After some brief investigation, I found out that the value of timeSlice
is set to 0. This means the session owns the thread until it
disconnects. When I tried to set the timeSlice (tried value 2000, used
NetworkServerControl to set it), the third connection succeeded, but it
failed when I issued a query on it (see error message below).
I would like to get some feedback from people knowing the state of this
code/feature. To me this looks like a bug, but I do not know the
severity/extent of it.
--
Kristian
[server (five first lines are my printlns)]
Timeslice: 2000
state: 1 > 2000
state: 3 > 2000
state: 9632 > 2000
Exited, state: 9636 > 2000
Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM =
testDB;create=true; diagnostic msg = Session in invalid state:4
org.apache.derby.impl.drda.DRDAProtocolException: Execution failed
because of Permanent Agent Error: SVRCOD = 40; RDBNAM =
testDB;create=true; diagnostic msg = Session in invalid state:4
at
org.apache.derby.impl.drda.DRDAProtocolException.newAgentError(Unknown
Source)
at org.apache.derby.impl.drda.DRDAConnThread.agentError(Unknown
Source)
at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM =
testDB;create=true; diagnostic msg = Session in invalid state:4
org.apache.derby.impl.drda.DRDAProtocolException: Execution failed
because of Permanent Agent Error: SVRCOD = 40; RDBNAM =
testDB;create=true; diagnostic msg = Session in invalid state:4
at
org.apache.derby.impl.drda.DRDAProtocolException.newAgentError(Unknown
Source)
at org.apache.derby.impl.drda.DRDAConnThread.agentError(Unknown
Source)
at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
[client]
select * from sys.systables;
<the result is printed, seems to be correct>
ERROR 58015: The DDM object 0x1232 is not supported. The connection has
been terminated.
When the pool is being initialized, derby.log prints that 31 or 32 or 33
connections had been created and appserver is trying to make another
connection. Appserver hangs waiting for the response from derby.
JStack output below :
------------------------------------------------------------------------------------------------
Thread 9782: (state = IN_NATIVE)
- java.net.SocketInputStream.socketRead0(java.io.FileDescriptor,
byte[], int, int, int) @bci=0 (Interpreted frame)
- java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129
(Interpreted frame)
- org.apache.derby.client.net.Reply.fill(int) @bci=34 (Interpreted
frame)
- org.apache.derby.client.net.Reply.ensureALayerDataInBuffer(int)
@bci=21 (Interpreted frame)
- org.apache.derby.client.net.Reply.readDssHeader() @bci=7 (Interpreted
frame)
- org.apache.derby.client.net.Reply.startSameIdChainParse() @bci=1
(Interpreted frame)
-
org.apache.derby.client.net.NetConnectionReply.readExchangeServerAttributes(org.apache.derby.client.am.Connection)
@bci=1 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.readServerAttributesAndKeyExchange(int)
@bci=8 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.flowServerAttributesAndKeyExchange(int,
byte[]) @bci=22 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.flowUSRIDPWDconnect(java.lang.String)
@bci=3 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.flowConnect(java.lang.String,
int) @bci=163 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.initialize(java.lang.String,
java.lang.String, org.apache.derby.jdbc.ClientDataSource, int, boolean)
@bci=40 (Interpreted frame)
-
org.apache.derby.client.net.NetConnection.<init>(org.apache.derby.client.net.NetLogWriter,
java.lang.String, java.lang.String, org.apache.derby.jdbc.ClientDataSource, int,
boolean) @bci=135 (Interpreted frame)
-
org.apache.derby.jdbc.ClientDataSource.getConnection(java.lang.String,
java.lang.String) @bci=32 (Interpreted frame)
-
com.sun.gjc.spi.DSManagedConnectionFactory.createManagedConnection(javax.security.auth.Subject,
javax.resource.spi.ConnectionRequestInfo) @bci=77, line=96 (Interpreted frame)
-
com.sun.enterprise.resource.LocalTxConnectorAllocator.createResource()
@bci=12, line=56 (Interpreted frame)
-
com.sun.enterprise.resource.AbstractResourcePool.createSingleResource(com.sun.enterprise.resource.ResourceAllocator)
@bci=8, line=756 (Interpreted frame)
-
com.sun.enterprise.resource.AbstractResourcePool.createResourceAndAddToPool(com.sun.enterprise.resource.ResourceAllocator)
@bci=2, line=1515 (Interpreted frame)
-
com.sun.enterprise.resource.AbstractResourcePool.createResources(com.sun.enterprise.resource.ResourceAllocator,
int) @bci=9, line=780 (Interpreted frame)
-
com.sun.enterprise.resource.AbstractResourcePool.initPool(com.sun.enterprise.resource.ResourceSpec,
com.sun.enterprise.resource.ResourceAllocator) @bci=27, line=209 (Interpreted
frame)
-
com.sun.enterprise.resource.AbstractResourcePool.internalGetResource(com.sun.enterprise.resource.ResourceSpec,
com.sun.enterprise.resource.ResourceAllocator, javax.transaction.Transaction)
@bci=10, line=501 (Interpreted frame)
-
com.sun.enterprise.resource.AbstractResourcePool.getResource(com.sun.enterprise.resource.ResourceSpec,
com.sun.enterprise.resource.ResourceAllocator, javax.transaction.Transaction)
@bci=37, line=428 (Interpreted frame)
-
com.sun.enterprise.resource.PoolManagerImpl.getResourceFromPool(com.sun.enterprise.resource.ResourceSpec,
com.sun.enterprise.resource.ResourceAllocator,
com.sun.enterprise.resource.ClientSecurityInfo, javax.transaction.Transaction)
@bci=16, line=248 (Interpreted frame)
-
com.sun.enterprise.resource.PoolManagerImpl.getResource(com.sun.enterprise.resource.ResourceSpec,
com.sun.enterprise.resource.ResourceAllocator,
com.sun.enterprise.resource.ClientSecurityInfo) @bci=34, line=174 (Interpreted
frame)
-
com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(javax.resource.spi.ManagedConnectionFactory,
com.sun.enterprise.deployment.ResourcePrincipal,
javax.resource.spi.ConnectionRequestInfo, boolean, java.lang.String,
java.lang.Object, boolean) @bci=388, line=312 (Interpreted frame)
-
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(javax.resource.spi.ManagedConnectionFactory,
javax.resource.spi.ConnectionRequestInfo, java.lang.String, java.lang.Object)
@bci=362, line=222 (Interpreted frame)
-
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(javax.resource.spi.ManagedConnectionFactory,
javax.resource.spi.ConnectionRequestInfo, java.lang.String) @bci=5, line=152
(Interpreted frame)
-
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(javax.resource.spi.ManagedConnectionFactory,
javax.resource.spi.ConnectionRequestInfo) @bci=7, line=145 (Interpreted frame)
- com.sun.gjc.spi.base.DataSource.getConnection() @bci=9, line=95
(Interpreted frame)
------------------------------------------------------------------------------------------------
1) Can someone please clarify the "maxthreads" & "timeslice" property ?
2) The above said hang seems to be permanent. Is this expected
behavior ?
3) Is it possible that when derby server has lesser threads (32) and
many requests ( > 32 ), derby will respond slowly i.e., user can
explicitly see that the request is waiting for sometime (30 secs, for
ex) and then get the response ?
Thanks,
-Jagadish