From 0af196b921412e58a2d16af96b5ee98c4d49b8a9 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Wed, 4 Apr 2018 16:15:31 -0400 Subject: [PATCH 1/3] DISPATCH-952 - Outgoing links initiated by the router will share a single session --- src/container.c | 21 +++++++++++++++++---- src/server_private.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/container.c b/src/container.c index aa5bede107..af5e68b6d6 100644 --- a/src/container.c +++ b/src/container.c @@ -756,8 +756,18 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c sys_mutex_lock(node->container->lock); DEQ_INSERT_TAIL(node->container->links, link); sys_mutex_unlock(node->container->lock); - link->pn_sess = pn_session(qd_connection_pn(conn)); - pn_session_set_incoming_capacity(link->pn_sess, cf->incoming_capacity); + + bool open_session = false; + + if (!conn->pn_sess) { + open_session = true; + conn->pn_sess = pn_session(qd_connection_pn(conn)); + pn_session_set_incoming_capacity(conn->pn_sess, cf->incoming_capacity); + } + + link->pn_sess = conn->pn_sess; + + printf("link->pn_sess=%p\n", (void *)link->pn_sess ); if (dir == QD_OUTGOING) link->pn_link = pn_sender(link->pn_sess, name); @@ -769,11 +779,14 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c link->node = node; link->drain_mode = pn_link_get_drain(link->pn_link); link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(link->pn_link); - link->close_sess_with_link = true; + link->close_sess_with_link = false; pn_link_set_context(link->pn_link, link); - pn_session_open(link->pn_sess); + if (open_session) { + pn_session_open(link->pn_sess); + printf ("Session opened ***********\n"); + } return link; } diff --git a/src/server_private.h b/src/server_private.h index a8fa009e6e..d80a1fa24f 100644 --- a/src/server_private.h +++ b/src/server_private.h @@ -140,6 +140,7 @@ struct qd_connection_t { int enqueued; qd_timer_t *timer; // Timer for initial-setup pn_connection_t *pn_conn; + pn_session_t *pn_sess; pn_ssl_t *ssl; qd_listener_t *listener; qd_connector_t *connector; From 0bd1673386bc3f7c8cdb81921635b325b0b82b2a Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Wed, 4 Apr 2018 16:19:56 -0400 Subject: [PATCH 2/3] DISPATCH-952 - Removed printf statements --- src/container.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/container.c b/src/container.c index af5e68b6d6..9d1b9ebc29 100644 --- a/src/container.c +++ b/src/container.c @@ -767,8 +767,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c link->pn_sess = conn->pn_sess; - printf("link->pn_sess=%p\n", (void *)link->pn_sess ); - if (dir == QD_OUTGOING) link->pn_link = pn_sender(link->pn_sess, name); else @@ -783,10 +781,8 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c pn_link_set_context(link->pn_link, link); - if (open_session) { + if (open_session) pn_session_open(link->pn_sess); - printf ("Session opened ***********\n"); - } return link; } From 9f8239f5cd84004a887d733f28e32b5eac98a99e Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Thu, 5 Apr 2018 11:53:40 -0400 Subject: [PATCH 3/3] DISPATCH-952 - Removed link's close_sess_with_link flag because it is always false --- src/container.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/container.c b/src/container.c index 9d1b9ebc29..27209e9be3 100644 --- a/src/container.c +++ b/src/container.c @@ -59,7 +59,6 @@ struct qd_link_t { void *context; qd_node_t *node; bool drain_mode; - bool close_sess_with_link; pn_snd_settle_mode_t remote_snd_settle_mode; qd_link_ref_list_t ref_list; }; @@ -122,7 +121,6 @@ static void setup_outgoing_link(qd_container_t *container, pn_link_t *pn_link) link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link); link->drain_mode = pn_link_get_drain(pn_link); - link->close_sess_with_link = false; pn_link_set_context(pn_link, link); node->ntype->outgoing_handler(node->context, link); @@ -161,7 +159,6 @@ static void setup_incoming_link(qd_container_t *container, pn_link_t *pn_link) link->node = node; link->drain_mode = pn_link_get_drain(pn_link); link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link); - link->close_sess_with_link = false; pn_link_set_context(pn_link, link); node->ntype->incoming_handler(node->context, link); @@ -510,7 +507,7 @@ void qd_container_handle_event(qd_container_t *container, pn_event_t *event) } if (pn_link_state(pn_link) & PN_LOCAL_CLOSED) { - if (qd_link->close_sess_with_link && sess) + if (sess) pn_session_close(sess); pn_link_set_context(pn_link, NULL); pn_link_free(pn_link); @@ -777,7 +774,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c link->node = node; link->drain_mode = pn_link_get_drain(link->pn_link); link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(link->pn_link); - link->close_sess_with_link = false; pn_link_set_context(link->pn_link, link); @@ -913,7 +909,7 @@ void qd_link_close(qd_link_t *link) if (link->pn_link) pn_link_close(link->pn_link); - if (link->close_sess_with_link && link->pn_sess && + if (link->pn_sess && pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) { pn_session_close(link->pn_sess); } @@ -927,7 +923,7 @@ void qd_link_detach(qd_link_t *link) pn_link_close(link->pn_link); } - if (link->close_sess_with_link && link->pn_sess && + if (link->pn_sess && pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) { pn_session_close(link->pn_sess); }