Author: kgiusti
Date: Thu Jan 29 19:08:44 2015
New Revision: 1655804
URL: http://svn.apache.org/r1655804
Log:
DISPATCH-107: force link detach on premature session end
Modified:
qpid/dispatch/trunk/src/container.c
Modified: qpid/dispatch/trunk/src/container.c
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/container.c?rev=1655804&r1=1655803&r2=1655804&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/container.c (original)
+++ qpid/dispatch/trunk/src/container.c Thu Jan 29 19:08:44 2015
@@ -328,6 +328,27 @@ static int process_handler(qd_container_
case PN_SESSION_REMOTE_CLOSE :
ssn = pn_event_session(event);
if (pn_session_state(ssn) == (PN_LOCAL_ACTIVE | PN_REMOTE_CLOSED))
{
+ // remote has nuked our session. Check for any links that were
+ // left open and forcibly detach them, since no detaches will
+ // arrive on this session.
+ pn_connection_t *conn = pn_session_connection(ssn);
+ pn_link_t *pn_link = pn_link_head(conn, PN_LOCAL_ACTIVE |
PN_REMOTE_ACTIVE);
+ while (pn_link) {
+ if (pn_link_session(pn_link) == ssn) {
+ qd_link_t *qd_link = (qd_link_t
*)pn_link_get_context(pn_link);
+ if (qd_link && qd_link->node) {
+ qd_log(container->log_source, QD_LOG_NOTICE,
+ "Aborting link '%s' due to parent session
end",
+ pn_link_name(pn_link));
+
qd_link->node->ntype->link_detach_handler(qd_link->node->context,
+ qd_link,
1); // assume
+
// closed?
+ pn_link_close(pn_link);
+ pn_link_free(pn_link);
+ }
+ }
+ pn_link = pn_link_next(pn_link, PN_LOCAL_ACTIVE |
PN_REMOTE_ACTIVE);
+ }
pn_session_close(ssn);
pn_session_free(ssn);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]