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 2015/02/09 21:54:52 UTC
svn commit: r1658572 - /qpid/dispatch/trunk/src/router_node.c
Author: tross
Date: Mon Feb 9 20:54:52 2015
New Revision: 1658572
URL: http://svn.apache.org/r1658572
Log:
DISPATCH-6 - Propagate the error condition across routed links during detach.
Modified:
qpid/dispatch/trunk/src/router_node.c
Modified: qpid/dispatch/trunk/src/router_node.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_node.c?rev=1658572&r1=1658571&r2=1658572&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_node.c (original)
+++ qpid/dispatch/trunk/src/router_node.c Mon Feb 9 20:54:52 2015
@@ -1063,6 +1063,21 @@ ALLOC_DECLARE(link_attach_t);
ALLOC_DEFINE(link_attach_t);
+#define COND_NAME_LEN 127
+#define COND_DESCRIPTION_LEN 511
+
+typedef struct link_detach_t {
+ qd_router_t *router;
+ qd_router_link_t *rlink;
+ char condition_name[COND_NAME_LEN + 1];
+ char condition_description[COND_DESCRIPTION_LEN + 1];
+ pn_data_t *condition_info;
+} link_detach_t;
+
+ALLOC_DECLARE(link_detach_t);
+ALLOC_DEFINE(link_detach_t);
+
+
typedef struct link_event_t {
qd_router_t *router;
qd_router_link_t *rlink;
@@ -1123,19 +1138,30 @@ static void qd_router_attach_routed_link
static void qd_router_detach_routed_link(void *context, bool discard)
{
- link_event_t *le = (link_event_t*) context;
+ link_detach_t *ld = (link_detach_t*) context;
if (!discard) {
- qd_link_t *link = le->rlink->link;
+ qd_link_t *link = ld->rlink->link;
+
+ if (ld->condition_name[0]) {
+ pn_condition_t *cond = pn_link_condition(qd_link_pn(link));
+ pn_condition_set_name(cond, ld->condition_name);
+ pn_condition_set_description(cond, ld->condition_description);
+ if (ld->condition_info)
+ pn_data_copy(pn_condition_info(cond), ld->condition_info);
+ }
+
qd_link_close(link);
- sys_mutex_lock(le->router->lock);
- qd_entity_cache_remove(QD_ROUTER_LINK_TYPE, le->rlink);
- DEQ_REMOVE(le->router->links, le->rlink);
- sys_mutex_unlock(le->router->lock);
+ sys_mutex_lock(ld->router->lock);
+ qd_entity_cache_remove(QD_ROUTER_LINK_TYPE, ld->rlink);
+ DEQ_REMOVE(ld->router->links, ld->rlink);
+ sys_mutex_unlock(ld->router->lock);
}
- free_link_event_t(le);
+ if (ld->condition_info)
+ pn_data_free(ld->condition_info);
+ free_link_detach_t(ld);
}
@@ -1520,6 +1546,7 @@ static int router_link_attach_handler(vo
qd_connection_t *out_conn = qd_link_connection(peer_rlink->link);
if (out_conn) {
link_event_t *le = new_link_event_t();
+ memset(le, 0, sizeof(link_event_t));
le->router = router;
le->rlink = peer_rlink;
qd_connection_invoke_deferred(out_conn, qd_router_open_routed_link, le);
@@ -1553,6 +1580,7 @@ static int router_link_flow_handler(void
int credit = pn_link_remote_credit(pn_link) - DEQ_SIZE(rlink->msg_fifo);
if (credit > 0) {
link_event_t *le = new_link_event_t();
+ memset(le, 0, sizeof(link_event_t));
le->router = router;
le->rlink = peer_rlink;
le->credit = credit;
@@ -1591,11 +1619,27 @@ static int router_link_detach_handler(vo
if (rlink->connected_link) {
qd_connection_t *out_conn = qd_link_connection(rlink->connected_link->link);
if (out_conn) {
- link_event_t *le = new_link_event_t();
- le->router = router;
- le->rlink = rlink->connected_link;
+ link_detach_t *ld = new_link_detach_t();
+ memset(ld, 0, sizeof(link_detach_t));
+ ld->router = router;
+ ld->rlink = rlink->connected_link;
+ pn_condition_t *cond = pn_link_remote_condition(qd_link_pn(link));
+ if (pn_condition_is_set(cond)) {
+ if (pn_condition_get_name(cond)) {
+ strncpy(ld->condition_name, pn_condition_get_name(cond), COND_NAME_LEN);
+ ld->condition_name[COND_NAME_LEN] = '\0';
+ }
+ if (pn_condition_get_description(cond)) {
+ strncpy(ld->condition_description, pn_condition_get_description(cond), COND_DESCRIPTION_LEN);
+ ld->condition_description[COND_DESCRIPTION_LEN] = '\0';
+ }
+ if (pn_condition_info(cond)) {
+ ld->condition_info = pn_data(0);
+ pn_data_copy(ld->condition_info, pn_condition_info(cond));
+ }
+ }
rlink->connected_link->connected_link = 0;
- qd_connection_invoke_deferred(out_conn, qd_router_detach_routed_link, le);
+ qd_connection_invoke_deferred(out_conn, qd_router_detach_routed_link, ld);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org