Repository: qpid-dispatch
Updated Branches:
  refs/heads/crolke-DISPATCH-188-1 c9c6b2002 -> 2ecb6685c


Add global connection statistics to policy entity.


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

Branch: refs/heads/crolke-DISPATCH-188-1
Commit: 2ecb6685ca251d6025ad76330b883524820ebcf6
Parents: c9c6b20
Author: Chuck Rolke <[email protected]>
Authored: Thu Nov 12 14:10:46 2015 -0500
Committer: Chuck Rolke <[email protected]>
Committed: Thu Nov 12 14:10:46 2015 -0500

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json   |  7 ++-
 .../qpid_dispatch_internal/management/agent.py  |  6 +++
 src/dispatch.c                                  |  2 +-
 src/policy.c                                    | 51 ++++++++++++++------
 src/policy_private.h                            |  2 +-
 5 files changed, 49 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json 
b/python/qpid_dispatch/management/qdrouter.json
index 1aa1e7d..74f9b77 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -1008,10 +1008,13 @@
                 "maximumConnections": {
                     "type": "integer",
                     "default": 0,
-                    "description": "The maximum number of client connections 
allowed. Zero implies no limit.",
+                    "description": "The maximum number of concurrent client 
connections allowed. Zero implies no limit.",
                     "required": false,
                     "create": true
-                }
+                },
+                "connectionsProcessed": {"type": "integer", "graph": true},
+                "connectionsDenied": {"type": "integer", "graph": true},
+                "connectionsCurrent": {"type": "integer", "graph": true}
             }
         },
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/python/qpid_dispatch_internal/management/agent.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/management/agent.py 
b/python/qpid_dispatch_internal/management/agent.py
index 3efe1ff..1930c30 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -270,6 +270,12 @@ class LogEntity(EntityAdapter):
         self._qd.qd_log_source_reset(self.attributes['module'])
 
 class PolicyEntity(EntityAdapter):
+    def __init__(self, agent, entity_type, attributes=None):
+        super(PolicyEntity, self).__init__(agent, entity_type, attributes, 
validate=False)
+        # Policy is a mix of configuration and operational entity.
+        # The statistics attributes are operational not configured.
+        self._add_implementation(
+            CImplementation(agent.qd, entity_type, self._dispatch))
 
     def create(self):
         self._qd.qd_dispatch_configure_policy(self._dispatch, self)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/dispatch.c
