From 1e06c64ef8eb15a02e7a3296de66702e23c994c8 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Fri, 10 Nov 2017 11:29:07 -0500 Subject: [PATCH] DISPATCH-872 - Added a counter for dropped-presettleds on links. qdstat now shows this counter --- python/qpid_dispatch/management/qdrouter.json | 5 ++ src/router_core/agent_link.c | 47 +++++++++++-------- src/router_core/agent_link.h | 2 +- src/router_core/forwarder.c | 4 ++ src/router_core/router_core_private.h | 1 + src/router_core/transfer.c | 4 ++ tests/system_tests_one_router.py | 20 ++++++++ tools/qdstat | 4 +- 8 files changed, 65 insertions(+), 22 deletions(-) diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json index 69c7bcec20..51f9b2764e 100644 --- a/python/qpid_dispatch/management/qdrouter.json +++ b/python/qpid_dispatch/management/qdrouter.json @@ -1178,6 +1178,11 @@ "graph": true, "description": "The total number of pre-settled deliveries." }, + "droppedPresettledCount": { + "type": "integer", + "graph": true, + "description": "The total number of pre-settled deliveries that were dropped." + }, "acceptedCount": { "type": "integer", "graph": true, diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c index 692931f96e..fc9981dafa 100644 --- a/src/router_core/agent_link.c +++ b/src/router_core/agent_link.c @@ -21,26 +21,27 @@ #include #include -#define QDR_LINK_NAME 0 -#define QDR_LINK_IDENTITY 1 -#define QDR_LINK_TYPE 2 -#define QDR_LINK_LINK_NAME 3 -#define QDR_LINK_LINK_TYPE 4 -#define QDR_LINK_LINK_DIR 5 -#define QDR_LINK_OWNING_ADDR 6 -#define QDR_LINK_CAPACITY 7 -#define QDR_LINK_PEER 8 -#define QDR_LINK_UNDELIVERED_COUNT 9 -#define QDR_LINK_UNSETTLED_COUNT 10 -#define QDR_LINK_DELIVERY_COUNT 11 -#define QDR_LINK_CONNECTION_ID 12 -#define QDR_LINK_ADMIN_STATE 13 -#define QDR_LINK_OPER_STATE 14 -#define QDR_LINK_PRESETTLED_COUNT 15 -#define QDR_LINK_ACCEPTED_COUNT 16 -#define QDR_LINK_REJECTED_COUNT 17 -#define QDR_LINK_RELEASED_COUNT 18 -#define QDR_LINK_MODIFIED_COUNT 19 +#define QDR_LINK_NAME 0 +#define QDR_LINK_IDENTITY 1 +#define QDR_LINK_TYPE 2 +#define QDR_LINK_LINK_NAME 3 +#define QDR_LINK_LINK_TYPE 4 +#define QDR_LINK_LINK_DIR 5 +#define QDR_LINK_OWNING_ADDR 6 +#define QDR_LINK_CAPACITY 7 +#define QDR_LINK_PEER 8 +#define QDR_LINK_UNDELIVERED_COUNT 9 +#define QDR_LINK_UNSETTLED_COUNT 10 +#define QDR_LINK_DELIVERY_COUNT 11 +#define QDR_LINK_CONNECTION_ID 12 +#define QDR_LINK_ADMIN_STATE 13 +#define QDR_LINK_OPER_STATE 14 +#define QDR_LINK_PRESETTLED_COUNT 15 +#define QDR_LINK_DROPPED_PRESETTLED_COUNT 16 +#define QDR_LINK_ACCEPTED_COUNT 17 +#define QDR_LINK_REJECTED_COUNT 18 +#define QDR_LINK_RELEASED_COUNT 19 +#define QDR_LINK_MODIFIED_COUNT 20 const char *qdr_link_columns[] = {"name", @@ -59,6 +60,7 @@ const char *qdr_link_columns[] = "adminStatus", "operStatus", "presettledCount", + "droppedPresettledCount", "acceptedCount", "rejectedCount", "releasedCount", @@ -185,6 +187,11 @@ static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_li qd_compose_insert_ulong(body, link->presettled_deliveries); break; + case QDR_LINK_DROPPED_PRESETTLED_COUNT: { + qd_compose_insert_ulong(body, link->dropped_presettled_deliveries); + break; + } + case QDR_LINK_ACCEPTED_COUNT: qd_compose_insert_ulong(body, link->accepted_deliveries); break; diff --git a/src/router_core/agent_link.h b/src/router_core/agent_link.h index c372b369fb..44be29d512 100644 --- a/src/router_core/agent_link.h +++ b/src/router_core/agent_link.h @@ -29,7 +29,7 @@ void qdra_link_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body); -#define QDR_LINK_COLUMN_COUNT 20 +#define QDR_LINK_COLUMN_COUNT 21 const char *qdr_link_columns[QDR_LINK_COLUMN_COUNT + 1]; diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c index a07fe15a03..4ea9006a15 100644 --- a/src/router_core/forwarder.c +++ b/src/router_core/forwarder.c @@ -162,6 +162,10 @@ static void qdr_forward_drop_presettled_CT_LH(qdr_core_t *core, qdr_link_t *link dlv->link_work = 0; } qdr_delivery_decref_CT(core, dlv, "qdr_forward_drop_presettled_CT_LH - remove from link-work list"); + + // Increment the presettled_dropped_deliveries on the out_link + link->dropped_presettled_deliveries++; + } dlv = next; } diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h index f5e5618673..ef458a1930 100644 --- a/src/router_core/router_core_private.h +++ b/src/router_core/router_core_private.h @@ -402,6 +402,7 @@ struct qdr_link_t { uint64_t total_deliveries; uint64_t presettled_deliveries; + uint64_t dropped_presettled_deliveries; uint64_t accepted_deliveries; uint64_t rejected_deliveries; uint64_t released_deliveries; diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c index f600545298..7087c17790 100644 --- a/src/router_core/transfer.c +++ b/src/router_core/transfer.c @@ -771,6 +771,10 @@ static void qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery qdr_delivery_release_CT(core, dlv); qdr_link_issue_credit_CT(core, link, 1, false); qdr_delivery_decref_CT(core, dlv, "qdr_link_forward_CT - removed from action (no path)"); + if (dlv->settled) { + // Increment the presettled_dropped_deliveries on the in_link + link->dropped_presettled_deliveries++; + } } else { DEQ_INSERT_TAIL(link->undelivered, dlv); diff --git a/tests/system_tests_one_router.py b/tests/system_tests_one_router.py index f9beed5b4a..a2f5953653 100644 --- a/tests/system_tests_one_router.py +++ b/tests/system_tests_one_router.py @@ -1494,6 +1494,14 @@ def check_if_done(self): self.conn.close() elif self.n_sent == self.n_released: self.error = None + + if not self.error: + local_node = Node.connect(self.address, timeout=TIMEOUT) + for result in local_node.query(type='org.apache.qpid.dispatch.router.link').results: + if result[5] == 'in' and 'multicast.MulticastNoReceiverTest' in result[6]: + if result[16] != 250: + self.error = "Expected 250 dropped presettled deliveries but got " + str(result[16]) + self.timer.cancel() self.conn.close() @@ -1737,6 +1745,8 @@ def run(self): Container(self).run() + + class PresettledOverflowTest(MessagingHandler): def __init__(self, address): super(PresettledOverflowTest, self).__init__(prefetch=0) @@ -1778,6 +1788,16 @@ def on_message(self, event): if self.last_seq == self.count - 1: if self.n_received == self.count: self.error = "No deliveries were dropped" + + if not self.error: + local_node = Node.connect(self.address, timeout=TIMEOUT) + out = local_node.query(type='org.apache.qpid.dispatch.router.link') + + for result in out.results: + if result[5] == 'out' and 'balanced.PresettledOverflow' in result[6]: + if result[16] != 250: + self.error = "Expected 250 dropped presettled deliveries but got " + str(result[16]) + self.conn.close() self.timer.cancel() diff --git a/tools/qdstat b/tools/qdstat index 7b2f5fa6c7..a89afa860f 100755 --- a/tools/qdstat +++ b/tools/qdstat @@ -263,6 +263,7 @@ class BusManager(Node): heads.append(Header("unsett")) heads.append(Header("del")) heads.append(Header("presett")) + heads.append(Header("droppedpresett")) heads.append(Header("acc")) heads.append(Header("rej")) heads.append(Header("rel")) @@ -274,7 +275,7 @@ class BusManager(Node): rows = [] cols = ('linkType', 'linkDir', 'connectionId', 'identity', 'peer', 'owningAddr', 'capacity', 'undeliveredCount', 'unsettledCount', 'deliveryCount', - 'presettledCount', 'acceptedCount', 'rejectedCount', 'releasedCount', + 'presettledCount', 'droppedPresettledCount', 'acceptedCount', 'rejectedCount', 'releasedCount', 'modifiedCount', 'adminStatus', 'operStatus', 'linkName') objects = self.query('org.apache.qpid.dispatch.router.link', cols, limit=self.opts.limit) @@ -294,6 +295,7 @@ class BusManager(Node): row.append(link.unsettledCount) row.append(link.deliveryCount) row.append(link.presettledCount) + row.append(link.droppedPresettledCount) row.append(link.acceptedCount) row.append(link.rejectedCount) row.append(link.releasedCount)