You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2016/03/19 00:06:34 UTC
[16/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Fixed
propagation of disposition and settlement across link-routes
DISPATCH-179 - Fixed propagation of disposition and settlement across link-routes
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/9d0a8e65
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/9d0a8e65
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/9d0a8e65
Branch: refs/heads/master
Commit: 9d0a8e65192e4af4f45e7555dfbd3fd26ef3c328
Parents: bb14ecf
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 8 13:40:26 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 8 13:40:26 2016 -0500
----------------------------------------------------------------------
src/container.c | 7 +------
src/router_core/connections.c | 6 +++++-
src/router_core/transfer.c | 6 ++++--
src/router_node.c | 20 ++++++++++++++------
4 files changed, 24 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 482f33b..f6083b3 100644
--- a/src/container.c
+++ b/src/container.c
@@ -432,12 +432,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
qd_detach_type_t dt = pn_event_type(event) == PN_LINK_REMOTE_CLOSE ? QD_CLOSED : QD_DETACHED;
if (node)
node->ntype->link_detach_handler(node->context, qd_link, dt);
-
- //
- // If the qd_link does not reference the pn_link, we have already freed the pn_link.
- // If we attempt to free it again, proton will crash.
- //
- if (qd_link->pn_link == pn_link)
+ else if (qd_link->pn_link == pn_link)
pn_link_close(pn_link);
}
break;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index ab8f6e1..fffa4d3 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -1031,7 +1031,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
qdr_connection_t *conn = action->args.connection.conn;
qdr_link_t *link = action->args.connection.link;
- //qdr_error_t *error = action->args.connection.error;
+ qdr_error_t *error = action->args.connection.error;
qd_detach_type_t dt = action->args.connection.dt;
qdr_address_t *addr = link->owning_addr;
bool was_local = false;
@@ -1039,6 +1039,10 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
//
// TODO - For routed links, propagate the detach
//
+ if (link->connected_link) {
+ qdr_link_outbound_detach_CT(core, link->connected_link, error, QDR_CONDITION_NONE);
+ return;
+ }
link->owning_addr = 0;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 9484489..b05f15a 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -431,6 +431,8 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
uint64_t disp = action->args.delivery.disposition;
bool settled = action->args.delivery.settled;
+ bool link_routed = dlv && dlv->link && dlv->link->connected_link;
+
//
// Logic:
//
@@ -457,7 +459,7 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
push = true;
peer->peer = 0;
dlv->peer = 0;
- if (peer->link) {
+ if (peer->link && !link_routed) {
sys_mutex_lock(peer->link->conn->work_lock);
DEQ_REMOVE(peer->link->unsettled, peer);
sys_mutex_unlock(peer->link->conn->work_lock);
@@ -466,7 +468,7 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
}
}
- if (dlv->link) {
+ if (dlv->link && !link_routed) {
sys_mutex_lock(dlv->link->conn->work_lock);
DEQ_REMOVE(dlv->link->unsettled, dlv);
sys_mutex_unlock(dlv->link->conn->work_lock);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 27b54c0..100e204 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -187,10 +187,11 @@ static qd_field_iterator_t *router_annotate_message(qd_router_t *router,
*/
static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd)
{
- qd_router_t *router = (qd_router_t*) context;
- pn_link_t *pn_link = qd_link_pn(link);
- qdr_link_t *rlink = (qdr_link_t*) qd_link_get_context(link);
- qd_message_t *msg;
+ qd_router_t *router = (qd_router_t*) context;
+ pn_link_t *pn_link = qd_link_pn(link);
+ qdr_link_t *rlink = (qdr_link_t*) qd_link_get_context(link);
+ qdr_delivery_t *delivery = 0;
+ qd_message_t *msg;
//
// Receive the message into a local representation. If the returned message
@@ -222,7 +223,15 @@ static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd
// Handle the link-routed case
//
if (qdr_link_is_routed(rlink)) {
- qdr_link_deliver_to_routed_link(rlink, msg, pn_delivery_settled(pnd));
+ delivery = qdr_link_deliver_to_routed_link(rlink, msg, pn_delivery_settled(pnd));
+ if (delivery) {
+ if (pn_delivery_settled(pnd))
+ pn_delivery_settle(pnd);
+ else {
+ pn_delivery_set_context(pnd, delivery);
+ qdr_delivery_set_context(delivery, pnd);
+ }
+ }
return;
}
@@ -242,7 +251,6 @@ static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd
//
qd_message_depth_t validation_depth = anonymous_link ? QD_DEPTH_PROPERTIES : QD_DEPTH_MESSAGE_ANNOTATIONS;
bool valid_message = qd_message_check(msg, validation_depth);
- qdr_delivery_t *delivery = 0;
if (valid_message) {
qd_parsed_field_t *in_ma = qd_message_message_annotations(msg);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org