You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2018/02/27 22:15:44 UTC

qpid-dispatch git commit: DISPATCH-911 - (from Ganesh Murthy) Add global delivery counts This closes #254

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 257321d0f -> b6805c0ce


DISPATCH-911 - (from Ganesh Murthy) Add global delivery counts
This closes #254


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/b6805c0c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/b6805c0c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/b6805c0c

Branch: refs/heads/master
Commit: b6805c0ce324b15dcd29937978cbb303c08c5394
Parents: 257321d
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Feb 27 17:07:49 2018 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Feb 27 17:09:58 2018 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h           |  2 +
 python/qpid_dispatch/management/qdrouter.json | 67 ++++++++++++++++++++-
 src/router_core/agent_address.c               | 46 +++++++++------
 src/router_core/agent_address.h               |  2 +-
 src/router_core/agent_router.c                | 68 ++++++++++++++++++++++
 src/router_core/agent_router.h                |  2 +-
 src/router_core/connections.c                 |  5 ++
 src/router_core/forwarder.c                   | 28 +++++++--
 src/router_core/router_core_private.h         | 19 ++++++
 src/router_core/transfer.c                    | 37 ++++++++++--
 src/router_node.c                             |  1 -
 tests/system_tests_autolinks.py               | 51 +++++++++++++++-
 tests/system_tests_default_distribution.py    | 12 ++--
 tests/system_tests_one_router.py              | 52 +++++++++++++++--
 tests/system_tests_qdstat.py                  | 12 ++--
 tests/system_tests_two_routers.py             | 16 ++++-
 tools/qdstat                                  | 13 +++++
 17 files changed, 380 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 18dbc34..63e3f46 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -187,6 +187,8 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
  */
 void qdr_connection_closed(qdr_connection_t *conn);
 
