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

Dag H. Wanvik commented on DERBY-5158:
--------------------------------------

The problem seems to be the following:

In DRDAConnThread#processCommands we have this code for rollback:

     case CodePoint.RDBCMM:
             try {..}
             catch (SQLException e)
             {
                     writer.clearDSSesBackToMark(writerMark);
                     // Even in case of error, we have to write the ENDUOWRM.
                     writeENDUOWRM(COMMIT);
                     writeSQLCARDs(e, 0);
                     errorInChain(e);
             }

i.e. we send an ENDUOWRM, then the writeSQLCARDs will send a CMDCHKRM (severe 
error), then
the SQLCARD.

However, on the client side, we see this code to handle reply for rollback:

    private void parseRDBRLLBCKreply(ConnectionCallbackInterface connection) 
        throws DisconnectException {
        int peekCP = parseTypdefsOrMgrlvlovrs();
        if (peekCP != CodePoint.ENDUOWRM) {  <---------------- Note!
            parseRollbackError();
            return;
        }

        parseENDUOWRM(connection);
        peekCP = parseTypdefsOrMgrlvlovrs();

        NetSqlca netSqlca = parseSQLCARD(null);
        connection.completeSqlca(netSqlca);
    }

that is, parseRollbackError is only executed iff ENDUOWRM is not
returned. But we just saw that the server side sent a ENDUOWRM even
under an error condition. So, the client will happily
parseENDUOWRM and then expect SQLCARD when there is actually a CMDCHKRM
waiting. hence the code point error. I am not sure which side is
correct here, but maybe you DRDA experts can help out ;-)


> Incomprehensible error message on client if attempting rollback after 
> database has been shut down.
> --------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-5158
>                 URL: https://issues.apache.org/jira/browse/DERBY-5158
>             Project: Derby
>          Issue Type: Bug
>            Reporter: Dag H. Wanvik
>            Priority: Minor
>         Attachments: Derby5158Repro.java
>
>
> Cf the attached repro: when performing the rollback after the database has 
> been shutdown, we see this error:
> There was 1 error:
> 1) 
> testShutdown(org.apache.derbyTesting.functionTests.tests.store.Foo)java.sql.SQLNonTransientConnectionException:
>  Network protocol exception: actual code point, 4,692, does not match 
> expected code point, 9,224.  The connection has been terminated.
>       at 
> org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
>       at 
> org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:358)
>       at org.apache.derby.client.am.Connection.rollback(Connection.java:659)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.rollback(BaseJDBCTestCase.java:387)
>       at 
> org.apache.derbyTesting.functionTests.tests.store.Foo.testShutdown(Foo.java:100)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at 
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:112)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
>       at 
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
> Caused by: org.apache.derby.client.am.DisconnectException: Network protocol 
> exception: actual code point, 4,692, does not match expected code point, 
> 9,224.  The connection has been terminated.
>       at 
> org.apache.derby.client.net.Reply.parseLengthAndMatchCodePoint(Reply.java:1075)
>       at 
> org.apache.derby.client.net.NetConnectionReply.parseSQLCARD(NetConnectionReply.java:2572)
>       at 
> org.apache.derby.client.net.NetConnectionReply.parseRDBRLLBCKreply(NetConnectionReply.java:219)
>       at 
> org.apache.derby.client.net.NetConnectionReply.readLocalRollback(NetConnectionReply.java:141)
>       at 
> org.apache.derby.client.net.ConnectionReply.readLocalRollback(ConnectionReply.java:48)
>       at 
> org.apache.derby.client.net.NetConnection.readLocalRollback_(NetConnection.java:1515)
>       at 
> org.apache.derby.client.am.Connection.readRollback(Connection.java:707)
>       at 
> org.apache.derby.client.am.Connection.flowRollback(Connection.java:690)
>       at org.apache.derby.client.am.Connection.rollback(Connection.java:655)
>       ... 29 more

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to