DISPATCH-343 - Fixed a regression affecting multi-frame presettled deliveries.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/b765c1b8 Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/b765c1b8 Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/b765c1b8 Branch: refs/heads/master Commit: b765c1b841f868429113a3678934a97cf604c1c1 Parents: a19ec1e Author: Ted Ross <[email protected]> Authored: Thu Jun 2 07:48:47 2016 -0400 Committer: Ted Ross <[email protected]> Committed: Thu Jun 2 07:50:21 2016 -0400 ---------------------------------------------------------------------- src/router_core/connections.c | 2 +- src/router_node.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b765c1b8/src/router_core/connections.c ---------------------------------------------------------------------- diff --git a/src/router_core/connections.c b/src/router_core/connections.c index 8b2b114..a9612ea 100644 --- a/src/router_core/connections.c +++ b/src/router_core/connections.c @@ -461,8 +461,8 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_li // qdr_delivery_ref_t *ref = DEQ_HEAD(updated_deliveries); while (ref) { - qdr_del_delivery_ref(&updated_deliveries, ref); qdr_delivery_decref(ref->dlv); + qdr_del_delivery_ref(&updated_deliveries, ref); ref = DEQ_HEAD(updated_deliveries); } http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b765c1b8/src/router_node.c ---------------------------------------------------------------------- diff --git a/src/router_node.c b/src/router_node.c index ff5c58f..10794ac 100644 --- a/src/router_node.c +++ b/src/router_node.c @@ -374,9 +374,17 @@ static void AMQP_disposition_handler(void* context, qd_link_t *link, pn_delivery bool give_reference = false; // + // It's important to not do any processing without a qdr_delivery. When pre-settled + // multi-frame deliveries arrive, it's possible for the settlement to register before + // the whole message arrives. Such premature settlement indications must be ignored. + // + if (!delivery) + return; + + // // If the delivery is settled, remove the linkage between the PN and QDR deliveries. // - if (pn_delivery_settled(pnd) && !!delivery) { + if (pn_delivery_settled(pnd)) { pn_delivery_set_context(pnd, 0); qdr_delivery_set_context(delivery, 0); @@ -389,10 +397,9 @@ static void AMQP_disposition_handler(void* context, qd_link_t *link, pn_delivery // // Update the disposition of the delivery // - if (!!delivery) - qdr_delivery_update_disposition(router->router_core, delivery, - pn_delivery_remote_state(pnd), pn_delivery_settled(pnd), - give_reference); + qdr_delivery_update_disposition(router->router_core, delivery, + pn_delivery_remote_state(pnd), pn_delivery_settled(pnd), + give_reference); // // If settled, close out the delivery --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
