Robbie Gemmell created PROTON-971:
-------------------------------------

             Summary: [proton-j] multi-frame deliveries may be broken when sent 
if buffered along with a futher delivery for the same link
                 Key: PROTON-971
                 URL: https://issues.apache.org/jira/browse/PROTON-971
             Project: Qpid Proton
          Issue Type: Bug
          Components: proton-j
    Affects Versions: 0.10
            Reporter: Robbie Gemmell
            Priority: Critical
             Fix For: 0.11


Proton-j sends at most a single frame for a delivery in each call to 
"processTransportWorkSender(DeliveryImpl delivery, SenderImpl snd)", which 
occurs for each sent delivery on the 'transport work list' in turn during the 
"processTransportWork" call. That call is made twice for each process of the 
transport. As such, at most 2 frames for each delivery can be emitted for each 
process of the transport. However, because all deliveries on the connections 
'transport work list' are processed in turn by "processTransportWork", it is 
possible that interleaved transfer frames for subsequent deliveries on the same 
link will also be emitted if there are other buffered deliveries on the work 
list and the session window and frame writer 'isFUll' checks permit it.

This in itself would already be illegal [1] even if the frames were otherwise 
correct, but the erroenous transfer frames also get marked with the wrong 
delivery-id since that is only incremented by the transport when a delivery has 
been completed, so if it was not all sent yet then the initial/interleaved 
transfer frames for the subsequent delivery are also stamped with the same id. 
Proton-j uses the delivery-id while consitituting received deliveries, and thus 
the mismatch results in interleaving of the payload from the later delivery 
within that for the earlier delivery.

[1] 
http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#doc-idp484080
"However, messages transferred along a single link MUST NOT be interleaved."



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to