db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] Updated: (DERBY-4315) Attempt to reuse streams in client on insert gives protocol exception and inserts wrong data
Date Fri, 19 Nov 2010 17:25:25 GMT

     [ https://issues.apache.org/jira/browse/DERBY-4315?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Rick Hillegas updated DERBY-4315:
---------------------------------

    Attachment: StreamError.java

Attaching StreamError.java. This class shows another error related to the exception processing
in this part of our network driver.

The attached StreamError class raises an ArrayIndexOutOfBoundsException half way through reading
the input stream. All sorts of Exceptions could be raised by a user-written InputStream. But
the network client only looks for IOExceptions. If the network client sees an IOException,
then you get the behavior described by this bug report: the user sees a puzzling protocol
error when there is no real protocol error. The error is in the InputStream which is running
purely on the client-side. If the InputStream raises an exeption other than an IOException,
then a protocol error does not return to the user. Instead, the error raised by the stream
percolates up to higher levels of exception management in the client driver. However, in that
case a real protocol error follows and you see two consequences:

1) In the server log you see the following protocol error:

org.apache.derby.impl.drda.DRDAProtocolException: Execution failed because of a Distributed
Protocol Error:  DRDA_Disconnect; CODPNT arg  = 0; Error Code Value = 0,DDMReader.fill(),InputStream.read(),insufficient
data,*
	at org.apache.derby.impl.drda.DRDAProtocolException.newDisconnectException(DRDAProtocolException.java:325)
	at org.apache.derby.impl.drda.DRDAConnThread.markCommunicationsFailure(DRDAConnThread.java:503)
	at org.apache.derby.impl.drda.DRDAConnThread.markCommunicationsFailure(DRDAConnThread.java:472)
	at org.apache.derby.impl.drda.DDMReader.fill(DDMReader.java:1965)
	at org.apache.derby.impl.drda.DDMReader.ensureALayerDataInBuffer(DDMReader.java:1684)
	at org.apache.derby.impl.drda.DDMReader.readDSSContinuationHeader(DDMReader.java:1225)
	at org.apache.derby.impl.drda.DDMReader.readLOBChunk(DDMReader.java:1122)
	at org.apache.derby.impl.drda.DDMReader.readLOBContinuationStream(DDMReader.java:1099)
	at org.apache.derby.impl.drda.StandardEXTDTAReaderInputStream.nextBuffer(StandardEXTDTAReaderInputStream.java:183)
	at org.apache.derby.impl.drda.StandardEXTDTAReaderInputStream.read(StandardEXTDTAReaderInputStream.java:116)
	at java.io.FilterInputStream.read(FilterInputStream.java:116)
	at org.apache.derby.iapi.services.io.LimitInputStream.read(LimitInputStream.java:74)
	at org.apache.derby.iapi.types.RawToBinaryFormatStream.read(RawToBinaryFormatStream.java:273)
	at org.apache.derby.impl.store.raw.data.MemByteHolder.write(MemByteHolder.java:146)
	at org.apache.derby.impl.store.raw.data.RememberBytesInputStream.fillBuf(RememberBytesInputStream.java:135)
	at org.apache.derby.impl.store.raw.data.StoredPage.logColumn(StoredPage.java:6197)
	at org.apache.derby.impl.store.raw.data.StoredPage.logLongColumn(StoredPage.java:6044)
	at org.apache.derby.impl.store.raw.data.InsertOperation.writeOptionalDataToBuffer(InsertOperation.java:367)
	at org.apache.derby.impl.store.raw.data.InsertOperation.<init>(InsertOperation.java:115)
	at org.apache.derby.impl.store.raw.data.LoggableActions.actionInsert(LoggableActions.java:139)
	at org.apache.derby.impl.store.raw.data.BasePage.insertLongColumn(BasePage.java:938)
	at org.apache.derby.impl.store.raw.data.BasePage.insertAllowOverflow(BasePage.java:763)
	at org.apache.derby.impl.store.raw.data.BasePage.insert(BasePage.java:632)
	at org.apache.derby.impl.store.access.heap.HeapController.doInsert(HeapController.java:307)
	at org.apache.derby.impl.store.access.heap.HeapController.insert(HeapController.java:575)
	at org.apache.derby.impl.sql.execute.RowChangerImpl.insertRow(RowChangerImpl.java:457)
	at org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(InsertResultSet.java:1028)
	at org.apache.derby.impl.sql.execute.InsertResultSet.open(InsertResultSet.java:505)
	at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:436)
	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:317)
	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1241)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1686)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(EmbedPreparedStatement.java:1341)
	at org.apache.derby.impl.drda.DRDAStatement.execute(DRDAStatement.java:672)
	at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTTobjects(DRDAConnThread.java:4316)
	at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(DRDAConnThread.java:4133)
	at org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:1021)
	at org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:294)