----------------------------------------------------------------------
diff --git a/src/dispatch.c b/src/dispatch.c
index d9575e2..15b3b97 100644
--- a/src/dispatch.c
+++ b/src/dispatch.c
@@ -143,7 +143,7 @@ qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, 
qd_entity_t *entity) {
 
 qd_error_t qd_dispatch_configure_policy(qd_dispatch_t *qd, qd_entity_t *entity)
 {
-    qd_router_configure_policy(qd->policy, entity);
+    qd_entity_configure_policy(qd->policy, entity);
     return QD_ERROR_NONE;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/policy.c
----------------------------------------------------------------------
diff --git a/src/policy.c b/src/policy.c
index 7b4e98e..dbade77 100644
--- a/src/policy.c
+++ b/src/policy.c
@@ -64,6 +64,8 @@ void policy_engine_step()
 // reconfiguration of policy settings.
 //
 static int n_connections = 0;
+static int n_denied = 0;
+static int n_processed = 0;
 
 //
 // error conditions signaled to effect denial
@@ -84,10 +86,12 @@ static char* CONNECTION_DISALLOWED         = "connection 
disallowed by local pol
 struct qd_policy_t {
     qd_dispatch_t        *qd;
     qd_log_source_t      *log_source;
-
-    int                   max_connections;
-
-    int                   current_connections;
+                          // configured settings
+    int                   max_connection_limit;
+                          // live statistics
+    int                   connections_processed;
+    int                   connections_denied;
+    int                   connections_current;
 };
 
 
@@ -95,10 +99,12 @@ qd_policy_t *qd_policy(qd_dispatch_t *qd)
 {
     qd_policy_t *policy = NEW(qd_policy_t);
 
-    policy->qd                  = qd;
-    policy->log_source          = qd_log_source("POLICY");
-    policy->max_connections     = 0;
-    policy->current_connections = 0;
+    policy->qd                   = qd;
+    policy->log_source           = qd_log_source("POLICY");
+    policy->max_connection_limit = 0;
+    policy->connections_processed= 0;
+    policy->connections_denied   = 0;
+    policy->connections_current  = 0;
 
     qd_log(policy->log_source, QD_LOG_TRACE, "Policy Initialized");
     return policy;
@@ -112,17 +118,30 @@ void qd_policy_free(qd_policy_t *policy)
 
 //
 //
-qd_error_t qd_router_configure_policy(qd_policy_t *policy, qd_entity_t *entity)
+qd_error_t qd_entity_configure_policy(qd_policy_t *policy, qd_entity_t *entity)
 {
-    policy->max_connections = qd_entity_opt_long(entity, "maximumConnections", 
0); QD_ERROR_RET();
-    if (policy->max_connections < 0)
+    policy->max_connection_limit = qd_entity_opt_long(entity, 
"maximumConnections", 0); QD_ERROR_RET();
+    if (policy->max_connection_limit < 0)
         return qd_error(QD_ERROR_CONFIG, "maximumConnections must be >= 0");
-    qd_log(policy->log_source, QD_LOG_INFO, "Configured maximumConnections: 
%d", policy->max_connections);
+    qd_log(policy->log_source, QD_LOG_INFO, "Configured maximumConnections: 
%d", policy->max_connection_limit);
     return QD_ERROR_NONE;
 }
 
 
 //
+//
+qd_error_t qd_entity_refresh_policy(qd_entity_t* entity, void *impl) {
+    // Return global stats
+    if (!qd_entity_set_long(entity, "connectionsProcessed", n_processed) &&
+        !qd_entity_set_long(entity, "connectionsDenied", n_denied) &&
+        !qd_entity_set_long(entity, "connectionsCurrent", n_connections)
+    )
+        return QD_ERROR_NONE;
+    return qd_error_code();
+}
+
+
+//
 // Functions related to absolute connection counts.
 // These handle connections at the socket level with
 // no regard to user identity. Simple yes/no decisions
@@ -134,21 +153,23 @@ bool qd_policy_socket_accept(void *context, const char 
*hostname)
     qd_policy_t *policy = (qd_policy_t *)context;
     bool result = true;
 
-    if (policy->max_connections == 0) {
+    if (policy->max_connection_limit == 0) {
         // Policy not in force; connection counted and allowed
         n_connections += 1;
     } else {
         // Policy in force
-        if (n_connections < policy->max_connections) {
+        if (n_connections < policy->max_connection_limit) {
             // connection counted and allowed
             n_connections += 1;
             qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' 
allowed. N= %d", hostname, n_connections);
         } else {
             // connection denied
             result = false;
+            n_denied += 1;
             qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' 
denied, N=%d", hostname, n_connections);
         }
     }
+    n_processed += 1;
     return result;
 }
 
@@ -159,7 +180,7 @@ void qd_policy_socket_close(void *context, const char 
*hostname)
 
     n_connections -= 1;
     assert (n_connections >= 0);
-    if (policy->max_connections > 0) {
+    if (policy->max_connection_limit > 0) {
         qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' closed, 
N=%d", hostname, n_connections);
     }
     qd_log(policy->log_source, POLICY_LOG_LEVEL, "Connection '%s' closed, 
N=%d", hostname, n_connections);  // HACK EXTRA

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2ecb6685/src/policy_private.h
----------------------------------------------------------------------
diff --git a/src/policy_private.h b/src/policy_private.h
index 2647b85..f6a4937 100644
--- a/src/policy_private.h
+++ b/src/policy_private.h
@@ -32,7 +32,7 @@
 
 typedef struct qd_policy_t qd_policy_t;
 
-qd_error_t qd_router_configure_policy(qd_policy_t *policy, qd_entity_t 
*entity);
+qd_error_t qd_entity_configure_policy(qd_policy_t *policy, qd_entity_t 
*entity);
 
 
 /** Allow or deny an incoming connection based on connection count(s).


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to