You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2016/04/27 23:52:21 UTC
qpid-dispatch git commit: DISPATCH-299: If connection is closed by
policy then don't process further events.
Repository: qpid-dispatch
Updated Branches:
refs/heads/master f76466a05 -> 0f5a35936
DISPATCH-299: If connection is closed by policy then don't process further events.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/0f5a3593
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/0f5a3593
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/0f5a3593
Branch: refs/heads/master
Commit: 0f5a359365a5b88d47ca9147143bf0a6df900bdc
Parents: f76466a
Author: Chuck Rolke <cr...@redhat.com>
Authored: Wed Apr 27 17:48:55 2016 -0400
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Wed Apr 27 17:48:55 2016 -0400
----------------------------------------------------------------------
src/container.c | 168 +++++++++++++++++++++++++++------------------------
1 file changed, 88 insertions(+), 80 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0f5a3593/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 9eabed5..83d5a93 100644
--- a/src/container.c
+++ b/src/container.c
@@ -391,110 +391,118 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
break;
case PN_SESSION_REMOTE_OPEN :
- ssn = pn_event_session(event);
- if (pn_session_state(ssn) & PN_LOCAL_UNINIT) {
- if (qd_conn->policy_settings) {
- if (!qd_policy_approve_amqp_session(ssn, qd_conn)) {
- break;
+ if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
+ ssn = pn_event_session(event);
+ if (pn_session_state(ssn) & PN_LOCAL_UNINIT) {
+ if (qd_conn->policy_settings) {
+ if (!qd_policy_approve_amqp_session(ssn, qd_conn)) {
+ break;
+ }
+ qd_conn->n_sessions++;
}
- qd_conn->n_sessions++;
+ qd_policy_apply_session_settings(ssn, qd_conn);
+ pn_session_open(ssn);
}
- qd_policy_apply_session_settings(ssn, qd_conn);
- pn_session_open(ssn);
}
break;
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) {
- if (qd_conn->policy_settings) {
- if (qd_link->direction == QD_OUTGOING) {
- qd_conn->n_receivers--;
- assert(qd_conn->n_receivers >= 0);
- } else {
- qd_conn->n_senders--;
- assert(qd_conn->n_senders >= 0);
+ if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
+ 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) {
+ if (qd_conn->policy_settings) {
+ if (qd_link->direction == QD_OUTGOING) {
+ qd_conn->n_receivers--;
+ assert(qd_conn->n_receivers >= 0);
+ } else {
+ qd_conn->n_senders--;
+ assert(qd_conn->n_senders >= 0);
+ }
}
+ 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, QD_LOST);
}
- 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, QD_LOST);
}
+ pn_link = pn_link_next(pn_link, PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE);
}
- pn_link = pn_link_next(pn_link, PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE);
- }
- if (qd_conn->policy_settings) {
- qd_conn->n_sessions--;
+ if (qd_conn->policy_settings) {
+ qd_conn->n_sessions--;
+ }
+ pn_session_close(ssn);
}
- pn_session_close(ssn);
}
break;
case PN_LINK_REMOTE_OPEN :
- pn_link = pn_event_link(event);
- if (pn_link_state(pn_link) & PN_LOCAL_UNINIT) {
- if (pn_link_is_sender(pn_link)) {
- if (qd_conn->policy_settings) {
- if (!qd_policy_approve_amqp_receiver_link(pn_link, qd_conn)) {
- break;
+ if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
+ pn_link = pn_event_link(event);
+ if (pn_link_state(pn_link) & PN_LOCAL_UNINIT) {
+ if (pn_link_is_sender(pn_link)) {
+ if (qd_conn->policy_settings) {
+ if (!qd_policy_approve_amqp_receiver_link(pn_link, qd_conn)) {
+ break;
+ }
+ qd_conn->n_receivers++;
}
- qd_conn->n_receivers++;
- }
- setup_outgoing_link(container, pn_link);
- } else {
- if (qd_conn->policy_settings) {
- if (!qd_policy_approve_amqp_sender_link(pn_link, qd_conn)) {
- break;
+ setup_outgoing_link(container, pn_link);
+ } else {
+ if (qd_conn->policy_settings) {
+ if (!qd_policy_approve_amqp_sender_link(pn_link, qd_conn)) {
+ break;
+ }
+ qd_conn->n_senders++;
}
- qd_conn->n_senders++;
+ setup_incoming_link(container, pn_link);
}
- setup_incoming_link(container, pn_link);
- }
- } else if (pn_link_state(pn_link) & PN_LOCAL_ACTIVE)
- handle_link_open(container, pn_link);
+ } else if (pn_link_state(pn_link) & PN_LOCAL_ACTIVE)
+ handle_link_open(container, pn_link);
+ }
break;
case PN_LINK_REMOTE_CLOSE :
case PN_LINK_REMOTE_DETACH :
- pn_link = pn_event_link(event);
- qd_link = (qd_link_t*) pn_link_get_context(pn_link);
- if (qd_link) {
- qd_node_t *node = qd_link->node;
- 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);
- else if (qd_link->pn_link == pn_link) {
- pn_link_close(pn_link);
- }
- if (qd_conn->policy_counted && qd_conn->policy_settings) {
- if (pn_link_is_sender(pn_link)) {
- qd_conn->n_receivers--;
- qd_log(container->log_source, QD_LOG_TRACE,
- "Closed receiver link %s. n_receivers: %d",
- pn_link_name(pn_link), qd_conn->n_receivers);
- assert (qd_conn->n_receivers >= 0);
- } else {
- qd_conn->n_senders--;
- qd_log(container->log_source, QD_LOG_TRACE,
- "Closed sender link %s. n_senders: %d",
- pn_link_name(pn_link), qd_conn->n_senders);
- assert (qd_conn->n_senders >= 0);
+ if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
+ pn_link = pn_event_link(event);
+ qd_link = (qd_link_t*) pn_link_get_context(pn_link);
+ if (qd_link) {
+ qd_node_t *node = qd_link->node;
+ 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);
+ else if (qd_link->pn_link == pn_link) {
+ pn_link_close(pn_link);
+ }
+ if (qd_conn->policy_counted && qd_conn->policy_settings) {
+ if (pn_link_is_sender(pn_link)) {
+ qd_conn->n_receivers--;
+ qd_log(container->log_source, QD_LOG_TRACE,
+ "Closed receiver link %s. n_receivers: %d",
+ pn_link_name(pn_link), qd_conn->n_receivers);
+ assert (qd_conn->n_receivers >= 0);
+ } else {
+ qd_conn->n_senders--;
+ qd_log(container->log_source, QD_LOG_TRACE,
+ "Closed sender link %s. n_senders: %d",
+ pn_link_name(pn_link), qd_conn->n_senders);
+ assert (qd_conn->n_senders >= 0);
+ }
}
+ if (qd_link->close_sess_with_link && qd_link->pn_sess &&
+ pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED))
+ pn_session_close(qd_link->pn_sess);
}
- if (qd_link->close_sess_with_link && qd_link->pn_sess &&
- pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED))
- pn_session_close(qd_link->pn_sess);
}
break;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org