+bool qdr_connection_route_container(qdr_connection_t *conn);
+
 /**
  * qdr_connection_set_context
  *

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index ebe5291..4da4ccf 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -462,18 +462,71 @@
                     "graph": true
                 },
 
+                "presettledDeliveries": {
+                    "type": "integer",
+                    "description":"Number of presettled deliveries handled by the router.",
+                    "graph": true
+                },
+                "droppedPresettledDeliveries": {
+                    "type": "integer",
+                    "description":"Number of presettled deliveries that were dropped by the router.",
+                    "graph": true
+                },
+                "acceptedDeliveries": {
+                    "type": "integer",
+                    "description":"Number of deliveries whose delivery state was set to ACCEPTED by the router. These deliveries were successfully processed by the router.",
+                    "graph": true
+                },
+                "rejectedDeliveries": {
+                    "type": "integer",
+                    "description":"Number of deliveries whose delivery state was set to REJECTED by the router. These deliveries were Invalid and unprocessable.",
+                    "graph": true
+                },
+                "releasedDeliveries": {
+                    "type": "integer",
+                    "description":"Number of deliveries whose delivery state was set to RELEASED by the router. These deliveries was not (and will not be) processed",
+                    "graph": true
+                },
+                "modifiedDeliveries": {
+                    "type": "integer",
+                    "description":"Number of deliveries whose delivery state was set to MODIFIED by the router. These deliveries were modified but not processed.",
+                    "graph": true
+                },
+                "deliveriesIngress": {
+                    "type": "integer",
+                    "description":"Number of deliveries that were sent to it by a sender that is directly attached to the router.",
+                    "graph": true
+                },
+                "deliveriesEgress": {
+                    "type": "integer",
+                    "description":"Number of deliveries that were sent by the router to a receiver that is directly attached to the router.",
+                    "graph": true
+                },
+                "deliveriesTransit": {
+                    "type": "integer",
+                    "description":"Number of deliveries that were sent to another router in the network.",
+                    "graph": true
+                },                
+                "deliveriesIngressRouteContainer": {
+                    "type": "integer",
+                    "description":"Number of deliveries that were received from router container connections.",
+                    "graph": true
+                },                
+                "deliveriesEgressRouteContainer": {
+                    "type": "integer",
+                    "description":"Number of deliveries that were sent to route container connections.",
+                    "graph": true
+                },                
                 "workerThreads": {
                     "type": "integer",
                     "default": 4,
                     "description": "The number of threads that will be created to process message traffic and other application work (timers, non-amqp file descriptors, etc.) .",
                     "create": true
-
                 },
                 "debugDump": {
                     "type": "path",
                     "description": "A file to dump debugging information that can't be logged normally.",
                     "create": true
-
                 },
                 "saslConfigPath": {
                     "type": "path",
@@ -1265,6 +1318,16 @@
                     "description": "The number of deliveries to this address that were originated from an in-process entity",
                     "graph": true
                 },
+                "deliveriesIngressRouteContainer": {
+                    "type": "integer",
+                    "description": "Number of deliveries that were received from a route-container address.",
+                    "graph": true
+                },
+                "deliveriesEgressRouteContainer": {
+                    "type": "integer",
+                    "description": "Number of deliveries that were sent to a route-container address.",
+                    "graph": true
+                },
                 "key": {
                     "description": "Internal unique (to this router) key to identify the address",
                     "type": "string"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index 72fb310..c9f2dde 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -20,23 +20,25 @@
 #include "agent_address.h"
 #include "router_core_private.h"
 
-#define QDR_ADDRESS_NAME                      0
-#define QDR_ADDRESS_IDENTITY                  1
-#define QDR_ADDRESS_TYPE                      2
-#define QDR_ADDRESS_KEY                       3
-#define QDR_ADDRESS_DISTRIBUTION              4
-#define QDR_ADDRESS_IN_PROCESS                5
-#define QDR_ADDRESS_SUBSCRIBER_COUNT          6
-#define QDR_ADDRESS_REMOTE_COUNT              7
-#define QDR_ADDRESS_CONTAINER_COUNT           8
-#define QDR_ADDRESS_REMOTE_HOST_ROUTERS       9
-#define QDR_ADDRESS_DELIVERIES_INGRESS        10
-#define QDR_ADDRESS_DELIVERIES_EGRESS         11
-#define QDR_ADDRESS_DELIVERIES_TRANSIT        12
-#define QDR_ADDRESS_DELIVERIES_TO_CONTAINER   13
-#define QDR_ADDRESS_DELIVERIES_FROM_CONTAINER 14
-#define QDR_ADDRESS_TRANSIT_OUTSTANDING       15
-#define QDR_ADDRESS_TRACKED_DELIVERIES        16
+#define QDR_ADDRESS_NAME                                0
+#define QDR_ADDRESS_IDENTITY                            1
+#define QDR_ADDRESS_TYPE                                2
+#define QDR_ADDRESS_KEY                                 3
+#define QDR_ADDRESS_DISTRIBUTION                        4
+#define QDR_ADDRESS_IN_PROCESS                          5
+#define QDR_ADDRESS_SUBSCRIBER_COUNT                    6
+#define QDR_ADDRESS_REMOTE_COUNT                        7
+#define QDR_ADDRESS_CONTAINER_COUNT                     8
+#define QDR_ADDRESS_REMOTE_HOST_ROUTERS                 9
+#define QDR_ADDRESS_DELIVERIES_INGRESS                 10
+#define QDR_ADDRESS_DELIVERIES_EGRESS                  11
+#define QDR_ADDRESS_DELIVERIES_TRANSIT                 12
+#define QDR_ADDRESS_DELIVERIES_TO_CONTAINER            13
+#define QDR_ADDRESS_DELIVERIES_FROM_CONTAINER          14
+#define QDR_ADDRESS_DELIVERIES_EGRESS_ROUTE_CONTAINER  15
+#define QDR_ADDRESS_DELIVERIES_INGRESS_ROUTE_CONTAINER 16
+#define QDR_ADDRESS_TRANSIT_OUTSTANDING                17
+#define QDR_ADDRESS_TRACKED_DELIVERIES                 18
 
 const char *qdr_address_columns[] =
     {"name",
@@ -54,6 +56,8 @@ const char *qdr_address_columns[] =
      "deliveriesTransit",
      "deliveriesToContainer",
      "deliveriesFromContainer",
+     "deliveriesEgressRouteContainer",
+     "deliveriesIngressRouteContainer",
      "transitOutstanding",
      "trackedDeliveries",
      0};
@@ -141,6 +145,14 @@ static void qdr_insert_address_columns_CT(qdr_core_t          *core,
         qd_compose_insert_ulong(body, addr->deliveries_from_container);
         break;
 
+    case QDR_ADDRESS_DELIVERIES_EGRESS_ROUTE_CONTAINER:
+        qd_compose_insert_ulong(body, addr->deliveries_egress_route_container);
+        break;
+
+    case QDR_ADDRESS_DELIVERIES_INGRESS_ROUTE_CONTAINER:
+        qd_compose_insert_ulong(body, addr->deliveries_ingress_route_container);
+        break;
+
     case QDR_ADDRESS_TRANSIT_OUTSTANDING:
         if (addr->outstanding_deliveries) {
             qd_compose_start_list(body);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/agent_address.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.h b/src/router_core/agent_address.h
index d9bde2c..b326837 100644
--- a/src/router_core/agent_address.h
+++ b/src/router_core/agent_address.h
@@ -31,7 +31,7 @@ void qdra_address_get_CT(qdr_core_t *core,
                       const char *qdr_address_columns[]);
 
 
-#define QDR_ADDRESS_COLUMN_COUNT 17
+#define QDR_ADDRESS_COLUMN_COUNT 19
 
 const char *qdr_address_columns[QDR_ADDRESS_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/agent_router.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_router.c b/src/router_core/agent_router.c
index b1e069a..6577bbf 100644
--- a/src/router_core/agent_router.c
+++ b/src/router_core/agent_router.c
@@ -45,6 +45,19 @@
 #define QDR_ROUTER_SASL_CONFIG_NAME       20
 #define QDR_ROUTER_CONNECTION_COUNT       21
 
+#define QDR_ROUTER_PRESETTLED_DELIVERIES              22
+#define QDR_ROUTER_DROPPED_PRESETTLED_DELIVERIES      23
+#define QDR_ROUTER_ACCEPTED_DELIVERIES                24
+#define QDR_ROUTER_REJECTED_DELIVERIES                25
+#define QDR_ROUTER_RELEASED_DELIVERIES                26
+#define QDR_ROUTER_MODIFIED_DELIVERIES                27
+#define QDR_ROUTER_DELIVERIES_INGRESS                 28
+#define QDR_ROUTER_DELIVERIES_EGRESS                  29
+#define QDR_ROUTER_DELIVERIES_TRANSIT                 30
+#define QDR_ROUTER_DELIVERIES_INGRESS_ROUTE_CONTAINER 31
+#define QDR_ROUTER_DELIVERIES_EGRESS_ROUTE_CONTAINER  32
+
+
 const char *qdr_router_columns[] =
     {"name",
      "identity",
@@ -68,6 +81,17 @@ const char *qdr_router_columns[] =
      "saslConfigPath",
      "saslConfigName",
      "connectionCount",
+     "presettledDeliveries",
+     "droppedPresettledDeliveries",
+     "acceptedDeliveries",
+     "rejectedDeliveries",
+     "releasedDeliveries",
+     "modifiedDeliveries",
+     "deliveriesIngress",
+     "deliveriesEgress",
+     "deliveriesTransit",
+     "deliveriesIngressRouteContainer",
+     "deliveriesEgressRouteContainer",
      0};
 
 
@@ -147,6 +171,50 @@ static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_co
             qd_compose_insert_null(body);
         break;
 
+    case QDR_ROUTER_PRESETTLED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->presettled_deliveries);
+        break;
+
+    case QDR_ROUTER_DROPPED_PRESETTLED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->dropped_presettled_deliveries);
+        break;
+
+    case QDR_ROUTER_ACCEPTED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->accepted_deliveries);
+        break;
+
+    case QDR_ROUTER_REJECTED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->rejected_deliveries);
+        break;
+
+    case QDR_ROUTER_RELEASED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->released_deliveries);
+        break;
+
+    case QDR_ROUTER_MODIFIED_DELIVERIES:
+        qd_compose_insert_ulong(body, core->modified_deliveries);
+        break;
+
+    case QDR_ROUTER_DELIVERIES_INGRESS:
+        qd_compose_insert_ulong(body, core->deliveries_ingress);
+        break;
+
+    case QDR_ROUTER_DELIVERIES_EGRESS:
+        qd_compose_insert_ulong(body, core->deliveries_egress);
+        break;
+
+    case QDR_ROUTER_DELIVERIES_TRANSIT:
+        qd_compose_insert_ulong(body, core->deliveries_transit);
+        break;
+
+    case QDR_ROUTER_DELIVERIES_INGRESS_ROUTE_CONTAINER:
+        qd_compose_insert_ulong(body, core->deliveries_ingress_route_container);
+        break;
+
+    case QDR_ROUTER_DELIVERIES_EGRESS_ROUTE_CONTAINER:
+        qd_compose_insert_ulong(body, core->deliveries_egress_route_container);
+        break;
+
     default:
         qd_compose_insert_null(body);
         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/agent_router.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_router.h b/src/router_core/agent_router.h
index 3dc55b5..6cb9b18 100644
--- a/src/router_core/agent_router.h
+++ b/src/router_core/agent_router.h
@@ -21,7 +21,7 @@
 
 #include "router_core_private.h"
 
-#define QDR_ROUTER_COLUMN_COUNT  22
+#define QDR_ROUTER_COLUMN_COUNT  33
 
 const char *qdr_router_columns[QDR_ROUTER_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index dd7a2a4..00b0928 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -120,6 +120,11 @@ void qdr_connection_closed(qdr_connection_t *conn)
     qdr_action_enqueue(conn->core, action);
 }
 
+bool qdr_connection_route_container(qdr_connection_t *conn)
+{
+    return conn->role == QDR_ROLE_ROUTE_CONTAINER;
+}
+
 
 void qdr_connection_set_context(qdr_connection_t *conn, void *context)
 {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index db67998..3a0e3eb 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -165,7 +165,7 @@ static void qdr_forward_drop_presettled_CT_LH(qdr_core_t *core, qdr_link_t *link
 
             // Increment the presettled_dropped_deliveries on the out_link
             link->dropped_presettled_deliveries++;
-
+            core->dropped_presettled_deliveries++;
         }
         dlv = next;
     }
@@ -279,8 +279,10 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
             qdr_delivery_t *out_delivery = qdr_forward_new_delivery_CT(core, in_delivery, out_link, msg);
             qdr_forward_deliver_CT(core, out_link, out_delivery);
             fanout++;
-            if (out_link->link_type != QD_LINK_CONTROL && out_link->link_type != QD_LINK_ROUTER)
+            if (out_link->link_type != QD_LINK_CONTROL && out_link->link_type != QD_LINK_ROUTER) {
                 addr->deliveries_egress++;
+                core->deliveries_egress++;
+            }
             link_ref = DEQ_NEXT(link_ref);
         }
     }
@@ -353,6 +355,7 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
                 qdr_forward_deliver_CT(core, dest_link, out_delivery);
                 fanout++;
                 addr->deliveries_transit++;
+                core->deliveries_transit++;
             }
         }
 
@@ -482,6 +485,13 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
         }
 
         addr->deliveries_egress++;
+        core->deliveries_egress++;
+
+        if (qdr_connection_route_container(out_link->conn)) {
+            core->deliveries_egress_route_container++;
+            addr->deliveries_egress_route_container++;
+        }
+
         return 1;
     }
 
@@ -515,6 +525,7 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
                 out_delivery = qdr_forward_new_delivery_CT(core, in_delivery, out_link, msg);
                 qdr_forward_deliver_CT(core, out_link, out_delivery);
                 addr->deliveries_transit++;
+                core->deliveries_transit++;
                 return 1;
             }
         }
@@ -674,10 +685,19 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
         //
         // Bump the appropriate counter based on where we sent the delivery.
         //
-        if (chosen_link_bit >= 0)
+        if (chosen_link_bit >= 0) {
             addr->deliveries_transit++;
-        else
+            core->deliveries_transit++;
+        }
+        else {
             addr->deliveries_egress++;
+            core->deliveries_egress++;
+
+            if (qdr_connection_route_container(chosen_link->conn)) {
+                core->deliveries_egress_route_container++;
+                addr->deliveries_egress_route_container++;
+            }
+        }
         return 1;
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 415d494..9b7ba23 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -470,6 +470,9 @@ struct qdr_address_t {
     uint64_t deliveries_transit;
     uint64_t deliveries_to_container;
     uint64_t deliveries_from_container;
+    uint64_t deliveries_egress_route_container;
+    uint64_t deliveries_ingress_route_container;
+
     ///@}
 };
 
@@ -701,6 +704,22 @@ struct qdr_core_t {
     sys_mutex_t          *id_lock;
 
     qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
+
+
+    // Overall delivery counters
+    uint64_t           presettled_deliveries;
+    uint64_t           dropped_presettled_deliveries;
+    uint64_t           accepted_deliveries;
+    uint64_t           rejected_deliveries;
+    uint64_t           released_deliveries;
+    uint64_t           modified_deliveries;
+    uint64_t           deliveries_ingress;
+    uint64_t           deliveries_egress;
+    uint64_t           deliveries_transit;
+    uint64_t           deliveries_egress_route_container;
+    uint64_t           deliveries_ingress_route_container;
+
+
 };
 
 void *router_core_thread(void *arg);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 6f69772..182082e 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -520,16 +520,31 @@ static void qdr_delete_delivery_internal_CT(qdr_core_t *core, qdr_delivery_t *de
     }
 
     if (link) {
-        if (delivery->presettled)
+        if (delivery->presettled) {
             link->presettled_deliveries++;
-        else if (delivery->disposition == PN_ACCEPTED)
+            if (link->link_direction ==  QD_INCOMING)
+                core->presettled_deliveries++;
+        }
+        else if (delivery->disposition == PN_ACCEPTED) {
             link->accepted_deliveries++;
-        else if (delivery->disposition == PN_REJECTED)
+            if (link->link_direction ==  QD_INCOMING)
+                core->accepted_deliveries++;
+        }
+        else if (delivery->disposition == PN_REJECTED) {
             link->rejected_deliveries++;
-        else if (delivery->disposition == PN_RELEASED)
+            if (link->link_direction ==  QD_INCOMING)
+                core->rejected_deliveries++;
+        }
+        else if (delivery->disposition == PN_RELEASED) {
             link->released_deliveries++;
-        else if (delivery->disposition == PN_MODIFIED)
+            if (link->link_direction ==  QD_INCOMING)
+                core->released_deliveries++;
+        }
+        else if (delivery->disposition == PN_MODIFIED) {
             link->modified_deliveries++;
+            if (link->link_direction ==  QD_INCOMING)
+                core->modified_deliveries++;
+        }
     }
 
     //
@@ -764,6 +779,7 @@ static long qdr_addr_path_count_CT(qdr_address_t *addr)
 
 static void qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv, qdr_address_t *addr)
 {
+    core->deliveries_ingress++;
     bool receive_complete = qd_message_receive_complete(qdr_delivery_message(dlv));
     if (addr && addr == link->owning_addr && qdr_addr_path_count_CT(addr) == 0) {
         //
@@ -787,6 +803,7 @@ static void qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery
             if (dlv->settled) {
                 // Increment the presettled_dropped_deliveries on the in_link
                 link->dropped_presettled_deliveries++;
+                core->dropped_presettled_deliveries++;
             }
         }
         else {
@@ -801,8 +818,16 @@ static void qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery
 
     if (addr) {
         fanout = qdr_forward_message_CT(core, addr, dlv->msg, dlv, false, link->link_type == QD_LINK_CONTROL);
-        if (link->link_type != QD_LINK_CONTROL && link->link_type != QD_LINK_ROUTER)
+        if (link->link_type != QD_LINK_CONTROL && link->link_type != QD_LINK_ROUTER) {
             addr->deliveries_ingress++;
+
+            if (qdr_connection_route_container(link->conn)) {
+                addr->deliveries_ingress_route_container++;
+                core->deliveries_ingress_route_container++;
+
+            }
+
+        }
         link->total_deliveries++;
     }
     //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 81437cb..b8c4a6b 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -33,7 +33,6 @@
 const char *QD_ROUTER_NODE_TYPE = "router.node";
 const char *QD_ROUTER_ADDRESS_TYPE = "router.address";
 const char *QD_ROUTER_LINK_TYPE = "router.link";
-const char *CORE_AGENT_ADDRESS = "$management";
 
 static char *router_role    = "inter-router";
 static char *container_role = "route-container";

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tests/system_tests_autolinks.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_autolinks.py b/tests/system_tests_autolinks.py
index 07dc3f6..a2c1035 100644
--- a/tests/system_tests_autolinks.py
+++ b/tests/system_tests_autolinks.py
@@ -18,13 +18,17 @@
 #
 
 import unittest2 as unittest
+import json
 from proton import Message
-from system_test import TestCase, Qdrouterd, main_module, TIMEOUT
+from system_test import TestCase, Qdrouterd, main_module, TIMEOUT, Process
 from proton.handlers import MessagingHandler
 from proton.reactor import Container
+from subprocess import PIPE, STDOUT
 
 CONNECTION_PROPERTIES = {u'connection': u'properties', u'int_property': 6451}
 
+
+
 class AutolinkTest(TestCase):
     """System tests involving a single router"""
     @classmethod
@@ -75,6 +79,26 @@ class AutolinkTest(TestCase):
         cls.normal_address = cls.router.addresses[0]
         cls.route_address  = cls.router.addresses[1]
 
+    def run_qdstat_general(self):
+        cmd = ['qdstat', '--bus', str(AutolinkTest.normal_address), '--timeout', str(TIMEOUT)] + ['-g']
+        p = self.popen(
+            cmd,
+            name='qdstat-'+self.id(), stdout=PIPE, expect=None)
+
+        out = p.communicate()[0]
+        assert p.returncode == 0, "qdstat exit status %s, output:\n%s" % (p.returncode, out)
+        return out
+
+    def run_qdmanage(self, cmd, input=None, expect=Process.EXIT_OK):
+        p = self.popen(
+            ['qdmanage'] + cmd.split(' ') + ['--bus', AutolinkTest.normal_address, '--indent=-1', '--timeout', str(TIMEOUT)],
+            stdin=PIPE, stdout=PIPE, stderr=STDOUT, expect=expect)
+        out = p.communicate(input)[0]
+        try:
+            p.teardown()
+        except Exception, e:
+            raise Exception("%s\n%s" % (e, out))
+        return out
 
     def test_01_autolink_attach(self):
         """
@@ -85,7 +109,6 @@ class AutolinkTest(TestCase):
         test.run()
         self.assertEqual(None, test.error)
 
-
     def test_02_autolink_credit(self):
         """
         Create a normal connection and a sender to the autolink address.  Then create the route-container
@@ -95,6 +118,12 @@ class AutolinkTest(TestCase):
         test.run()
         self.assertEqual(None, test.error)
 
+        long_type = 'org.apache.qpid.dispatch.router'
+        query_command = 'QUERY --type=' + long_type
+        output = json.loads(self.run_qdmanage(query_command))
+
+        self.assertEqual(output[0]['deliveriesIngress'], 1)
+        self.assertEqual(output[0]['deliveriesEgress'], 0)
 
     def test_03_autolink_sender(self):
         """
@@ -105,6 +134,15 @@ class AutolinkTest(TestCase):
         test.run()
         self.assertEqual(None, test.error)
 
+        long_type = 'org.apache.qpid.dispatch.router'
+        query_command = 'QUERY --type=' + long_type
+        output = json.loads(self.run_qdmanage(query_command))
+        self.assertEqual(output[0]['deliveriesEgressRouteContainer'], 275)
+        self.assertEqual(output[0]['deliveriesIngressRouteContainer'], 0)
+        self.assertEqual(output[0]['deliveriesTransit'], 0)
+
+        self.assertEqual(output[0]['deliveriesIngress'], 277)
+        self.assertEqual(output[0]['deliveriesEgress'], 276)
 
     def test_04_autolink_receiver(self):
         """
@@ -115,6 +153,15 @@ class AutolinkTest(TestCase):
         test.run()
         self.assertEqual(None, test.error)
 
+        long_type = 'org.apache.qpid.dispatch.router'
+        query_command = 'QUERY --type=' + long_type
+        output = json.loads(self.run_qdmanage(query_command))
+        self.assertEqual(output[0]['deliveriesEgressRouteContainer'], 275)
+        self.assertEqual(output[0]['deliveriesIngressRouteContainer'], 275)
+        self.assertEqual(output[0]['deliveriesTransit'], 0)
+
+        self.assertEqual(output[0]['deliveriesIngress'], 553)
+        self.assertEqual(output[0]['deliveriesEgress'], 552)
 
     def test_05_inter_container_transfer(self):
         """

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tests/system_tests_default_distribution.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_default_distribution.py b/tests/system_tests_default_distribution.py
index 6d66996..8d318e4 100644
--- a/tests/system_tests_default_distribution.py
+++ b/tests/system_tests_default_distribution.py
@@ -73,12 +73,12 @@ class DefaultDistributionTest(TestCase):
 
     def test_general(self):
         out = self.run_qdstat(['--general'], r'(?s)Router Statistics.*Mode\s*Standalone')
-        self.assertTrue("Connections  1" in out)
-        self.assertTrue("Nodes        0" in out)
-        self.assertTrue("Auto Links   0" in out)
-        self.assertTrue("Link Routes  0" in out)
-        self.assertTrue("Router Id    QDR" in out)
-        self.assertTrue("Mode         standalone" in out)
+        self.assertTrue("Connections                      1" in out)
+        self.assertTrue("Nodes                            0" in out)
+        self.assertTrue("Auto Links                       0" in out)
+        self.assertTrue("Link Routes                      0" in out)
+        self.assertTrue("Router Id                        QDR" in out)
+        self.assertTrue("Mode                             standalone" in out)
 
 class Timeout(object):
     def __init__(self, parent):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tests/system_tests_one_router.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_one_router.py b/tests/system_tests_one_router.py
index 6a37e79..3d79160 100644
--- a/tests/system_tests_one_router.py
+++ b/tests/system_tests_one_router.py
@@ -152,7 +152,6 @@ class OneRouterTest(TestCase):
         M3.stop()
         M4.stop()
 
-
     def test_02b_disp_to_closed_connection(self):
         addr = self.address+"/pre_settled/2"
         M1 = self.messenger()
@@ -1129,6 +1128,7 @@ class OneRouterTest(TestCase):
         test = BatchedSettlementTest(self.address)
         test.run()
         self.assertEqual(None, test.error)
+        self.assertTrue(test.accepted_count_match)
 
     def test_21_presettled_overflow(self):
         test = PresettledOverflowTest(self.address)
@@ -1159,6 +1159,7 @@ class OneRouterTest(TestCase):
         test = RejectDispositionTest(self.address)
         test.run()
         self.assertTrue(test.received_error)
+        self.assertTrue(test.reject_count_match)
 
     def test_connection_properties_unicode_string(self):
         """
@@ -1314,6 +1315,7 @@ class ExcessDeliveriesReleasedTest(MessagingHandler):
                 self.error = "Expected 6 accepted, got %d" % self.n_accepted
             if self.n_received != 6:
                 self.error = "Expected 6 received, got %d" % self.n_received
+
             event.connection.close()
 
     def on_message(self, event):
@@ -1559,6 +1561,18 @@ class MulticastUnsettledNoReceiverTest(MessagingHandler):
                     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])
+                        else:
+                            outs = local_node.query(type='org.apache.qpid.dispatch.router')
+                            pos = outs.attribute_names.index("droppedPresettledDeliveries")
+                            results = outs.results[0]
+                            if results[pos] != 250:
+                                self.error = "When querying router, expected 250 dropped presettled " \
+                                             "deliveries but got " + str(results[pos])
+                            else:
+                                pos = outs.attribute_names.index("releasedDeliveries")
+                                if results[pos] < 250:
+                                    self.error = "The number of released deliveries cannot be less that 250 " \
+                                                 "but it is " + str(results[pos])
 
             self.timer.cancel()
             self.conn.close()
@@ -1602,8 +1616,13 @@ class ReleasedVsModifiedTest(MessagingHandler):
 
     def check_if_done(self):
         if self.n_received == self.accept and self.n_released == self.count - self.accept and self.n_modified == self.accept:
-            self.timer.cancel()
-            self.conn.close()
+            local_node = Node.connect(self.address, timeout=TIMEOUT)
+            outs = local_node.query(type='org.apache.qpid.dispatch.router')
+            pos = outs.attribute_names.index("modifiedDeliveries")
+            results = outs.results[0]
+            if results[pos] == self.accept:
+                self.timer.cancel()
+                self.conn.close()
 
     def timeout(self):
         self.error = "Timeout Expired: sent=%d, received=%d, released=%d, modified=%d" % \
@@ -1709,9 +1728,17 @@ class BatchedSettlementTest(MessagingHandler):
         self.n_received  = 0
         self.n_settled   = 0
         self.batch       = []
+        self.accepted_count_match = False
 
     def check_if_done(self):
         if self.n_settled == self.count:
+            local_node = Node.connect(self.address, timeout=TIMEOUT)
+            outs = local_node.query(type='org.apache.qpid.dispatch.router')
+            pos = outs.attribute_names.index("acceptedDeliveries")
+            results = outs.results[0]
+            if results >= self.count:
+                self.accepted_count_match = True
+
             self.timer.cancel()
             self.conn.close()
 
@@ -1855,7 +1882,14 @@ class PresettledOverflowTest(MessagingHandler):
                     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])
-
+                        else:
+                            outs = local_node.query(type='org.apache.qpid.dispatch.router')
+                            pos = outs.attribute_names.index("droppedPresettledDeliveries")
+                            results = outs.results[0]
+                            # There is 250 from a previous test
+                            if results[pos] < 500:
+                                self.error = "When querying router, expected 500 dropped presettled " \
+                                             "deliveries but got " + str(results[pos])
             self.conn.close()
             self.timer.cancel()
 
@@ -1872,7 +1906,7 @@ class RejectDispositionTest(MessagingHandler):
         self.dest = "rejectDispositionTest"
         self.error_description = 'you were out of luck this time!'
         self.error_name = u'amqp:internal-error'
-
+        self.reject_count_match = False
 
     def on_start(self, event):
         conn = event.container.connect(self.address)
@@ -1888,6 +1922,14 @@ class RejectDispositionTest(MessagingHandler):
         if event.delivery.remote.condition.description == self.error_description \
                 and event.delivery.remote.condition.name == self.error_name:
             self.received_error = True
+
+        local_node = Node.connect(self.address, timeout=TIMEOUT)
+        outs = local_node.query(type='org.apache.qpid.dispatch.router')
+        pos = outs.attribute_names.index("rejectedDeliveries")
+        results = outs.results[0]
+        if results[pos] == 2:
+            self.reject_count_match = True
+
         event.connection.close()
 
     def on_message(self, event):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tests/system_tests_qdstat.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_qdstat.py b/tests/system_tests_qdstat.py
index 84000da..bf85220 100644
--- a/tests/system_tests_qdstat.py
+++ b/tests/system_tests_qdstat.py
@@ -53,12 +53,12 @@ class QdstatTest(system_test.TestCase):
 
     def test_general(self):
         out = self.run_qdstat(['--general'], r'(?s)Router Statistics.*Mode\s*Standalone')
-        self.assertTrue("Connections  1" in out)
-        self.assertTrue("Nodes        0" in out)
-        self.assertTrue("Auto Links   0" in out)
-        self.assertTrue("Link Routes  0" in out)
-        self.assertTrue("Router Id    QDR.A" in out)
-        self.assertTrue("Mode         standalone" in out)
+        self.assertTrue("Connections                      1" in out)
+        self.assertTrue("Nodes                            0" in out)
+        self.assertTrue("Auto Links                       0" in out)
+        self.assertTrue("Link Routes                      0" in out)
+        self.assertTrue("Router Id                        QDR.A" in out)
+        self.assertTrue("Mode                             standalone" in out)
 
     def test_connections(self):
         self.run_qdstat(['--connections'], r'host.*container.*role')

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tests/system_tests_two_routers.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_two_routers.py b/tests/system_tests_two_routers.py
index 7fae131..7aa3096 100644
--- a/tests/system_tests_two_routers.py
+++ b/tests/system_tests_two_routers.py
@@ -23,6 +23,7 @@ from proton import Message, PENDING, ACCEPTED, REJECTED, Timeout
 from system_test import TestCase, Qdrouterd, main_module, TIMEOUT
 from proton.handlers import MessagingHandler
 from proton.reactor import Container
+from qpid_dispatch.management.client import Node
 
 # PROTON-828:
 try:
@@ -97,6 +98,9 @@ class TwoRouterTest(TestCase):
         M1 = self.messenger()
         M2 = self.messenger()
 
+        # Why 104 ? Choose a random number and use it to test later on.
+        num_msgs = 104
+
         M1.route("amqp:/*", self.routers[0].addresses[0]+"/$1")
         M2.route("amqp:/*", self.routers[1].addresses[0]+"/$1")
 
@@ -108,12 +112,12 @@ class TwoRouterTest(TestCase):
         self.routers[0].wait_address("pre_settled.1", 0, 1)
 
         tm.address = addr
-        for i in range(100):
+        for i in range(num_msgs):
             tm.body = {'number': i}
             M1.put(tm)
         M1.send()
 
-        for i in range(100):
+        for i in range(num_msgs):
             M2.recv(1)
             M2.get(rm)
             self.assertEqual(i, rm.body['number'])
@@ -121,6 +125,14 @@ class TwoRouterTest(TestCase):
         M1.stop()
         M2.stop()
 
+        local_node = Node.connect(self.routers[0].addresses[0], timeout=TIMEOUT)
+        outs = local_node.query(type='org.apache.qpid.dispatch.router')
+
+        # deliveriesTransit must most surely be greater than num_msgs
+        pos = outs.attribute_names.index("deliveriesTransit")
+        results = outs.results[0]
+        self.assertTrue(results[pos] > num_msgs)
+
     def test_02a_multicast_unsettled(self):
         addr = "amqp:/multicast.2"
         M1 = self.messenger()

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b6805c0c/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index 98862d7..93cc8cc 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -243,6 +243,19 @@ class BusManager(Node):
         rows.append(('Addresses',     router.addrCount))
         rows.append(('Connections',   router.connectionCount))
 
+        # Overall delivery related counts.
+        rows.append(('Presettled Count', router.presettledDeliveries))
+        rows.append(('Dropped Presettled Count', router.droppedPresettledDeliveries))
+        rows.append(('Accepted Count', router.acceptedDeliveries))
+        rows.append(('Rejected Count', router.rejectedDeliveries))
+        rows.append(('Released Count', router.releasedDeliveries))
+        rows.append(('Modified Count', router.modifiedDeliveries))
+        rows.append(('Ingress Count', router.deliveriesIngress))
+        rows.append(('Egress Count', router.deliveriesEgress))
+        rows.append(('Transit Count', router.deliveriesTransit))
+        rows.append(('Deliveries from Route Container', router.deliveriesIngressRouteContainer))
+        rows.append(('Deliveries to Route Container', router.deliveriesEgressRouteContainer))
+
         title = "Router Statistics"
         dispRows = rows
         disp.formattedTable(title, heads, dispRows)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org