2) After that, an attempt to shutdown the server results in the following error on the client
(the next attempt to shutdown the server succeeds, however):

Fri Nov 19 09:00:38 PST 2010 : Invalid reply header from network server: Invalid string 

> Attempt to reuse streams in client on insert gives protocol exception and inserts wrong
data
> --------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4315
>                 URL: https://issues.apache.org/jira/browse/DERBY-4315
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.1.3.1, 10.2.2.0, 10.3.3.0, 10.4.2.0, 10.5.1.1, 10.5.2.0, 10.6.1.0
>            Reporter: Kathey Marsden
>         Attachments: ReproReuseStream.java, ReproReuseStream.java, StreamError.java
>
>
> If a user attempts to reuse a stream set as a parameter to a prepared statement, the
statement execution should fail with SQL State XJ001.  Instead client fails with a protocol
error and inserts wrong data. See the attached java program ReproReuseStream.java for a reproduction.
> [C:/kmarsden/repro/reusestream] java ReproReuseStream
> Insert row 1
> Try to insert row 2 with reused streams
> java.sql.SQLException: Network protocol error: end of stream prematurely reached, parameter
#4.  Remaining data has been
>  padded with 0x0.
>         at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:96)
>         at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:358)
>         at org.apache.derby.client.am.PreparedStatement.executeUpdate(PreparedStatement.java:399)
>         at ReproReuseStream.main(ReproReuseStream.java:41)
> Caused by: org.apache.derby.client.am.SqlException: Network protocol error: end of stream
prematurely reached, parameter
>  #4.  Remaining data has been padded with 0x0.
>         at org.apache.derby.client.net.Request.writePlainScalarStream(Request.java:490)
>         at org.apache.derby.client.net.Request.writeScalarStream(Request.java:264)
>         at org.apache.derby.client.net.NetStatementRequest.buildEXTDTA(NetStatementRequest.java:951)
>         at org.apache.derby.client.net.NetStatementRequest.writeExecute(NetStatementRequest.java:147)
>         at org.apache.derby.client.net.NetPreparedStatement.writeExecute_(NetPreparedStatement.java:178)
>         at org.apache.derby.client.am.PreparedStatement.writeExecute(PreparedStatement.java:1801)
>         at org.apache.derby.client.am.PreparedStatement.flowExecute(PreparedStatement.java:2031)
>         at org.apache.derby.client.am.PreparedStatement.executeUpdateX(PreparedStatement.java:404)
>         at org.apache.derby.client.am.PreparedStatement.executeUpdate(PreparedStatement.java:390)
>         ... 1 more
> Go ahead and commit so we can see the wrong data.
> ID         |MNAME
>                     |MVALUE     |BYTEDATA
>                                          |CHARDATA
> ------------------------------------------------------------------------------------------------------------------------
> ------------------------------------------------------------------------------------------------------------------------
> ------------------------------------------------------------------------------------------------------------------------
> --------------------------------------------------
> 1          |mname
>                     |0          |636363636363636363636363636363636363636363636363636363636363636363636363636363636363636
> 3636363636363636363636363636363636363636&|cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
> ccccccccccccccccccccccccccccccccccccccccccccccccc&
> 2          |mname
>                     |0          |000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
> 0000000000000000000000000000000000000000&|
>                                                  &
> To workaround the issue users should not attempt to reuse streams but we should give
a better message and not insert wrong data.
> The code was extracted from StreamingColumnTest testDerby500 but the commits were removed.

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


Mime
View raw message