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

Kristian Waagan commented on DERBY-2017:
----------------------------------------

Description of patch 3a:

* iapi/reference/DRDAConstants
Constants for the various error conditions. There are currently four different 
conditions: OK, READ_ERROR, TOO_SHORT and TOO_LONG.
Two would be enough, but having more may help debugging / tracing (from the 
server side) and it doesn't add much complexity / overhead.

* drda/StandardEXTDTAReaderInputStream
Extended the stream reading "normal" EXTDTA to handle the Derby-specific status 
byte.
See comment under drda/EXTDTAReaderInputStream.

* drda/LayerBStreamedEXTDTAReaderInputStream
Extended the stream reading layer B streamed EXTDTA to handle the 
Derby-specific status byte.
Slightly more complex than the normal case, as we don't know up front when we 
read the last data byte.
First I tried to make the stream check the status when it read the last byte, 
but the code got too complex due to buffer boundary issues (i.e. I had to deal 
with a "carry-over" byte etc). The stream now requires that it is properly 
drained to guarantee that the status byte is read (i.e. read in a loop until 
you get -1). This is the normal operational mode, so it shouldn't cause 
problems.
To my knowledge this stream is always passed directly into the embedded driver, 
which means it should thrown an exception instead of saving the status byte.

* drda/EXTDTAReaderInputStream
Extended the class to deal with the Derby-specific status byte.
Contains the logic determining if something went wrong when reading the stream 
on the client side. If so, either an exception is thrown or the status if saved 
for later inspection.
Seems I removed some required functionality here, as I think we have to be able 
to explicitly tell if an error condition should cause an exception to be thrown 
or not. The reason is that sometimes Derby reads the value off the network 
before executing the statement. I want the statement itself to fail, as this 
simplifies the clean-up and error handling.

* drda/FailingEXTDTAInputStream
Dummy stream that will throw an exception as soon as a read request is made.

* drda/AppRequester
Added method that tells if the client supports EXTDTA aborts or not.

* drda/DRDAConnThread
Fixed some suboptimal logic in convertAsByteArrayInputStream, where the buffer 
size could be set to poorly chosen values (very small or too large).
In the case of normal EXTDTAs, added logic to pass in a stream that will fail 
instead of the stream containing padded or truncated data.

* drda/DDMReader
Modified the code creating the streams reading data off the wire to tell 
whether a Derby-specific status byte is expected or not.

* tests/jdbc4/PreparedStatementTest
Removed special code that was added due to DERBY-2017.

* client/net/NetDatabaseMetaData
Added code to tell if the server supports EXTDTA aborts.

* client/net/NetConnection
Added method calling code added in NetDatabaseMetaData.

* client/net/Request
The changes required to send the status byte (both for layer A and layer B 
streaming).
Note that I suspect that the method writeEncryptedScalarStream is dead code. 
There are several major problems with it, suggesting that it isn't used. I may 
remove this code in a later patch, added a comment for now.


I'll add some more JavaDoc for some of the existing methods in Request, add 
some tests for binary data (as opposed to character data) and verify that all 
code paths in DRDAConnThread.readAndSetExtParam are covered.

> Client driver can insert and commit partial data when a LOB stream throws 
> IOException or does not match the specified length
> ----------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-2017
>                 URL: https://issues.apache.org/jira/browse/DERBY-2017
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC, Network Client
>    Affects Versions: 10.2.1.6
>            Reporter: Knut Anders Hatlen
>            Assignee: Kristian Waagan
>         Attachments: derby-2017-2a-regression_test.diff, 
> derby-2017-2b-regression-test.diff, derby-2017-3a-fix.diff, 
> derby-2017-3a-fix.stat, derby-2017-stream_status_preview.diff, 
> derby2017_try1.diff, Derby_2017_v1.diff, Derby_2017_v1.stat, 
> StreamErrRepro.java
>
>
> When a LOB stream throws an exception or does not match the specified length, 
> the client driver does not raise an exception until it has finished executing 
> the statement. Therefore, the statement will be executed (and possibly 
> committed) on the server even though the client reports that the statement 
> failed.

-- 
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