db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kristian Waagan <Kristian.Waa...@Sun.COM>
Subject Re: Derby causes appserver hang with "maxthreads"
Date Fri, 10 Nov 2006 10:30:26 GMT
(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
> 
> 
> 
> 
> 


Mime
View raw message