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