[ http://issues.apache.org/jira/browse/DERBY-1002?page=all ]
Deepa Remesh updated DERBY-1002:
--------------------------------
Attachment: derby1002.java
Attaching a repro 'derby1002.java' which shows how queries can get closed on
the server unexpectedly which leads to protocol exception. To run the repro:
1. Start network server on port 2222.
2. Run the command: java derby1002
3. Output should be:
******************************************
testImplicitClose
******************************************
FAILED (no exception thrown)
******************************************
jira491Test
******************************************
JIRA-491 FAILURE:
Client sends CNTQRY and expects QRYDTA. Server sends QRYNOPRM because the query
has been implicitly
closed
Caught Exception:
java.sql.SQLException: Execution failed due to a distribution protocol error
that caused deallocatio
n of the conversation. The identified cursor is not open.
at
org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:285)
at org.apache.derby.client.am.ResultSet.next(ResultSet.java:269)
at derby1002.jira491Test(derby1002.java:123)
at derby1002.main(derby1002.java:26)
Caused by: org.apache.derby.client.am.DisconnectException: Execution failed due
to a distribution pr
otocol error that caused deallocation of the conversation. The identified
cursor is not open.
at
org.apache.derby.client.net.NetResultSetReply.parseQRYNOPRM(NetResultSetReply.java:331)
at
org.apache.derby.client.net.NetResultSetReply.parseFetchError(NetResultSetReply.java:226)
at
org.apache.derby.client.net.NetResultSetReply.parseCNTQRYreply(NetResultSetReply.java:177
)
at
org.apache.derby.client.net.NetResultSetReply.readFetch(NetResultSetReply.java:38)
at
org.apache.derby.client.net.ResultSetReply.readFetch(ResultSetReply.java:40)
at
org.apache.derby.client.net.NetResultSet.readFetch_(NetResultSet.java:181)
at org.apache.derby.client.am.ResultSet.flowFetch(ResultSet.java:4034)
at
org.apache.derby.client.net.NetCursor.completeSplitRow(NetCursor.java:1057)
at
org.apache.derby.client.net.NetCursor.skipFdocaBytes(NetCursor.java:537)
at
org.apache.derby.client.net.NetCursor.calculateColumnOffsetsForRow_(NetCursor.java:251)
at org.apache.derby.client.am.Cursor.stepNext(Cursor.java:172)
at org.apache.derby.client.am.Cursor.next(Cursor.java:185)
at org.apache.derby.client.am.ResultSet.nextX(ResultSet.java:293)
at org.apache.derby.client.am.ResultSet.next(ResultSet.java:260)
... 2 more
I have taken parts of tests for jira 821 and jira 491 from lang/procedure.java
to create the repro.
--------------------------------------------------------
Context:
--------------------------------------------------------
After Kathey suggested to separate out finalizer changes in DERBY-210, I
updated my workpace and I was running derbynetclientmats suite in a loop with
my patches. I was seeing a new intermittent failure in lang/procedure.java,
which was not there last week. The failure was related to implicit closing of
result sets and hence seeing it this week. Here are the two failures I see on
repeated runs of this test with my patches. Sometimes I get either one of these
failures or none:
1) Failure in testImplicitClose(). This tests to see that the resultsets opened
by EXCSQLSTT do not get implicitly closed. However, implicit close happens
because stmt.hasdata() is evaluating to false at the end of writeQRYDTA. And
the result set's qryclsimp value is also left over from a previous OPNQRY.
942 del
< testImplicitClose(): PASSED
942 add
> testImplicitClose(): FAILED (no exception thrown)
Test Failed.
2) In this failure also, implicit close happens because stmt.hasdata() is
evaluating to false at the end of writeQRYDTA
*** Start: procedure jdk1.5.0_02 DerbyNetClient 2006-02-21 23:36:42 ***
940 del
< JIRA-491 Successful.
941 del
< JIRA-492 successful -- no hang!
942 del
< testImplicitClose(): PASSED
942 add
> JIRA-491 FAILURE: Caught Exception:
> java.sql.SQLException: Execution failed due to a distribution protocol error
> that caused deallocation of the conversation. The identified cursor is not
> open.
> Caused by: org.apache.derby.client.am.DisconnectException: Execution failed
> due to a distribution protocol error that caused deallocation of the
> conversation. The identified cursor is not open.
> ... 3 more
> JIRA-492: FAILURE in data setup:
> java.sql.SQLException: Invalid operation: statement closed
> Caused by: org.apache.derby.client.am.SqlException: Invalid operation:
> statement closed
> ... 3 more
> JIRA-492: FAILURE in procedure creation:
> java.sql.SQLException: Invalid operation: statement closed
> Caused by: org.apache.derby.client.am.SqlException: Invalid operation:
> statement closed
> ... 3 more
> ERROR (no SQLState): invalid operation: connection closed
> java.sql.SQLException: invalid operation: connection closed
> Caused by: org.apache.derby.client.am.SqlException: invalid operation:
> connection closed
> ... 3 more
Test Failed.
On looking at these, I found there could still be problems in the network
server code where DRDAStatement and DRDAResultSet get re-used. Also, it seemed
to me these failures are not related to my patch and should happen without my
patch. I was able to create a repro using parts of the procedure test and
creating/closing statements at right time to provoke this bug without my patch.
--------------------------------------------------------
Details of what repro does:
--------------------------------------------------------
1) Run a select statement so that OPNQRY will be sent to server and qryclsimp
will be set to CodePoint.QRYCLSIMP_YES
2) Close the above statement so that network server will re-use its
DRDAStatement for the next statement.
3) Create a callabale statement and execute a procedure and get all data so
that hasdata for the DRDAResultSet will be false.
4) Close the above statement so that network server will re-use its
DRDAStatement for the next statement.
5a) Run testImplicitClose() from procedure test. This test checks that result
sets do not get implicitly closed when using EXCSQLSTT. But this will fail
since the DRDAResultSet has wrong states and the 'writeQRYDTA' method used by
OPNQRYRM and EXCSQLSTT commands is the same.
5b) Run the test for jira 491. The QRYDTA will be split and hence hasdata must
be true at the time of sending first QRYDTA. However, hasdata evaluates to
false and hence server closes the result set. Client sends CNTQRY to get the
next QRYDTA. Since server has closed the query, it sends back QRYNOPRM which
causes a protocol exception.
--------------------------------------------------------
Summary:
--------------------------------------------------------
Network server code should be changed and reviewed thoroughly to see that the
re-use of objects happens correctly.
> Check that DRDAStatement and DRDAResultSet states are reset when they are
> re-used
> ---------------------------------------------------------------------------------
>
> Key: DERBY-1002
> URL: http://issues.apache.org/jira/browse/DERBY-1002
> Project: Derby
> Type: Bug
> Components: Network Server
> Reporter: Deepa Remesh
> Assignee: Deepa Remesh
> Fix For: 10.2.0.0
> Attachments: derby1002.java
>
> Network server re-uses DRDAStatement and DRDAResultSet objects when client
> sends a request with same section number. When re-using DRDAStatement, it's
> close() method is called which inturn calls close() method of DRDAResultSet.
> For re-use to work properly, we have to ensure the states of these objects
> are reset. This is not a bug but it is an area for possible improvements like:
> * The reset of all states are not in the close() methods. The states get
> re-initialized at different places in the code. Fo example, in case of
> DRDAResultSet, they get initialized in some other DRDAStatement methods -
> like addResultSet, setRsDefaultOptions, setOPNQRYOptions, setQueryOptions
> etc. It will be good to have all resets in one method.
> * The method name "close" is confusing since it is also called when objects
> get re-used. For clarity, it may be good to have a method named reset(). And
> then have the close method call reset.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira