[ 
https://issues.apache.org/jira/browse/DERBY-3172?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12543190
 ] 

mamtas edited comment on DERBY-3172 at 11/26/07 11:01 PM:
-------------------------------------------------------------------

Just committed a change into trunk through 595803 which should take care of 
DataSourceTest failure. The commit comments are as follows

This is a followup checkin to checkin(595047) was committed for DERBY-3172. The 
DataSourceTest had started failing under JDK1.6 after 595047. The particular 
test case that was failing was for Connection.getTypeMap The reason for failure 
was that this method was overridden in a subclass which kicks in only when 
JDBC4.0 is available. The overriden method was not sending the correct 
connection error event as expected by the test and hence the failure. While 
fixing this, I realized that there are several new JDBC4.0 apis that need to 
send the correct events to ConnectionEventListeners. This checkin takes care of 
those apis. More info on what was changed in this commit is as follows.

New JDBC4.0 api, setClientInfo, wraps SQLException inside 
SQLClientInfoException but we were not copying the error code of SQLException 
into SQLClientInfoException. Without the correct error code, we would not send 
connection error event because the severity has to be fatal for us to send 
connection error event. Because of this, I had to change several places where 
SQLException is wrapped inside SQLClientInfoException to pass SQLException's 
error code to SQLClientInfoException. The classes changed because of this are 
EmbedConnection40, BrokeredConnection40, NetConnection40.

For methods that throw SQLClientInfoException, we were not notifying the 
connection error events. I made changes to fix this.

Several of new JDBC4 apis on connection object were not sending error events so 
I changed those methods in BrokeredConnection40 and LogicalConnection40. 

BrokeredConnection40 implements new JDBC4 methods on Connection object but 
these new methods did not follow the same logic as the other existing pre-JDBC4 
methods to check for connection close and that caused the events to be not sent 
correctly. The problematic apis were createBlob, createClob, isWrapperFor, 
unwrap and I fixed those.

Not all the new JDBC4 apis have been implemented (they throw not implemented 
exception) so the tests written for those apis just catch the unimplemented 
exception. These methods include createArrayOf, createNClob, createSQLXML, 
createStruct.

In JDBC4, Connection object has two methods isWrapperFor and unwrap which do 
not go to the server when Derby is being accessed in client server mode and 
because of this, we never detect that the server is down and hence no 
connection error event is thrown in client server mode for these 2 apis. But 
when the same apis are called in embedded Derby after the engine is shutdown, 
we get connection error event. I have added the test for these 2 apis to count 
for the different in behavior but I am not sure if this is the expected 
behavior difference between the 2 configurations of Derby. I will enter a Jira 
entry for this.

And lastly, the new JDBC4 api isValid on Connection object has different 
behavior in client server mode and embedded mode. They both throw exception 
that the connection is down but the connection close and error events are not 
dealt the same way in the 2 configurations. In embedded mode, after the engine 
is shutdown, an isValid call on Connection object raises a connection closed 
event and no connection error event. In client server mode, after the Network 
Server is shutdown, an isValid call on Connection object does not raise any 
event. In both the configurations, we do get a SQLException stating that 
connection is down. Again, I am not sure if this is expected bahavior 
difference between the 2 configurations of Derby. I will enter a Jira entry for 
this too. In addition, as per Connection.isValid api Java specification, a 
SQLException is thrown under following condition which is not being followed in 
embedded and client-server mode
Throws: 
SQLException - if the value supplied for timeout is less then 0
Based on this, I am not sure if our behavior is correct to throw an 
SQLException if the server/engine is down. I will include this information in 
the Jira entry that I will make.

The tests for all these new JDBC4 apis are in jdbc4/DataSourceTest.  

I moved the AssertEventCatcher class implementation from jdbcapi/DataSourceTest 
into a class of it's own. This way, it can be shared by jdbcapi/DataSourceTest 
and jdbc4/DataSourceTest.

      was (Author: mamtas):
    Just committed a change into trunk through 595803 which should take care of 
DataSourceTest failure. The commit comments are as follows

This is a followup checkin to checkin(595050) was committed for DERBY-3172. The 
DataSourceTest had started failing under JDK1.6 after 595050. The particular 
test case that was failing was for Connection.getTypeMap The reason for failure 
was that this method was overridden in a subclass which kicks in only when 
JDBC4.0 is available. The overriden method was not sending the correct 
connection error event as expected by the test and hence the failure. While 
fixing this, I realized that there are several new JDBC4.0 apis that need to 
send the correct events to ConnectionEventListeners. This checkin takes care of 
those apis. More info on what was changed in this commit is as follows.

New JDBC4.0 api, setClientInfo, wraps SQLException inside 
SQLClientInfoException but we were not copying the error code of SQLException 
into SQLClientInfoException. Without the correct error code, we would not send 
connection error event because the severity has to be fatal for us to send 
connection error event. Because of this, I had to change several places where 
SQLException is wrapped inside SQLClientInfoException to pass SQLException's 
error code to SQLClientInfoException. The classes changed because of this are 
EmbedConnection40, BrokeredConnection40, NetConnection40.

For methods that throw SQLClientInfoException, we were not notifying the 
connection error events. I made changes to fix this.

Several of new JDBC4 apis on connection object were not sending error events so 
I changed those methods in BrokeredConnection40 and LogicalConnection40. 

BrokeredConnection40 implements new JDBC4 methods on Connection object but 
these new methods did not follow the same logic as the other existing pre-JDBC4 
methods to check for connection close and that caused the events to be not sent 
correctly. The problematic apis were createBlob, createClob, isWrapperFor, 
unwrap and I fixed those.

Not all the new JDBC4 apis have been implemented (they throw not implemented 
exception) so the tests written for those apis just catch the unimplemented 
exception. These methods include createArrayOf, createNClob, createSQLXML, 
createStruct.

In JDBC4, Connection object has two methods isWrapperFor and unwrap which do 
not go to the server when Derby is being accessed in client server mode and 
because of this, we never detect that the server is down and hence no 
connection error event is thrown in client server mode for these 2 apis. But 
when the same apis are called in embedded Derby after the engine is shutdown, 
we get connection error event. I have added the test for these 2 apis to count 
for the different in behavior but I am not sure if this is the expected 
behavior difference between the 2 configurations of Derby. I will enter a Jira 
entry for this.

And lastly, the new JDBC4 api isValid on Connection object has different 
behavior in client server mode and embedded mode. They both throw exception 
that the connection is down but the connection close and error events are not 
dealt the same way in the 2 configurations. In embedded mode, after the engine 
is shutdown, an isValid call on Connection object raises a connection closed 
event and no connection error event. In client server mode, after the Network 
Server is shutdown, an isValid call on Connection object does not raise any 
event. In both the configurations, we do get a SQLException stating that 
connection is down. Again, I am not sure if this is expected bahavior 
difference between the 2 configurations of Derby. I will enter a Jira entry for 
this too. In addition, as per Connection.isValid api Java specification, a 
SQLException is thrown under following condition which is not being followed in 
embedded and client-server mode
Throws: 
SQLException - if the value supplied for timeout is less then 0
Based on this, I am not sure if our behavior is correct to throw an 
SQLException if the server/engine is down. I will include this information in 
the Jira entry that I will make.

The tests for all these new JDBC4 apis are in jdbc4/DataSourceTest.  

I moved the AssertEventCatcher class implementation from jdbcapi/DataSourceTest 
into a class of it's own. This way, it can be shared by jdbcapi/DataSourceTest 
and jdbc4/DataSourceTest.
  
> ConnectionEventListener.connectionErrorOccurred not being executed when 
> SQLState 08006 Error is thrown
> ------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3172
>                 URL: https://issues.apache.org/jira/browse/DERBY-3172
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.3.1.4
>            Reporter: Stan Bradbury
>            Assignee: Mamta A. Satoor
>         Attachments: DerbyNotification2.java
>
>
> The attached program demonstrates the problem.  Using the 
> ClientConnectionPoolDataSource40 with a connectionEventListener the defined 
> method connectionErrorOccurred is not executed after the Network Server is 
> shutdown and activity is performed on a previously established pooled 
> connection.
> Program also demonstrates that the connectionClosed method is executed when 
> the connection is closed.
> To run the reproduction:
> 1) start network server (listening on default host/port and  
> -noSecurityManager specified)
> 2) run the program
> Output is:
>  > java DerbyNotification2
> 10.3.1.5 - (579866)
> Apache Derby
>  .got connection...check if connectionClosed method is called
> EVENT CALLED: Connection closed happened
>  . . .
>  . . .Get connection and issue test SQL statement
>  . . .AS EXPECTED: no table exists
>  . SHUTDOWN Network server and check if connectionErrorOccurred is called
> now try to use the connection after the NS is STOPPED
> SQLState is: 08006
> Error is: -4499
> Message is: Insufficient data while reading from the network - expected a 
> minimum of 6 bytes and received only -1 bytes.  The connection has been 
> terminated.
> Exception in thread "main" java.sql.SQLNonTransientConnectionException: 
> Insufficient data while reading from the network - expected a minimum of 6 
> bytes and received only -1 bytes.  The connection has
>  been terminated.
>         at 
> org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>         at org.apache.derby.client.am.SqlException.getSQLException(Unknown 
> Source)
>         at org.apache.derby.client.am.Connection.prepareStatement(Unknown 
> Source)
>         at 
> org.apache.derby.client.am.LogicalConnection.prepareStatement(Unknown Source)
>         at DerbyNotification2.runTest(DerbyNotification2.java:64)
>         at DerbyNotification2.main(DerbyNotification2.java:87)
> Caused by: org.apache.derby.client.am.DisconnectException: Insufficient data 
> while reading from the network - expected a minimum of 6 bytes and received 
> only -1 bytes.  The connection has been termina
> ted.
>         at org.apache.derby.client.net.Reply.fill(Unknown Source)
>         at org.apache.derby.client.net.Reply.ensureALayerDataInBuffer(Unknown 
> Source)
>         at org.apache.derby.client.net.Reply.readDssHeader(Unknown Source)
>         at org.apache.derby.client.net.Reply.startSameIdChainParse(Unknown 
> Source)
>         at 
> org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown
>  Source)
>         at 
> org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown 
> Source)
>         at 
> org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown 
> Source)
>         at 
> org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown Source)
>         at 
> org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Unknown
>  Source)
>         at 
> org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(Unknown
>  Source)
>         at org.apache.derby.client.am.PreparedStatement.prepare(Unknown 
> Source)
>         at org.apache.derby.client.am.Connection.prepareStatementX(Unknown 
> Source)
>         ... 4 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to