You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gm...@apache.org on 2019/03/14 14:46:01 UTC
[qpid-dispatch] branch master updated: DISPATCH-1283 - Zero out
link references on deliveries before they are freed. Moved global and link
related counters update into its own function. This closes #461
This is an automated email from the ASF dual-hosted git repository.
gmurthy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/master by this push:
new f50c708 DISPATCH-1283 - Zero out link references on deliveries before they are freed. Moved global and link related counters update into its own function. This closes #461
f50c708 is described below
commit f50c7088e55b221516f90fcf2086276f748163be
Author: Ganesh Murthy <gm...@redhat.com>
AuthorDate: Thu Mar 14 10:44:28 2019 -0400
DISPATCH-1283 - Zero out link references on deliveries before they are freed. Moved global and link related counters update into its own function. This closes #461
---
src/router_core/connections.c | 18 +++++++++++
src/router_core/router_core_private.h | 5 +++
src/router_core/transfer.c | 57 ++++++++++++++++++++---------------
3 files changed, 55 insertions(+), 25 deletions(-)
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index b078efb..1ac8bcf 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -706,6 +706,12 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
}
//
+ // Updates global and link level delivery counters like presettled_deliveries, accepted_deliveries, released_deliveries etc
+ //
+ qdr_increment_delivery_counters_CT(core, dlv);
+ dlv->link = 0;
+
+ //
// Now the undelivered-list reference
//
qdr_delivery_decref_CT(core, dlv, "qdr_link_cleanup_deliveries_CT - remove from undelivered list");
@@ -744,6 +750,12 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
}
//
+ // Updates global and link level delivery counters like presettled_deliveries, accepted_deliveries, released_deliveries etc
+ //
+ qdr_increment_delivery_counters_CT(core, dlv);
+ dlv->link = 0;
+
+ //
// Now the unsettled-list reference
//
qdr_delivery_decref_CT(core, dlv, "qdr_link_cleanup_deliveries_CT - remove from unsettled list");
@@ -769,6 +781,12 @@ static void qdr_link_cleanup_deliveries_CT(qdr_core_t *core, qdr_connection_t *c
peer = next_peer;
}
+ //
+ // Updates global and link level delivery counters like presettled_deliveries, accepted_deliveries, released_deliveries etc
+ //
+ qdr_increment_delivery_counters_CT(core, dlv);
+ dlv->link = 0;
+
// This decref is for the removing the delivery from the settled list
qdr_delivery_decref_CT(core, dlv, "qdr_link_cleanup_deliveries_CT - remove from settled list");
dlv = DEQ_HEAD(settled);
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 6ddaff1..ba5f790 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -930,6 +930,11 @@ qdr_delivery_t *qdr_delivery_first_peer_CT(qdr_delivery_t *dlv);
qdr_delivery_t *qdr_delivery_next_peer_CT(qdr_delivery_t *dlv);
+/**
+ * Updates global and link level delivery counters like presettled_deliveries, accepted_deliveries, released_deliveries etc.
+*/
+void qdr_increment_delivery_counters_CT(qdr_core_t *core, qdr_delivery_t *delivery);
+
void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query);
void qdr_post_mobile_added_CT(qdr_core_t *core, const char *address_hash, qd_address_treatment_t treatment);
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 2c0fe43..08b6cde 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -414,6 +414,7 @@ void qdr_delivery_decref(qdr_core_t *core, qdr_delivery_t *delivery, const char
//
qdr_action_t *action = qdr_action(qdr_delete_delivery_CT, "delete_delivery");
action->args.delivery.delivery = delivery;
+ action->label = label;
qdr_action_enqueue(core, action);
}
}
@@ -549,32 +550,9 @@ bool qdr_delivery_settled_CT(qdr_core_t *core, qdr_delivery_t *dlv)
return moved;
}
-
-static void qdr_delete_delivery_internal_CT(qdr_core_t *core, qdr_delivery_t *delivery)
+void qdr_increment_delivery_counters_CT(qdr_core_t *core, qdr_delivery_t *delivery)
{
- assert(sys_atomic_get(&delivery->ref_count) == 0);
qdr_link_t *link = delivery->link;
-
- if (delivery->msg || delivery->to_addr) {
- qdr_delivery_cleanup_t *cleanup = new_qdr_delivery_cleanup_t();
-
- DEQ_ITEM_INIT(cleanup);
- cleanup->msg = delivery->msg;
- cleanup->iter = delivery->to_addr;
-
- DEQ_INSERT_TAIL(core->delivery_cleanup_list, cleanup);
- }
-
- if (delivery->tracking_addr) {
- delivery->tracking_addr->outstanding_deliveries[delivery->tracking_addr_bit]--;
- delivery->tracking_addr->tracked_deliveries--;
-
- if (delivery->tracking_addr->tracked_deliveries == 0)
- qdr_check_addr_CT(core, delivery->tracking_addr);
-
- delivery->tracking_addr = 0;
- }
-
if (link) {
if (delivery->presettled) {
link->presettled_deliveries++;
@@ -603,7 +581,36 @@ static void qdr_delete_delivery_internal_CT(qdr_core_t *core, qdr_delivery_t *de
}
if (qd_bitmask_valid_bit_value(delivery->ingress_index) && link->ingress_histogram)
- link->ingress_histogram[delivery->ingress_index]++; }
+ link->ingress_histogram[delivery->ingress_index]++;
+ }
+}
+
+
+static void qdr_delete_delivery_internal_CT(qdr_core_t *core, qdr_delivery_t *delivery)
+{
+ assert(sys_atomic_get(&delivery->ref_count) == 0);
+
+ if (delivery->msg || delivery->to_addr) {
+ qdr_delivery_cleanup_t *cleanup = new_qdr_delivery_cleanup_t();
+
+ DEQ_ITEM_INIT(cleanup);
+ cleanup->msg = delivery->msg;
+ cleanup->iter = delivery->to_addr;
+
+ DEQ_INSERT_TAIL(core->delivery_cleanup_list, cleanup);
+ }
+
+ if (delivery->tracking_addr) {
+ delivery->tracking_addr->outstanding_deliveries[delivery->tracking_addr_bit]--;
+ delivery->tracking_addr->tracked_deliveries--;
+
+ if (delivery->tracking_addr->tracked_deliveries == 0)
+ qdr_check_addr_CT(core, delivery->tracking_addr);
+
+ delivery->tracking_addr = 0;
+ }
+
+ qdr_increment_delivery_counters_CT(core, delivery);
//
// Free all the peer qdr_delivery_ref_t references
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org