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 2016/03/19 00:06:19 UTC

[01/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Renamed "provisioned" entity to "route".

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master c6ccf1e1b -> 326d09a89


DISPATCH-179 - Renamed "provisioned" entity to "route".


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

Branch: refs/heads/master
Commit: 43e3a49e1ea2aeeac99c0ec99e34a6dfe9717728
Parents: 27cc402
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Feb 26 16:33:24 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Feb 26 16:33:24 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |   2 +-
 src/CMakeLists.txt                    |   2 +-
 src/router_config.c                   |  63 +++---
 src/router_core/DESIGN                |   2 +-
 src/router_core/agent.c               |  18 +-
 src/router_core/agent_provisioned.c   | 344 -----------------------------
 src/router_core/agent_provisioned.h   |  35 ---
 src/router_core/agent_route.c         | 344 +++++++++++++++++++++++++++++
 src/router_core/agent_route.h         |  35 +++
 src/router_core/management_agent.c    |   6 +-
 src/router_core/router_core.c         |   2 +-
 src/router_core/router_core_private.h |  22 +-
 12 files changed, 439 insertions(+), 436 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 89b5e6f..602e67c 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -542,7 +542,7 @@ qd_message_t *qdr_delivery_message(const qdr_delivery_t *delivery);
  ******************************************************************************
  */
 typedef enum {
-    QD_ROUTER_PROVISIONED,
+    QD_ROUTER_ROUTE,
     QD_ROUTER_CONNECTION,
     QD_ROUTER_LINK,
     QD_ROUTER_ADDRESS,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c85b08b..f74babe 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -68,7 +68,7 @@ set(qpid_dispatch_SOURCES
   router_core/agent_address.c
   router_core/agent_waypoint.c
   router_core/agent_link.c
-  router_core/agent_provisioned.c
+  router_core/agent_route.c
   router_core/connections.c
   router_core/error.c
   router_core/forwarder.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 9064c2e..40453fd 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -30,50 +30,48 @@
 qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
 {
     qd_error_clear();
-    int   phase  = qd_entity_opt_long(entity, "phase", 0); QD_ERROR_RET();
-    qd_schema_fixedAddress_fanout_t fanout = qd_entity_get_long(entity, "fanout"); QD_ERROR_RET();
-    qd_schema_fixedAddress_bias_t bias   = qd_entity_get_long(entity, "bias"); QD_ERROR_RET();
-    char *prefix = qd_entity_get_string(entity, "prefix"); QD_ERROR_RET();
-
-    if (phase < 0 || phase > 9) {
-        qd_error_t err = qd_error(QD_ERROR_CONFIG,
-                                  "Invalid phase %d for prefix '%s' must be between 0 and 9.  Ignoring", phase, prefix);
+    int                             phase  = qd_entity_opt_long(entity, "phase", -1); QD_ERROR_RET();
+    qd_schema_fixedAddress_fanout_t fanout = qd_entity_get_long(entity, "fanout");    QD_ERROR_RET();
+    qd_schema_fixedAddress_bias_t   bias   = qd_entity_get_long(entity, "bias");      QD_ERROR_RET();
+    char                           *prefix = qd_entity_get_string(entity, "prefix");  QD_ERROR_RET();
+
+    if (phase != -1) {
+        qd_log(router->log_source, QD_LOG_WARNING,
+               "Address phases deprecated: Ignoring address configuration for '%s', phase %d", prefix, phase);
         free(prefix);
-        return err;
+        return qd_error_code();
     }
 
     if (prefix[0] == '/' && prefix[1] == '\0') {
         qd_log(router->log_source, QD_LOG_WARNING, "Ignoring address configuration for '/'");
+        free(prefix);
         return qd_error_code();
     }
 
     //
     // Convert fanout + bias to semantics
     //
-    const char *sem;
+    const char *trt;
 
     if (fanout == QD_SCHEMA_FIXEDADDRESS_FANOUT_MULTIPLE)
-        sem = "multi";
+        trt = "multicast";
     else {
         if (bias == QD_SCHEMA_FIXEDADDRESS_BIAS_CLOSEST)
-            sem = "anyClosest";
+            trt = "closest";
         else
-            sem = "anyBalanced";
+            trt = "balanced";
     }
 
     //
-    // Formulate this configuration as a router.provisioned and create it through the core management API.
+    // Formulate this configuration as a router.route and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "objectType");
-    qd_compose_insert_string(body, "address");
-
     qd_compose_insert_string(body, "address");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "semantics");
-    qd_compose_insert_string(body, sem);
+    qd_compose_insert_string(body, "treatment");
+    qd_compose_insert_string(body, trt);
     qd_compose_end_map(body);
 
     int              length = 0;
@@ -91,7 +89,7 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_PROVISIONED, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
 
     free(prefix);
     return qd_error_code();
@@ -132,23 +130,28 @@ qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity
 
 qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 {
-    char *prefix    = qd_entity_get_string(entity, "prefix"); QD_ERROR_RET();
+    char *prefix    = qd_entity_get_string(entity, "prefix");    QD_ERROR_RET();
     char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
-    char *direction = qd_entity_get_string(entity, "dir"); QD_ERROR_RET();
+    char *direction = qd_entity_get_string(entity, "dir");       QD_ERROR_RET();
 
     //
-    // Formulate this configuration as a router.provisioned and create it through the core management API.
+    // Formulate this configuration as a router.route and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "objectType");
-    qd_compose_insert_string(body, "linkDestination");
-
     qd_compose_insert_string(body, "address");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "direction");
-    qd_compose_insert_string(body, direction);
+    qd_compose_insert_string(body, "path");
+    if      (strcmp("in", direction) == 0)
+        qd_compose_insert_string(body, "sink");
+    else if (strcmp("out", direction) == 0)
+        qd_compose_insert_string(body, "source");
+    else
+        qd_compose_insert_string(body, "waypoint");
+
+    qd_compose_insert_string(body, "treatment");
+    qd_compose_insert_string(body, "linkBalanced");
     qd_compose_end_map(body);
 
     int              length = 0;
@@ -163,10 +166,10 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
         buf = DEQ_NEXT(buf);
     }
 
-    qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
+    qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_PROVISIONED, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
 
     free(prefix);
     free(connector);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index c320976..5197a2f 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -253,7 +253,7 @@ org
           address
           link
           node
-          provisioned     (proposed)
+          route           (proposed)
           waypoint        (proposed)
         waypoint          (deprecated)
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index b5b9fc6..b0c5381 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -18,7 +18,7 @@
  */
 
 #include <qpid/dispatch/amqp.h>
-#include "agent_provisioned.h"
+#include "agent_route.h"
 #include "agent_address.h"
 #include "agent_waypoint.h"
 #include "agent_link.h"
@@ -173,8 +173,8 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     qdr_query_t* query = qdr_query(core, context, type, attribute_names, body);
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED:
-        qdr_agent_set_columns(query, attribute_names, qdr_provisioned_columns, QDR_PROVISIONED_COLUMN_COUNT);
+    case QD_ROUTER_ROUTE:
+        qdr_agent_set_columns(query, attribute_names, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT);
         break;
 
     case QD_ROUTER_CONNECTION:
@@ -205,7 +205,7 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
 void qdr_query_add_attribute_names(qdr_query_t *query)
 {
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: qdr_agent_emit_columns(query, qdr_provisioned_columns, QDR_PROVISIONED_COLUMN_COUNT); break;
+    case QD_ROUTER_ROUTE: qdr_agent_emit_columns(query, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:     qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
@@ -318,7 +318,7 @@ static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: break;
+    case QD_ROUTER_ROUTE:       break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
@@ -336,7 +336,7 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qd_parsed_field_t       *in_body    = action->args.agent.in_body;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: qdra_provisioned_create_CT(core, name, query, in_body); break;
+    case QD_ROUTER_ROUTE:       qdra_route_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     break;
@@ -354,7 +354,7 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: break;
+    case QD_ROUTER_ROUTE:       break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_delete_CT(core, name, identity, query); break;
@@ -374,7 +374,7 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_PROVISIONED: qdra_provisioned_get_first_CT(core, query, offset); break;
+        case QD_ROUTER_ROUTE:       qdra_route_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_first_CT(core, query, offset); break;
@@ -392,7 +392,7 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_PROVISIONED: qdra_provisioned_get_next_CT(core, query); break;
+        case QD_ROUTER_ROUTE:       qdra_route_get_next_CT(core, query); break;
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_next_CT(core, query); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_next_CT(core, query); break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_provisioned.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_provisioned.c b/src/router_core/agent_provisioned.c
deleted file mode 100644
index 5b58c7f..0000000
--- a/src/router_core/agent_provisioned.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "agent_link.h"
-#include <stdio.h>
-
-#define QDR_PROV_NAME               0
-#define QDR_PROV_IDENTITY           1
-#define QDR_PROV_TYPE               2
-#define QDR_PROV_OBJECT_TYPE        3
-#define QDR_PROV_ADDRESS            4
-#define QDR_PROV_CONNECTOR          5
-#define QDR_PROV_DIRECTION          6
-#define QDR_PROV_SEMANTICS          7
-#define QDR_PROV_INGRESS_ADDRESS    8
-#define QDR_PROV_EGRESS_ADDRESS     9
-#define QDR_PROV_INGRESS_SEMANTICS  10
-#define QDR_PROV_EGRESS_SEMANTICS   11
-
-const char *qdr_provisioned_columns[] =
-    {"name",
-     "identity",
-     "type",
-     "objectType",
-     "address",
-     "connector",
-     "direction",
-     "semantics",
-     "ingressAddress",
-     "egressAddress",
-     "ingressSemantics",
-     "egressSemantics",
-     0};
-
-
-static void qdr_prov_insert_column_CT(qdr_provisioned_t *prov, int col, qd_composed_field_t *body, bool as_map)
-{
-    if (as_map)
-        qd_compose_insert_string(body, qdr_provisioned_columns[col]);
-
-    switch(col) {
-    case QDR_PROV_NAME:
-        if (prov->name) {
-            qd_compose_insert_string(body, prov->name);
-            break;
-        }
-        // else fall into IDENTITY
-
-    case QDR_PROV_IDENTITY:
-
-    case QDR_PROV_TYPE:
-        qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.provisioned");
-        break;
-
-    case QDR_PROV_OBJECT_TYPE:
-    case QDR_PROV_ADDRESS:
-    case QDR_PROV_CONNECTOR:
-    case QDR_PROV_DIRECTION:
-    case QDR_PROV_SEMANTICS:
-    case QDR_PROV_INGRESS_ADDRESS:
-    case QDR_PROV_EGRESS_ADDRESS:
-    case QDR_PROV_INGRESS_SEMANTICS:
-    case QDR_PROV_EGRESS_SEMANTICS:
-    default:
-        qd_compose_insert_null(body);
-        break;
-    }
-}
-
-
-static void qdr_agent_write_prov_CT(qdr_query_t *query,  qdr_provisioned_t *prov)
-{
-    qd_composed_field_t *body = query->body;
-
-    qd_compose_start_list(body);
-    int i = 0;
-    while (query->columns[i] >= 0) {
-        qdr_prov_insert_column_CT(prov, query->columns[i], body, false);
-        i++;
-    }
-    qd_compose_end_list(body);
-}
-
-static void qdr_manage_advance_prov_CT(qdr_query_t *query, qdr_provisioned_t *prov)
-{
-    query->next_offset++;
-    prov = DEQ_NEXT(prov);
-    query->more = !!prov;
-}
-
-
-void qdra_provisioned_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
-{
-    //
-    // Queries that get this far will always succeed.
-    //
-    query->status = &QD_AMQP_OK;
-
-    //
-    // If the offset goes beyond the set of objects, end the query now.
-    //
-    if (offset >= DEQ_SIZE(core->provisioned)) {
-        query->more = false;
-        qdr_agent_enqueue_response_CT(core, query);
-        return;
-    }
-
-    //
-    // Run to the object at the offset.
-    //
-    qdr_provisioned_t *prov = DEQ_HEAD(core->provisioned);
-    for (int i = 0; i < offset && prov; i++)
-        prov = DEQ_NEXT(prov);
-    assert(prov);
-
-    //
-    // Write the columns of the object into the response body.
-    //
-    qdr_agent_write_prov_CT(query, prov);
-
-    //
-    // Advance to the next address
-    //
-    query->next_offset = offset;
-    qdr_manage_advance_prov_CT(query, prov);
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-void qdra_provisioned_get_next_CT(qdr_core_t *core, qdr_query_t *query)
-{
-    qdr_provisioned_t *prov = 0;
-
-        if (query->next_offset < DEQ_SIZE(core->provisioned)) {
-            prov = DEQ_HEAD(core->provisioned);
-            for (int i = 0; i < query->next_offset && prov; i++)
-                prov = DEQ_NEXT(prov);
-        }
-
-    if (prov) {
-        //
-        // Write the columns of the provisioned entity into the response body.
-        //
-        qdr_agent_write_prov_CT(query, prov);
-
-        //
-        // Advance to the next object
-        //
-        qdr_manage_advance_prov_CT(query, prov);
-    } else
-        query->more = false;
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
-{
-    if (field) {
-        qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
-    }
-    return QD_SEMANTICS_ANYCAST_BALANCED;
-}
-
-
-static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_semantics_t semantics)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_config_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = new_qdr_address_config_t();
-    DEQ_ITEM_INIT(addr);
-    addr->semantics = semantics;
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addr_config, addr);
-    }
-
-    return addr;
-}
-
-
-static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_semantics_t semantics)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = qdr_address_CT(core, semantics);
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addrs, addr);
-    }
-
-    return addr;
-}
-
-
-void qdra_provisioned_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
-                                qdr_query_t *query, qd_parsed_field_t *in_body)
-{
-    // TODO - reject duplicate names
-
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_OBJECT_TYPE]);
-        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_ADDRESS]);
-        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_CONNECTOR]);
-        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_SEMANTICS]);
-        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_INGRESS_ADDRESS]);
-        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_INGRESS_SEMANTICS]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_EGRESS_SEMANTICS]);
-
-        bool still_good = true;
-        qdr_provisioned_t *prov = new_qdr_provisioned_t();
-        ZERO(prov);
-
-        prov->identity = qdr_identifier(core);
-        if (name)
-            prov->name = (char*) qd_field_iterator_copy(name);
-
-        if (!type_field)
-            prov->object_type = QDR_PROV_TYPE_ADDRESS;
-        else {
-            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
-            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
-                prov->object_type = QDR_PROV_TYPE_ADDRESS;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
-                prov->object_type = QDR_PROV_TYPE_LINK_DEST;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
-                prov->object_type = QDR_PROV_TYPE_WAYPOINT;
-            else
-                still_good = false;
-        }
-
-        prov->semantics = qdra_semantics(sem_field);
-
-        prov->direction_in  = true;
-        prov->direction_out = true;
-        if (dir_field) {
-            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
-                prov->direction_out = false;
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
-                prov->direction_in = false;
-        }
-
-        if (conn_field) {
-            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
-            prov->connector_label = (char*) qd_field_iterator_copy(conn_iter);
-        }
-
-        switch (prov->object_type) {
-        case QDR_PROV_TYPE_ADDRESS:
-            prov->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', prov->semantics);
-            break;
-
-        case QDR_PROV_TYPE_LINK_DEST:
-            if (prov->direction_in)
-                prov->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', prov->semantics);
-            if (prov->direction_out)
-                prov->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', prov->semantics);
-            break;
-
-        case QDR_PROV_TYPE_WAYPOINT:
-            break;
-        }
-
-        if (still_good) {
-            // TODO - write response map
-            query->status = &QD_AMQP_CREATED;
-            DEQ_INSERT_TAIL(core->provisioned, prov);
-        } else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-            if (prov->name)
-                free(prov->name);
-            free_qdr_provisioned_t(prov);
-        }
-    }
-    else
-        query->status = &QD_AMQP_BAD_REQUEST;
-
-    //
-    // Enqueue the response.
-    //
-    if (query->body)
-        qdr_agent_enqueue_response_CT(core, query);
-    else
-        free_qdr_query_t(query);
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_provisioned.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_provisioned.h b/src/router_core/agent_provisioned.h
deleted file mode 100644
index f97ec24..0000000
--- a/src/router_core/agent_provisioned.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef qdr_agent_provisioned
-#define qdr_agent_provisioned 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "router_core_private.h"
-
-void qdra_provisioned_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
-void qdra_provisioned_get_next_CT(qdr_core_t *core, qdr_query_t *query);
-void qdra_provisioned_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_provisioned_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_provisioned_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
-                                qd_field_iterator_t *identity);
-
-#define QDR_PROVISIONED_COLUMN_COUNT 12
-
-const char *qdr_provisioned_columns[QDR_PROVISIONED_COLUMN_COUNT + 1];
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
new file mode 100644
index 0000000..3cd9af5
--- /dev/null
+++ b/src/router_core/agent_route.c
@@ -0,0 +1,344 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "agent_link.h"
+#include <stdio.h>
+
+#define QDR_ROUTE_NAME               0
+#define QDR_ROUTE_IDENTITY           1
+#define QDR_ROUTE_TYPE               2
+#define QDR_ROUTE_OBJECT_TYPE        3
+#define QDR_ROUTE_ADDRESS            4
+#define QDR_ROUTE_CONNECTOR          5
+#define QDR_ROUTE_DIRECTION          6
+#define QDR_ROUTE_SEMANTICS          7
+#define QDR_ROUTE_INGRESS_ADDRESS    8
+#define QDR_ROUTE_EGRESS_ADDRESS     9
+#define QDR_ROUTE_INGRESS_SEMANTICS  10
+#define QDR_ROUTE_EGRESS_SEMANTICS   11
+
+const char *qdr_route_columns[] =
+    {"name",
+     "identity",
+     "type",
+     "objectType",
+     "address",
+     "connector",
+     "direction",
+     "semantics",
+     "ingressAddress",
+     "egressAddress",
+     "ingressSemantics",
+     "egressSemantics",
+     0};
+
+
+static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_field_t *body, bool as_map)
+{
+    if (as_map)
+        qd_compose_insert_string(body, qdr_route_columns[col]);
+
+    switch(col) {
+    case QDR_ROUTE_NAME:
+        if (route->name) {
+            qd_compose_insert_string(body, route->name);
+            break;
+        }
+        // else fall into IDENTITY
+
+    case QDR_ROUTE_IDENTITY:
+
+    case QDR_ROUTE_TYPE:
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.route");
+        break;
+
+    case QDR_ROUTE_OBJECT_TYPE:
+    case QDR_ROUTE_ADDRESS:
+    case QDR_ROUTE_CONNECTOR:
+    case QDR_ROUTE_DIRECTION:
+    case QDR_ROUTE_SEMANTICS:
+    case QDR_ROUTE_INGRESS_ADDRESS:
+    case QDR_ROUTE_EGRESS_ADDRESS:
+    case QDR_ROUTE_INGRESS_SEMANTICS:
+    case QDR_ROUTE_EGRESS_SEMANTICS:
+    default:
+        qd_compose_insert_null(body);
+        break;
+    }
+}
+
+
+static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_route_insert_column_CT(route, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_t *route)
+{
+    query->next_offset++;
+    route = DEQ_NEXT(route);
+    query->more = !!route;
+}
+
+
+void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = &QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->routes)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_route_t *route = DEQ_HEAD(core->routes);
+    for (int i = 0; i < offset && route; i++)
+        route = DEQ_NEXT(route);
+    assert(route);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_route_CT(query, route);
+
+    //
+    // Advance to the next address
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_route_CT(query, route);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_route_t *route = 0;
+
+        if (query->next_offset < DEQ_SIZE(core->routes)) {
+            route = DEQ_HEAD(core->routes);
+            for (int i = 0; i < query->next_offset && route; i++)
+                route = DEQ_NEXT(route);
+        }
+
+    if (route) {
+        //
+        // Write the columns of the route entity into the response body.
+        //
+        qdr_agent_write_route_CT(query, route);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_route_CT(query, route);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
+    }
+    return QD_SEMANTICS_ANYCAST_BALANCED;
+}
+
+
+static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
+                                                              qd_address_semantics_t semantics)
+{
+    if (!addr_field)
+        return 0;
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_config_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr) {
+        // Log error TODO
+        return 0;
+    }
+
+    addr = new_qdr_address_config_t();
+    DEQ_ITEM_INIT(addr);
+    addr->semantics = semantics;
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addr_config, addr);
+    }
+
+    return addr;
+}
+
+
+static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
+                                                qd_address_semantics_t semantics)
+{
+    if (!addr_field)
+        return 0;
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr) {
+        // Log error TODO
+        return 0;
+    }
+
+    addr = qdr_address_CT(core, semantics);
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addrs, addr);
+    }
+
+    return addr;
+}
+
+
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
+                          qdr_query_t *query, qd_parsed_field_t *in_body)
+{
+    // TODO - reject duplicate names
+
+    if (qd_parse_is_map(in_body)) {
+        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_OBJECT_TYPE]);
+        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
+        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
+        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
+        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_SEMANTICS]);
+        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
+        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
+        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_SEMANTICS]);
+        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_SEMANTICS]);
+
+        bool still_good = true;
+        qdr_route_t *route = new_qdr_route_t();
+        ZERO(route);
+
+        route->identity = qdr_identifier(core);
+        if (name)
+            route->name = (char*) qd_field_iterator_copy(name);
+
+        if (!type_field)
+            route->object_type = QDR_ROUTE_TYPE_ADDRESS;
+        else {
+            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
+            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
+                route->object_type = QDR_ROUTE_TYPE_ADDRESS;
+            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
+                route->object_type = QDR_ROUTE_TYPE_LINK_DEST;
+            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
+                route->object_type = QDR_ROUTE_TYPE_WAYPOINT;
+            else
+                still_good = false;
+        }
+
+        route->semantics = qdra_semantics(sem_field);
+
+        route->direction_in  = true;
+        route->direction_out = true;
+        if (dir_field) {
+            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
+            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
+                route->direction_out = false;
+            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
+                route->direction_in = false;
+        }
+
+        if (conn_field) {
+            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
+            route->connector_label = (char*) qd_field_iterator_copy(conn_iter);
+        }
+
+        switch (route->object_type) {
+        case QDR_ROUTE_TYPE_ADDRESS:
+            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->semantics);
+            break;
+
+        case QDR_ROUTE_TYPE_LINK_DEST:
+            if (route->direction_in)
+                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->semantics);
+            if (route->direction_out)
+                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->semantics);
+            break;
+
+        case QDR_ROUTE_TYPE_WAYPOINT:
+            break;
+        }
+
+        if (still_good) {
+            // TODO - write response map
+            query->status = &QD_AMQP_CREATED;
+            DEQ_INSERT_TAIL(core->routes, route);
+        } else {
+            query->status = &QD_AMQP_BAD_REQUEST;
+            if (route->name)
+                free(route->name);
+            free_qdr_route_t(route);
+        }
+    }
+    else
+        query->status = &QD_AMQP_BAD_REQUEST;
+
+    //
+    // Enqueue the response.
+    //
+    if (query->body)
+        qdr_agent_enqueue_response_CT(core, query);
+    else
+        free_qdr_query_t(query);
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.h b/src/router_core/agent_route.h
new file mode 100644
index 0000000..86ec69c
--- /dev/null
+++ b/src/router_core/agent_route.h
@@ -0,0 +1,35 @@
+#ifndef qdr_agent_route
+#define qdr_agent_route 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
+void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
+                                qd_field_iterator_t *identity);
+
+#define QDR_ROUTE_COLUMN_COUNT 12
+
+const char *qdr_route_columns[QDR_ROUTE_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 76d25bc..e8823b4 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -39,7 +39,7 @@ const char *identity_key = "identity";
 const char *operation_type_key = "operation";
 const char *attribute_names_key = "attributeNames";
 
-const unsigned char *provisioned_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.provisioned";
+const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.route";
 const unsigned char *waypoint_entity_type = (unsigned char*) "org.apache.qpid.dispatch.waypoint";
 const unsigned char *address_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.address";
 const unsigned char *link_entity_type    = (unsigned char*) "org.apache.qpid.dispatch.router.link";
@@ -358,8 +358,8 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         *entity_type = QD_ROUTER_LINK;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), waypoint_entity_type))
         *entity_type = QD_ROUTER_WAYPOINT;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), provisioned_entity_type))
-        *entity_type = QD_ROUTER_PROVISIONED;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), route_entity_type))
+        *entity_type = QD_ROUTER_ROUTE;
     else
         return false;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index e6fe86c..82f3408 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,7 +30,7 @@ ALLOC_DEFINE(qdr_link_t);
 ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
-ALLOC_DEFINE(qdr_provisioned_t);
+ALLOC_DEFINE(qdr_route_t);
 
 static void qdr_general_handler(void *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/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 e8d1508..c6307d3 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -33,7 +33,7 @@ typedef struct qdr_link_ref_t        qdr_link_ref_t;
 typedef struct qdr_lrp_t             qdr_lrp_t;
 typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
-typedef struct qdr_provisioned_t     qdr_provisioned_t;
+typedef struct qdr_route_t           qdr_route_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
@@ -398,16 +398,16 @@ ALLOC_DECLARE(qdr_connection_t);
 DEQ_DECLARE(qdr_connection_t, qdr_connection_list_t);
 
 typedef enum {
-    QDR_PROV_TYPE_ADDRESS,
-    QDR_PROV_TYPE_LINK_DEST,
-    QDR_PROV_TYPE_WAYPOINT
-} qdr_provisioned_type_t;
+    QDR_ROUTE_TYPE_ADDRESS,
+    QDR_ROUTE_TYPE_LINK_DEST,
+    QDR_ROUTE_TYPE_WAYPOINT
+} qdr_route_type_t;
 
-struct qdr_provisioned_t {
-    DEQ_LINKS(qdr_provisioned_t);
+struct qdr_route_t {
+    DEQ_LINKS(qdr_route_t);
     char                   *name;
     uint64_t                identity;
-    qdr_provisioned_type_t  object_type;
+    qdr_route_type_t        object_type;
     qdr_address_config_t   *addr_config;
     qdr_address_t          *addr;
     qdr_address_t          *ingress_addr;
@@ -420,8 +420,8 @@ struct qdr_provisioned_t {
     char                   *connector_label;
 };
 
-ALLOC_DECLARE(qdr_provisioned_t);
-DEQ_DECLARE(qdr_provisioned_t, qdr_provisioned_list_t);
+ALLOC_DECLARE(qdr_route_t);
+DEQ_DECLARE(qdr_route_t, qdr_route_list_t);
 
 
 struct qdr_core_t {
@@ -437,7 +437,7 @@ struct qdr_core_t {
     qdr_general_work_list_t  work_list;
     qd_timer_t              *work_timer;
 
-    qdr_provisioned_list_t provisioned;
+    qdr_route_list_t      routes;
 
     qdr_connection_list_t open_connections;
     qdr_link_list_t       open_links;


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


[13/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added connectors and containers lists to the agent for "route".

Posted by tr...@apache.org.
DISPATCH-179 - Added connectors and containers lists to the agent for "route".


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

Branch: refs/heads/master
Commit: f970827921fd3a367d6358f3bb2d2387df0d08c1
Parents: 0d603e1
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 4 15:23:48 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 4 15:23:48 2016 -0500

----------------------------------------------------------------------
 src/router_core/agent_route.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f9708279/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index 97e70cf..2373624 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -47,6 +47,8 @@ const char *qdr_route_columns[] =
 static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_composed_field_t *body, bool as_map)
 {
     const char *text = 0;
+    qdr_route_active_t *active;
+    const char         *key;
 
     if (as_map)
         qd_compose_insert_string(body, qdr_route_columns[col]);
@@ -99,7 +101,29 @@ static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_co
         break;
 
     case QDR_ROUTE_CONNECTORS:
+        qd_compose_start_list(body);
+        active = DEQ_HEAD(route->active_list);
+        while(active) {
+            key = (const char*) qd_hash_key_by_handle(active->conn_id->hash_handle);
+            if (key && key[0] == 'L')
+                qd_compose_insert_string(body, &key[1]);
+            active = DEQ_NEXT(active);
+        }
+        qd_compose_end_list(body);
+        break;
+
     case QDR_ROUTE_CONTAINERS:
+        qd_compose_start_list(body);
+        active = DEQ_HEAD(route->active_list);
+        while(active) {
+            key = (const char*) qd_hash_key_by_handle(active->conn_id->hash_handle);
+            if (key && key[0] == 'C')
+                qd_compose_insert_string(body, &key[1]);
+            active = DEQ_NEXT(active);
+        }
+        qd_compose_end_list(body);
+        break;
+
     case QDR_ROUTE_ROUTE_ADDRESS:
         qd_compose_insert_null(body);
         break;


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


[02/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Bulk rename of "semantics" -> "treatment"

Posted by tr...@apache.org.
DISPATCH-179 - Bulk rename of "semantics" -> "treatment"


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

Branch: refs/heads/master
Commit: 1dffeb6a7e3e6139d56fb88f7c34abfbff9c7635
Parents: 43e3a49
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Feb 29 11:45:44 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Feb 29 11:45:44 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router.h                  | 20 ++++----
 include/qpid/dispatch/router_core.h             |  2 +-
 python/qpid_dispatch/management/qdrouter.json   |  6 +--
 .../qpid_dispatch_internal/management/agent.py  |  4 +-
 python/qpid_dispatch_internal/router/engine.py  | 12 ++---
 src/python_embedded.c                           | 14 +++---
 src/router_config.c                             |  2 +-
 src/router_core/DESIGN                          |  4 +-
 src/router_core/agent_address.c                 | 18 +++----
 src/router_core/agent_route.c                   | 50 ++++++++++----------
 src/router_core/connections.c                   |  8 ++--
 src/router_core/forwarder.c                     | 16 +++----
 src/router_core/route_tables.c                  | 20 ++++----
 src/router_core/router_core.c                   | 14 +++---
 src/router_core/router_core_private.h           | 20 ++++----
 src/router_forwarders.c                         | 16 +++----
 tools/qdstat                                    | 12 ++---
 17 files changed, 119 insertions(+), 119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/include/qpid/dispatch/router.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router.h b/include/qpid/dispatch/router.h
index 499e808..f050775 100644
--- a/include/qpid/dispatch/router.h
+++ b/include/qpid/dispatch/router.h
@@ -37,12 +37,12 @@ typedef struct qd_address_t qd_address_t;
 typedef struct qd_router_delivery_t qd_router_delivery_t;
 
 typedef enum {
-    QD_SEMANTICS_MULTICAST_FLOOD  = 0,
-    QD_SEMANTICS_MULTICAST_ONCE   = 1,
-    QD_SEMANTICS_ANYCAST_CLOSEST  = 2,
-    QD_SEMANTICS_ANYCAST_BALANCED = 3,
-    QD_SEMANTICS_LINK_BALANCED    = 4
-} qd_address_semantics_t;
+    QD_TREATMENT_MULTICAST_FLOOD  = 0,
+    QD_TREATMENT_MULTICAST_ONCE   = 1,
+    QD_TREATMENT_ANYCAST_CLOSEST  = 2,
+    QD_TREATMENT_ANYCAST_BALANCED = 3,
+    QD_TREATMENT_LINK_BALANCED    = 4
+} qd_address_treatment_t;
 
 #include <qpid/dispatch/router_core.h>
 
@@ -96,17 +96,17 @@ qdr_core_t *qd_router_core(qd_dispatch_t *qd);
  * @param on_message Optional callback to be called when a message is received
  * for the address.
  * @param context Context to be passed to the on_message handler.
- * @param semantics Semantics for the address.
+ * @param treatment Treatment for the address.
  * @param global True if the address is global.
  * @param forwarder Optional custom forwarder to use when a message is received
- * for the address.  If null, a default forwarder based on the semantics will
+ * for the address.  If null, a default forwarder based on the treatment will
  * be used.
  */
 qd_address_t *qd_router_register_address(qd_dispatch_t          *qd,
                                          const char             *address,
                                          qd_router_message_cb_t  on_message,
                                          void                   *context,
-                                         qd_address_semantics_t  semantics,
+                                         qd_address_treatment_t  treatment,
                                          bool                    global,
                                          qd_router_forwarder_t  *forwarder);
 
@@ -134,7 +134,7 @@ void qd_router_build_node_list(qd_dispatch_t *qd, qd_composed_field_t *field);
 const char* qd_address_logstr(qd_address_t* address);
 
 /** Retrieve the proper forwarder for a given semantic */
-qd_router_forwarder_t *qd_router_get_forwarder(qd_address_semantics_t s);
+qd_router_forwarder_t *qd_router_get_forwarder(qd_address_treatment_t t);
 
 ///@}
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 602e67c..b38022f 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -94,7 +94,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
                                        const char             *address,
                                        char                    aclass,
                                        char                    phase,
-                                       qd_address_semantics_t  semantics,
+                                       qd_address_treatment_t  treatment,
                                        qdr_receive_t           on_message,
                                        void                   *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index dec2d82..e1ee1b7 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -732,7 +732,7 @@
         },
 
         "fixedAddress": {
-            "description":"(DEPRECATED) Establishes semantics for addresses starting with a prefix.",
+            "description":"(DEPRECATED) Establishes treatment for addresses starting with a prefix.",
             "extends": "configurationEntity",
             "operations": ["CREATE"],
             "attributes": {
@@ -928,9 +928,9 @@
             "description": "AMQP address managed by the router.",
             "extends": "operationalEntity",
             "attributes": {
-                "semantics": {
+                "treatment": {
                     "type": ["flood", "multi", "anyClosest", "anyBalanced", "linkBalanced"],
-                    "description": "Forwarding semantics for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
+                    "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
                 },
                 "inProcess": {
                     "type": "integer",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/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 4d75f8b..886157d 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -73,7 +73,7 @@ from cProfile import Profile
 from cStringIO import StringIO
 from ctypes import c_void_p, py_object, c_long
 from subprocess import Popen
-from ..dispatch import IoAdapter, LogAdapter, LOG_INFO, LOG_DEBUG, LOG_ERROR, SEMANTICS_ANYCAST_CLOSEST
+from ..dispatch import IoAdapter, LogAdapter, LOG_INFO, LOG_DEBUG, LOG_ERROR, TREATMENT_ANYCAST_CLOSEST
 from qpid_dispatch.management.error import ManagementError, OK, CREATED, NO_CONTENT, STATUS_TEXT, \
     BadRequestStatus, InternalServerErrorStatus, NotImplementedStatus, NotFoundStatus
 from qpid_dispatch.management.entity import camelcase
@@ -603,7 +603,7 @@ class Agent(object):
         """Register the management address to receive management requests"""
         self.entities.refresh_from_c()
         self.log(LOG_INFO, "Activating management agent on %s" % address)
-        self.io = IoAdapter(self.receive, address, 'L', '0', SEMANTICS_ANYCAST_CLOSEST)
+        self.io = IoAdapter(self.receive, address, 'L', '0', TREATMENT_ANYCAST_CLOSEST)
 
     def entity_class(self, entity_type):
         """Return the class that implements entity_type"""

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/python/qpid_dispatch_internal/router/engine.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/router/engine.py b/python/qpid_dispatch_internal/router/engine.py
index b3fa1a1..8905bac 100644
--- a/python/qpid_dispatch_internal/router/engine.py
+++ b/python/qpid_dispatch_internal/router/engine.py
@@ -33,7 +33,7 @@ import time
 ## (i.e. we are in a test bench, etc.), load the stub versions.
 ##
 from ..dispatch import IoAdapter, LogAdapter, LOG_TRACE, LOG_INFO, LOG_ERROR, LOG_STACK_LIMIT
-from ..dispatch import SEMANTICS_MULTICAST_FLOOD, SEMANTICS_MULTICAST_ONCE
+from ..dispatch import TREATMENT_MULTICAST_FLOOD, TREATMENT_MULTICAST_ONCE
 
 class RouterEngine:
     """
@@ -53,11 +53,11 @@ class RouterEngine:
         self._log_ls        = LogAdapter("ROUTER_LS")
         self._log_ma        = LogAdapter("ROUTER_MA")
         self._log_general   = LogAdapter("ROUTER")
-        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', SEMANTICS_MULTICAST_FLOOD),
-                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', SEMANTICS_MULTICAST_ONCE),
-                               IoAdapter(self.receive, "qdrouter",    'T', '0', SEMANTICS_MULTICAST_FLOOD),
-                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', SEMANTICS_MULTICAST_ONCE),
-                               IoAdapter(self.receive, "qdhello",     'L', '0', SEMANTICS_MULTICAST_FLOOD)]
+        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', TREATMENT_MULTICAST_FLOOD),
+                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', TREATMENT_MULTICAST_ONCE),
+                               IoAdapter(self.receive, "qdrouter",    'T', '0', TREATMENT_MULTICAST_FLOOD),
+                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', TREATMENT_MULTICAST_ONCE),
+                               IoAdapter(self.receive, "qdhello",     'L', '0', TREATMENT_MULTICAST_FLOOD)]
         self.max_routers    = max_routers
         self.id             = router_id
         self.instance       = long(time.time())

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/python_embedded.c
----------------------------------------------------------------------
diff --git a/src/python_embedded.c b/src/python_embedded.c
index 669288a..d9b8069 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -527,8 +527,8 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
     PyObject *addr;
     char aclass    = 'L';
     char phase     = '0';
-    int  semantics = QD_SEMANTICS_ANYCAST_BALANCED;
-    if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &semantics))
+    int  treatment = QD_TREATMENT_ANYCAST_BALANCED;
+    if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &treatment))
         return -1;
     if (!PyCallable_Check(self->handler)) {
         PyErr_SetString(PyExc_TypeError, "IoAdapter.__init__ handler is not callable");
@@ -540,7 +540,7 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
     const char *address = PyString_AsString(addr);
     if (!address) return -1;
     qd_error_clear();
-    self->sub = qdr_core_subscribe(self->core, address, aclass, phase, semantics, qd_io_rx_handler, self);
+    self->sub = qdr_core_subscribe(self->core, address, aclass, phase, treatment, qd_io_rx_handler, self);
     if (qd_error_code()) {
         PyErr_SetString(PyExc_RuntimeError, qd_error_message());
         return -1;
@@ -732,10 +732,10 @@ static void qd_python_setup(void)
         Py_INCREF(ioaType);
         PyModule_AddObject(m, "IoAdapter", (PyObject*) &IoAdapterType);
 
-        qd_register_constant(m, "SEMANTICS_MULTICAST_FLOOD",  QD_SEMANTICS_MULTICAST_FLOOD);
-        qd_register_constant(m, "SEMANTICS_MULTICAST_ONCE",   QD_SEMANTICS_MULTICAST_ONCE);
-        qd_register_constant(m, "SEMANTICS_ANYCAST_CLOSEST",  QD_SEMANTICS_ANYCAST_CLOSEST);
-        qd_register_constant(m, "SEMANTICS_ANYCAST_BALANCED", QD_SEMANTICS_ANYCAST_BALANCED);
+        qd_register_constant(m, "TREATMENT_MULTICAST_FLOOD",  QD_TREATMENT_MULTICAST_FLOOD);
+        qd_register_constant(m, "TREATMENT_MULTICAST_ONCE",   QD_TREATMENT_MULTICAST_ONCE);
+        qd_register_constant(m, "TREATMENT_ANYCAST_CLOSEST",  QD_TREATMENT_ANYCAST_CLOSEST);
+        qd_register_constant(m, "TREATMENT_ANYCAST_BALANCED", QD_TREATMENT_ANYCAST_BALANCED);
 
         Py_INCREF(m);
         dispatch_module = m;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 40453fd..8039efe 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -49,7 +49,7 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     }
 
     //
-    // Convert fanout + bias to semantics
+    // Convert fanout + bias to treatment
     //
     const char *trt;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index 5197a2f..dde7cb4 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -179,10 +179,10 @@ Core APIs
 
 
 ====================
-Forwarding Semantics
+Forwarding Treatment
 ====================
 
-  Transition from fanout/bias to a one-dimensional list of semantics:
+  Transition from fanout/bias to a one-dimensional list of treatment:
 
     MULTICAST_FLOOD
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index 0256593..bc008ff 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -24,7 +24,7 @@
 #define QDR_ADDRESS_IDENTITY                  1
 #define QDR_ADDRESS_TYPE                      2
 #define QDR_ADDRESS_KEY                       3
-#define QDR_ADDRESS_SEMANTICS                 4
+#define QDR_ADDRESS_TREATMENT                 4
 #define QDR_ADDRESS_IN_PROCESS                5
 #define QDR_ADDRESS_SUBSCRIBER_COUNT          6
 #define QDR_ADDRESS_REMOTE_COUNT              7
@@ -40,7 +40,7 @@ const char *qdr_address_columns[] =
      "identity",
      "type",
      "key",
-     "semantics",
+     "treatment",
      "inProcess",
      "subscriberCount",
      "remoteCount",
@@ -71,13 +71,13 @@ static void qdr_insert_address_columns_CT(qdr_address_t        *addr,
         qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.address");
         break;
 
-    case QDR_ADDRESS_SEMANTICS: {
-        switch (addr->semantics) {
-        case QD_SEMANTICS_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");       break;
-        case QD_SEMANTICS_MULTICAST_ONCE:   qd_compose_insert_string(body, "multi");       break;
-        case QD_SEMANTICS_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "anyClosest");  break;
-        case QD_SEMANTICS_ANYCAST_BALANCED: qd_compose_insert_string(body, "anyBalanced"); break;
-        case QD_SEMANTICS_LINK_BALANCED:    qd_compose_insert_string(body, "linkBalanced"); break;
+    case QDR_ADDRESS_TREATMENT: {
+        switch (addr->treatment) {
+        case QD_TREATMENT_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");       break;
+        case QD_TREATMENT_MULTICAST_ONCE:   qd_compose_insert_string(body, "multi");       break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "anyClosest");  break;
+        case QD_TREATMENT_ANYCAST_BALANCED: qd_compose_insert_string(body, "anyBalanced"); break;
+        case QD_TREATMENT_LINK_BALANCED:    qd_compose_insert_string(body, "linkBalanced"); break;
         }
         break;
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index 3cd9af5..af042cd 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -27,11 +27,11 @@
 #define QDR_ROUTE_ADDRESS            4
 #define QDR_ROUTE_CONNECTOR          5
 #define QDR_ROUTE_DIRECTION          6
-#define QDR_ROUTE_SEMANTICS          7
+#define QDR_ROUTE_TREATMENT          7
 #define QDR_ROUTE_INGRESS_ADDRESS    8
 #define QDR_ROUTE_EGRESS_ADDRESS     9
-#define QDR_ROUTE_INGRESS_SEMANTICS  10
-#define QDR_ROUTE_EGRESS_SEMANTICS   11
+#define QDR_ROUTE_INGRESS_TREATMENT  10
+#define QDR_ROUTE_EGRESS_TREATMENT   11
 
 const char *qdr_route_columns[] =
     {"name",
@@ -41,11 +41,11 @@ const char *qdr_route_columns[] =
      "address",
      "connector",
      "direction",
-     "semantics",
+     "treatment",
      "ingressAddress",
      "egressAddress",
-     "ingressSemantics",
-     "egressSemantics",
+     "ingressTreatment",
+     "egressTreatment",
      0};
 
 
@@ -72,11 +72,11 @@ static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_
     case QDR_ROUTE_ADDRESS:
     case QDR_ROUTE_CONNECTOR:
     case QDR_ROUTE_DIRECTION:
-    case QDR_ROUTE_SEMANTICS:
+    case QDR_ROUTE_TREATMENT:
     case QDR_ROUTE_INGRESS_ADDRESS:
     case QDR_ROUTE_EGRESS_ADDRESS:
-    case QDR_ROUTE_INGRESS_SEMANTICS:
-    case QDR_ROUTE_EGRESS_SEMANTICS:
+    case QDR_ROUTE_INGRESS_TREATMENT:
+    case QDR_ROUTE_EGRESS_TREATMENT:
     default:
         qd_compose_insert_null(body);
         break;
@@ -177,20 +177,20 @@ void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
 }
 
 
-static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
+static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
 {
     if (field) {
         qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_TREATMENT_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_TREATMENT_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_TREATMENT_ANYCAST_BALANCED;
     }
-    return QD_SEMANTICS_ANYCAST_BALANCED;
+    return QD_TREATMENT_ANYCAST_BALANCED;
 }
 
 
 static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_semantics_t semantics)
+                                                              qd_address_treatment_t treatment)
 {
     if (!addr_field)
         return 0;
@@ -208,7 +208,7 @@ static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core,
 
     addr = new_qdr_address_config_t();
     DEQ_ITEM_INIT(addr);
-    addr->semantics = semantics;
+    addr->treatment = treatment;
 
     if (!!addr) {
         qd_field_iterator_reset(iter);
@@ -221,7 +221,7 @@ static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core,
 
 
 static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_semantics_t semantics)
+                                                qd_address_treatment_t treatment)
 {
     if (!addr_field)
         return 0;
@@ -237,7 +237,7 @@ static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_fiel
         return 0;
     }
 
-    addr = qdr_address_CT(core, semantics);
+    addr = qdr_address_CT(core, treatment);
 
     if (!!addr) {
         qd_field_iterator_reset(iter);
@@ -259,11 +259,11 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
         qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
         qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
         qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_SEMANTICS]);
+        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
         //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
         //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_SEMANTICS]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_SEMANTICS]);
+        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_TREATMENT]);
+        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_TREATMENT]);
 
         bool still_good = true;
         qdr_route_t *route = new_qdr_route_t();
@@ -287,7 +287,7 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
                 still_good = false;
         }
 
-        route->semantics = qdra_semantics(sem_field);
+        route->treatment = qdra_treatment(sem_field);
 
         route->direction_in  = true;
         route->direction_out = true;
@@ -306,14 +306,14 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
 
         switch (route->object_type) {
         case QDR_ROUTE_TYPE_ADDRESS:
-            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->semantics);
+            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->treatment);
             break;
 
         case QDR_ROUTE_TYPE_LINK_DEST:
             if (route->direction_in)
-                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->semantics);
+                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->treatment);
             if (route->direction_out)
-                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->semantics);
+                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->treatment);
             break;
 
         case QDR_ROUTE_TYPE_WAYPOINT:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index ab9f545..40e2aaf 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -525,7 +525,7 @@ static char qdr_prefix_for_dir(qd_direction_t dir)
 }
 
 
-static qd_address_semantics_t qdr_semantics_for_address(qdr_core_t *core, qd_field_iterator_t *iter)
+static qd_address_treatment_t qdr_treatment_for_address(qdr_core_t *core, qd_field_iterator_t *iter)
 {
     qdr_address_config_t *addr = 0;
 
@@ -536,7 +536,7 @@ static qd_address_semantics_t qdr_semantics_for_address(qdr_core_t *core, qd_fie
     qd_address_iterator_override_prefix(iter, 'Z');
     qd_hash_retrieve_prefix(core->addr_hash, iter, (void**) &addr);
     qd_address_iterator_override_prefix(iter, '\0');
-    return addr ? addr->semantics : QD_SEMANTICS_ANYCAST_CLOSEST;
+    return addr ? addr->treatment : QD_TREATMENT_ANYCAST_CLOSEST;
 }
 
 
@@ -639,7 +639,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
             qd_field_iterator_t *temp_iter = qd_address_iterator_string(temp_addr, ITER_VIEW_ADDRESS_HASH);
             qd_hash_retrieve(core->addr_hash, temp_iter, (void**) &addr);
             if (!addr) {
-                addr = qdr_address_CT(core, QD_SEMANTICS_ANYCAST_CLOSEST);
+                addr = qdr_address_CT(core, QD_TREATMENT_ANYCAST_CLOSEST);
                 qd_hash_insert(core->addr_hash, temp_iter, addr, &addr->hash_handle);
                 DEQ_INSERT_TAIL(core->addrs, addr);
                 qdr_terminus_set_address(terminus, temp_addr);
@@ -675,7 +675,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
     qd_address_iterator_override_prefix(iter, '\0'); // Cancel previous override
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr && create_if_not_found) {
-        qd_address_semantics_t sem = qdr_semantics_for_address(core, iter);
+        qd_address_treatment_t sem = qdr_treatment_for_address(core, iter);
         addr = qdr_address_CT(core, sem);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index fc3f4c1..678fc5d 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -367,22 +367,22 @@ void qdr_forwarder_setup_CT(qdr_core_t *core)
     //
     // Create message forwarders
     //
-    core->forwarders[QD_SEMANTICS_MULTICAST_FLOOD]  = qdr_new_forwarder(qdr_forward_multicast_CT, 0, true);
-    core->forwarders[QD_SEMANTICS_MULTICAST_ONCE]   = qdr_new_forwarder(qdr_forward_multicast_CT, 0, false);
-    core->forwarders[QD_SEMANTICS_ANYCAST_CLOSEST]  = qdr_new_forwarder(qdr_forward_closest_CT,   0, false);
-    core->forwarders[QD_SEMANTICS_ANYCAST_BALANCED] = qdr_new_forwarder(qdr_forward_balanced_CT,  0, false);
+    core->forwarders[QD_TREATMENT_MULTICAST_FLOOD]  = qdr_new_forwarder(qdr_forward_multicast_CT, 0, true);
+    core->forwarders[QD_TREATMENT_MULTICAST_ONCE]   = qdr_new_forwarder(qdr_forward_multicast_CT, 0, false);
+    core->forwarders[QD_TREATMENT_ANYCAST_CLOSEST]  = qdr_new_forwarder(qdr_forward_closest_CT,   0, false);
+    core->forwarders[QD_TREATMENT_ANYCAST_BALANCED] = qdr_new_forwarder(qdr_forward_balanced_CT,  0, false);
 
     //
     // Create link forwarders
     //
-    core->forwarders[QD_SEMANTICS_LINK_BALANCED] = qdr_new_forwarder(0, qdr_forward_link_balanced_CT, false);
+    core->forwarders[QD_TREATMENT_LINK_BALANCED] = qdr_new_forwarder(0, qdr_forward_link_balanced_CT, false);
 }
 
 
-qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics)
+qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment)
 {
-    if (semantics <= QD_SEMANTICS_LINK_BALANCED)
-        return core->forwarders[semantics];
+    if (treatment <= QD_TREATMENT_LINK_BALANCED)
+        return core->forwarders[treatment];
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index cbd0a11..db139a9 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -131,7 +131,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
                                        const char             *address,
                                        char                    aclass,
                                        char                    phase,
-                                       qd_address_semantics_t  semantics,
+                                       qd_address_treatment_t  treatment,
                                        qdr_receive_t           on_message,
                                        void                   *context)
 {
@@ -146,7 +146,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
     action->args.io.address_class = aclass;
     action->args.io.address_phase = phase;
     action->args.io.subscription  = sub;
-    action->args.io.semantics     = semantics;
+    action->args.io.treatment     = treatment;
     qdr_action_enqueue(core, action);
 
     return sub;
@@ -174,11 +174,11 @@ void qdr_route_table_setup_CT(qdr_core_t *core)
     core->addr_hash = qd_hash(10, 32, 0);
 
     if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
-        core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_SEMANTICS_MULTICAST_FLOOD);
-        core->router_addr_L   = qdr_add_local_address_CT(core, 'L', "qdrouter",    QD_SEMANTICS_MULTICAST_FLOOD);
-        core->routerma_addr_L = qdr_add_local_address_CT(core, 'L', "qdrouter.ma", QD_SEMANTICS_MULTICAST_ONCE);
-        core->router_addr_T   = qdr_add_local_address_CT(core, 'T', "qdrouter",    QD_SEMANTICS_MULTICAST_FLOOD);
-        core->routerma_addr_T = qdr_add_local_address_CT(core, 'T', "qdrouter.ma", QD_SEMANTICS_MULTICAST_ONCE);
+        core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_TREATMENT_MULTICAST_FLOOD);
+        core->router_addr_L   = qdr_add_local_address_CT(core, 'L', "qdrouter",    QD_TREATMENT_MULTICAST_FLOOD);
+        core->routerma_addr_L = qdr_add_local_address_CT(core, 'L', "qdrouter.ma", QD_TREATMENT_MULTICAST_ONCE);
+        core->router_addr_T   = qdr_add_local_address_CT(core, 'T', "qdrouter",    QD_TREATMENT_MULTICAST_FLOOD);
+        core->routerma_addr_T = qdr_add_local_address_CT(core, 'T', "qdrouter.ma", QD_TREATMENT_MULTICAST_ONCE);
 
         core->neighbor_free_mask = qd_bitmask(1);
 
@@ -235,7 +235,7 @@ static void qdr_add_router_CT(qdr_core_t *core, qdr_action_t *action, bool disca
         // This record will be found whenever a "foreign" topological address to this
         // remote router is looked up.
         //
-        addr = qdr_address_CT(core, QD_SEMANTICS_ANYCAST_CLOSEST);
+        addr = qdr_address_CT(core, QD_TREATMENT_ANYCAST_CLOSEST);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
 
@@ -500,7 +500,7 @@ static void qdr_map_destination_CT(qdr_core_t *core, qdr_action_t *action, bool
 
         qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
         if (!addr) {
-            addr = qdr_address_CT(core, 0); // FIXME - Semantics
+            addr = qdr_address_CT(core, 0); // FIXME - Treatment
             qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
             DEQ_ITEM_INIT(addr);
             DEQ_INSERT_TAIL(core->addrs, addr);
@@ -586,7 +586,7 @@ static void qdr_subscribe_CT(qdr_core_t *core, qdr_action_t *action, bool discar
 
         qd_hash_retrieve(core->addr_hash, address->iterator, (void**) &addr);
         if (!addr) {
-            addr = qdr_address_CT(core, action->args.io.semantics);
+            addr = qdr_address_CT(core, action->args.io.treatment);
             qd_hash_insert(core->addr_hash, address->iterator, addr, &addr->hash_handle);
             DEQ_ITEM_INIT(addr);
             DEQ_INSERT_TAIL(core->addrs, addr);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 82f3408..d4a937d 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -76,10 +76,10 @@ qdr_core_t *qdr_core(qd_dispatch_t *qd, qd_router_mode_t mode, const char *area,
     // Perform outside-of-thread setup for the management agent
     //
     core->agent_subscription_mobile = qdr_core_subscribe(core, "$management", 'M', '0',
-                                                         QD_SEMANTICS_ANYCAST_CLOSEST,
+                                                         QD_TREATMENT_ANYCAST_CLOSEST,
                                                          qdr_management_agent_on_message, core);
     core->agent_subscription_local = qdr_core_subscribe(core, "$management", 'L', '0',
-                                                        QD_SEMANTICS_ANYCAST_CLOSEST,
+                                                        QD_TREATMENT_ANYCAST_CLOSEST,
                                                         qdr_management_agent_on_message, core);
 
     return core;
@@ -206,18 +206,18 @@ void qdr_action_enqueue(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_semantics_t semantics)
+qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_treatment_t treatment)
 {
     qdr_address_t *addr = new_qdr_address_t();
     ZERO(addr);
-    addr->semantics = semantics;
-    addr->forwarder = qdr_forwarder_CT(core, semantics);
+    addr->treatment = treatment;
+    addr->forwarder = qdr_forwarder_CT(core, treatment);
     addr->rnodes    = qd_bitmask(0);
     return addr;
 }
 
 
-qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_semantics_t semantics)
+qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_treatment_t treatment)
 {
     char                 addr_string[1000];
     qdr_address_t       *addr = 0;
@@ -228,7 +228,7 @@ qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const cha
 
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr) {
-        addr = qdr_address_CT(core, semantics);
+        addr = qdr_address_CT(core, treatment);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_ITEM_INIT(addr);
         DEQ_INSERT_TAIL(core->addrs, addr);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/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 c6307d3..8dc2fac 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -35,7 +35,7 @@ typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
 typedef struct qdr_route_t           qdr_route_t;
 
-qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics);
+qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
                            bool exclude_inprocess, bool control, qd_bitmask_t *link_exclusion);
 void qdr_forward_attach_CT(qdr_core_t *core, qdr_forwarder_t *forwarder, qdr_link_t *in_link);
@@ -110,7 +110,7 @@ struct qdr_action_t {
             qdr_field_t            *address;
             char                    address_class;
             char                    address_phase;
-            qd_address_semantics_t  semantics;
+            qd_address_treatment_t  treatment;
             qdr_subscription_t     *subscription;
             qd_message_t           *message;
             bool                    exclude_inprocess;
@@ -287,7 +287,7 @@ struct qdr_address_t {
     qdr_link_ref_list_t      inlinks;       ///< Locally-Connected Producers
     qd_bitmask_t            *rnodes;        ///< Bitmask of remote routers with connected consumers
     qd_hash_handle_t        *hash_handle;   ///< Linkage back to the hash table entry
-    qd_address_semantics_t   semantics;
+    qd_address_treatment_t   treatment;
     qdr_forwarder_t         *forwarder;
     bool                     toggle;
     bool                     waypoint;
@@ -307,8 +307,8 @@ struct qdr_address_t {
 ALLOC_DECLARE(qdr_address_t);
 DEQ_DECLARE(qdr_address_t, qdr_address_list_t);
 
-qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_semantics_t semantics);
-qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *addr, qd_address_semantics_t semantics);
+qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_treatment_t treatment);
+qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *addr, qd_address_treatment_t treatment);
 
 void qdr_add_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
 void qdr_del_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
@@ -316,7 +316,7 @@ void qdr_del_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
 struct qdr_address_config_t {
     DEQ_LINKS(qdr_address_config_t);
     qd_hash_handle_t       *hash_handle;
-    qd_address_semantics_t  semantics;
+    qd_address_treatment_t  treatment;
 };
 
 ALLOC_DECLARE(qdr_address_config_t);
@@ -414,9 +414,9 @@ struct qdr_route_t {
     qdr_address_t          *egress_addr;
     bool                    direction_in;
     bool                    direction_out;
-    qd_address_semantics_t  semantics;
-    qd_address_semantics_t  ingress_semantics;
-    qd_address_semantics_t  egress_semantics;
+    qd_address_treatment_t  treatment;
+    qd_address_treatment_t  ingress_treatment;
+    qd_address_treatment_t  egress_treatment;
     char                   *connector_label;
 };
 
@@ -498,7 +498,7 @@ struct qdr_core_t {
     uint64_t              next_identifier;
     sys_mutex_t          *id_lock;
 
-    qdr_forwarder_t      *forwarders[QD_SEMANTICS_LINK_BALANCED + 1];
+    qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
 };
 
 typedef enum {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_forwarders.c
----------------------------------------------------------------------
diff --git a/src/router_forwarders.c b/src/router_forwarders.c
index 5c6fe37..db686fe 100644
--- a/src/router_forwarders.c
+++ b/src/router_forwarders.c
@@ -19,7 +19,7 @@
 
 #include "dispatch_private.h"
 
-/** defines a default set of forwarding behaviors based on the semantics of an
+/** defines a default set of forwarding behaviors based on the treatment of an
  * address.
  */
 
@@ -51,7 +51,7 @@ static void forward_to_direct_subscribers_LH(qd_address_t *addr,
         //
         // If the fanout is single, exit the loop here.  We only want to send one message copy.
         //
-        if (QD_FANOUT(addr->semantics) == QD_FANOUT_SINGLE)
+        if (QD_FANOUT(addr->treatment) == QD_FANOUT_SINGLE)
             break;
 
         dest_link_ref = DEQ_NEXT(dest_link_ref);
@@ -83,7 +83,7 @@ static void forward_to_remote_subscribers_LH(qd_router_t *router,
     // candidate destination router.
     //
     int origin = -1;
-    if (ingress_iter && !(addr->semantics & QD_BYPASS_VALID_ORIGINS)) {
+    if (ingress_iter && !(addr->treatment & QD_BYPASS_VALID_ORIGINS)) {
         qd_address_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
         qd_address_t *origin_addr;
         qd_hash_retrieve(router->addr_hash, ingress_iter, (void*) &origin_addr);
@@ -257,22 +257,22 @@ static qd_router_forwarder_t anycast_balanced_forwarder = {
 };
 
 
-/** Get the proper default forwarder for an address of the given semantics:
+/** Get the proper default forwarder for an address of the given treatment:
  */
-qd_router_forwarder_t *qd_router_get_forwarder(qd_address_semantics_t semantics)
+qd_router_forwarder_t *qd_router_get_forwarder(qd_address_treatment_t treatment)
 {
-    switch (QD_FANOUT(semantics)) {
+    switch (QD_FANOUT(treatment)) {
     case QD_FANOUT_MULTIPLE:
         return &multicast_forwarder;
     case QD_FANOUT_SINGLE:
-        switch (QD_BIAS(semantics)) {
+        switch (QD_BIAS(treatment)) {
         case QD_BIAS_CLOSEST:
             return &anycast_closest_forwarder;
         case QD_BIAS_SPREAD:
             return &anycast_balanced_forwarder;
         }
     }
-    assert(false);  // invalid semantics? need new forwarder?
+    assert(false);  // invalid treatment? need new forwarder?
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index fc8b32c..fd941cf 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -187,14 +187,14 @@ class BusManager(Node):
             outlist.append(str(i))
         return outlist
 
-    def _sem_text(self, sem):
-        sem_map = {'flood'        : 'flood',
+    def _trt_text(self, trt):
+        trt_map = {'flood'        : 'flood',
                    'multi'        : 'multi',
                    'anyClosest'   : 'closest',
                    'anyBalanced'  : 'balanced',
                    'linkBalanced' : 'linkBalanced'}
-        if sem in sem_map:
-            return sem_map[sem]
+        if trt in trt_map:
+            return trt_map[trt]
         return '-'
 
     def displayGeneral(self):
@@ -289,7 +289,7 @@ class BusManager(Node):
         disp = Display(prefix="  ")
         heads = []
         heads.append(Header("addr"))
-        heads.append(Header("sem"))
+        heads.append(Header("treatment"))
         heads.append(Header("in-proc", Header.COMMAS))
         heads.append(Header("local", Header.COMMAS))
         heads.append(Header("remote", Header.COMMAS))
@@ -305,7 +305,7 @@ class BusManager(Node):
         for addr in objects:
             row = []
             row.append(self._addr_summary(addr.name))
-            row.append(self._sem_text(addr.semantics))
+            row.append(self._trt_text(addr.treatment))
             row.append(addr.inProcess)
             row.append(addr.subscriberCount)
             row.append(addr.remoteCount)


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


[45/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Renamed "treatment" to "distribution" in the model

Posted by tr...@apache.org.
DISPATCH-179 - Renamed "treatment" to "distribution" in the model


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

Branch: refs/heads/master
Commit: 7f66a61f3a0aa6f90189f27563c098bb6e2ccd8d
Parents: f0cb3ea
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 15:28:48 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 15:28:48 2016 -0400

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json |  2 +-
 src/router_core/agent_address.c               | 14 +++++++-------
 tools/qdstat                                  | 14 ++------------
 3 files changed, 10 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f66a61f/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index e7d59d3..ee5fe8b 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -1035,7 +1035,7 @@
             "description": "AMQP address managed by the router.",
             "extends": "operationalEntity",
             "attributes": {
-                "treatment": {
+                "distribution": {
                     "type": ["flood", "multicast", "closest", "balanced", "linkBalanced"],
                     "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
                 },

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f66a61f/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index c8a1b5d..ef8145c 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -24,7 +24,7 @@
 #define QDR_ADDRESS_IDENTITY                  1
 #define QDR_ADDRESS_TYPE                      2
 #define QDR_ADDRESS_KEY                       3
-#define QDR_ADDRESS_TREATMENT                 4
+#define QDR_ADDRESS_DISTRIBUTION              4
 #define QDR_ADDRESS_IN_PROCESS                5
 #define QDR_ADDRESS_SUBSCRIBER_COUNT          6
 #define QDR_ADDRESS_REMOTE_COUNT              7
@@ -41,7 +41,7 @@ const char *qdr_address_columns[] =
      "identity",
      "type",
      "key",
-     "treatment",
+     "distribution",
      "inProcess",
      "subscriberCount",
      "remoteCount",
@@ -73,12 +73,12 @@ static void qdr_insert_address_columns_CT(qdr_address_t        *addr,
         qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.address");
         break;
 
-    case QDR_ADDRESS_TREATMENT: {
+    case QDR_ADDRESS_DISTRIBUTION: {
         switch (addr->treatment) {
-        case QD_TREATMENT_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");       break;
-        case QD_TREATMENT_MULTICAST_ONCE:   qd_compose_insert_string(body, "multi");       break;
-        case QD_TREATMENT_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "anyClosest");  break;
-        case QD_TREATMENT_ANYCAST_BALANCED: qd_compose_insert_string(body, "anyBalanced"); break;
+        case QD_TREATMENT_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");        break;
+        case QD_TREATMENT_MULTICAST_ONCE:   qd_compose_insert_string(body, "multicast");    break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "closest");      break;
+        case QD_TREATMENT_ANYCAST_BALANCED: qd_compose_insert_string(body, "balanced");     break;
         case QD_TREATMENT_LINK_BALANCED:    qd_compose_insert_string(body, "linkBalanced"); break;
         }
         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f66a61f/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index 5218645..764dd72 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -187,16 +187,6 @@ class BusManager(Node):
             outlist.append(str(i))
         return outlist
 
-    def _trt_text(self, trt):
-        trt_map = {'flood'        : 'flood',
-                   'multi'        : 'multi',
-                   'anyClosest'   : 'closest',
-                   'anyBalanced'  : 'balanced',
-                   'linkBalanced' : 'linkBalanced'}
-        if trt in trt_map:
-            return trt_map[trt]
-        return '-'
-
     def displayGeneral(self):
         disp = Display(prefix="  ")
         heads = []
@@ -291,7 +281,7 @@ class BusManager(Node):
         disp = Display(prefix="  ")
         heads = []
         heads.append(Header("addr"))
-        heads.append(Header("treatment"))
+        heads.append(Header("distrib"))
         heads.append(Header("in-proc", Header.COMMAS))
         heads.append(Header("local", Header.COMMAS))
         heads.append(Header("remote", Header.COMMAS))
@@ -308,7 +298,7 @@ class BusManager(Node):
         for addr in objects:
             row = []
             row.append(self._addr_summary(addr.name))
-            row.append(self._trt_text(addr.treatment))
+            row.append(addr.distribution)
             row.append(addr.inProcess)
             row.append(addr.subscriberCount)
             row.append(addr.remoteCount)


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


[50/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Flush out the undelivered-list on incoming links when the address goes from zero to one reachable destinations.

Posted by tr...@apache.org.
DISPATCH-179 - Flush out the undelivered-list on incoming links when the address goes
from zero to one reachable destinations.


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

Branch: refs/heads/master
Commit: 326d09a89cc2663686326ab32554117ba0ee8aa1
Parents: 2291e5c
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 18:25:44 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 18:25:44 2016 -0400

----------------------------------------------------------------------
 src/router_core/forwarder.c           |  31 ++--
 src/router_core/router_core_private.h |   4 +-
 src/router_core/transfer.c            | 251 +++++++++++++++++------------
 3 files changed, 156 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/326d09a8/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 5f24a4b..02c0bb5 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -30,8 +30,7 @@ typedef int (*qdr_forward_message_t) (qdr_core_t      *core,
                                       qd_message_t    *msg,
                                       qdr_delivery_t  *in_delivery,
                                       bool             exclude_inprocess,
-                                      bool             control,
-                                      qd_bitmask_t    *link_exclusion);
+                                      bool             control);
 
 typedef bool (*qdr_forward_attach_t) (qdr_core_t     *core,
                                       qdr_address_t  *addr,
@@ -54,8 +53,7 @@ static int qdr_forward_message_null_CT(qdr_core_t      *core,
                                        qd_message_t    *msg,
                                        qdr_delivery_t  *in_delivery,
                                        bool             exclude_inprocess,
-                                       bool             control,
-                                       qd_bitmask_t    *link_exclusion)
+                                       bool             control)
 {
     qd_log(core->log, QD_LOG_CRITICAL, "NULL Message Forwarder Invoked");
     return 0;
@@ -137,8 +135,7 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
                              qd_message_t    *msg,
                              qdr_delivery_t  *in_delivery,
                              bool             exclude_inprocess,
-                             bool             control,
-                             qd_bitmask_t    *link_exclusion)
+                             bool             control)
 {
     bool bypass_valid_origins = addr->forwarder->bypass_valid_origins;
     int  fanout = 0;
@@ -222,7 +219,7 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
             dest_link = control ?
                 core->control_links_by_mask_bit[link_bit] :
                 core->data_links_by_mask_bit[link_bit];
-            if (dest_link && (!link_exclusion || qd_bitmask_value(link_exclusion, link_bit) == 0)) {
+            if (dest_link && (!in_delivery->link_exclusion || qd_bitmask_value(in_delivery->link_exclusion, link_bit) == 0)) {
                 qdr_delivery_t *out_delivery = qdr_forward_new_delivery_CT(core, in_delivery, dest_link, msg);
                 qdr_forward_deliver_CT(core, dest_link, out_delivery);
                 fanout++;
@@ -246,8 +243,6 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
         }
     }
 
-    if (link_exclusion)
-        qd_bitmask_free(link_exclusion);
     return fanout;
 }
 
@@ -257,19 +252,12 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
                            qd_message_t    *msg,
                            qdr_delivery_t  *in_delivery,
                            bool             exclude_inprocess,
-                           bool             control,
-                           qd_bitmask_t    *link_exclusion)
+                           bool             control)
 {
     qdr_link_t     *out_link;
     qdr_delivery_t *out_delivery;
 
     //
-    // The Anycast forwarders don't respect link exclusions.
-    //
-    if (link_exclusion)
-        qd_bitmask_free(link_exclusion);
-
-    //
     // Forward to an in-process subscriber if there is one.
     //
     if (!exclude_inprocess) {
@@ -360,10 +348,9 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
                             qd_message_t    *msg,
                             qdr_delivery_t  *in_delivery,
                             bool             exclude_inprocess,
-                            bool             control,
-                            qd_bitmask_t    *link_exclusion)
+                            bool             control)
 {
-    return qdr_forward_closest_CT(core, addr, msg, in_delivery, exclude_inprocess, control, link_exclusion);
+    return qdr_forward_closest_CT(core, addr, msg, in_delivery, exclude_inprocess, control);
 }
 
 
@@ -485,10 +472,10 @@ qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treat
 
 
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
-                           bool exclude_inprocess, bool control, qd_bitmask_t *link_exclusion)
+                           bool exclude_inprocess, bool control)
 {
     if (addr->forwarder)
-        return addr->forwarder->forward_message(core, addr, msg, in_delivery, exclude_inprocess, control, link_exclusion);
+        return addr->forwarder->forward_message(core, addr, msg, in_delivery, exclude_inprocess, control);
 
     // TODO - Deal with this delivery's disposition
     return 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/326d09a8/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 74eb8c1..458c93f 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -38,7 +38,7 @@ typedef struct qdr_connection_ref_t  qdr_connection_ref_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
-                           bool exclude_inprocess, bool control, qd_bitmask_t *link_exclusion);
+                           bool exclude_inprocess, bool control);
 bool qdr_forward_attach_CT(qdr_core_t *core, qdr_address_t *addr, qdr_link_t *in_link, qdr_terminus_t *source,
                            qdr_terminus_t *target);
 
@@ -93,7 +93,6 @@ struct qdr_action_t {
             qdr_terminus_t   *target;
             qdr_error_t      *error;
             qd_detach_type_t  dt;
-            qd_bitmask_t     *link_exclusion;
             int               credit;
             bool              drain;
         } connection;
@@ -193,6 +192,7 @@ struct qdr_delivery_t {
     uint64_t             disposition;
     bool                 settled;
     uint64_t             tag;
+    qd_bitmask_t        *link_exclusion;
 };
 
 ALLOC_DECLARE(qdr_delivery_t);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/326d09a8/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 6aa2d04..5ab27cf 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -43,14 +43,14 @@ qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, qd_message_t *msg, qd_field_i
     qdr_delivery_t *dlv    = new_qdr_delivery_t();
 
     ZERO(dlv);
-    dlv->link    = link;
-    dlv->msg     = msg;
-    dlv->to_addr = 0;
-    dlv->origin  = ingress;
-    dlv->settled = settled;
+    dlv->link           = link;
+    dlv->msg            = msg;
+    dlv->to_addr        = 0;
+    dlv->origin         = ingress;
+    dlv->settled        = settled;
+    dlv->link_exclusion = link_exclusion;
 
     action->args.connection.delivery = dlv;
-    action->args.connection.link_exclusion = link_exclusion;
     qdr_action_enqueue(link->core, action);
     return dlv;
 }
@@ -64,14 +64,14 @@ qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, qd_message_t *msg,
     qdr_delivery_t *dlv    = new_qdr_delivery_t();
 
     ZERO(dlv);
-    dlv->link    = link;
-    dlv->msg     = msg;
-    dlv->to_addr = addr;
-    dlv->origin  = ingress;
-    dlv->settled = settled;
+    dlv->link           = link;
+    dlv->msg            = msg;
+    dlv->to_addr        = addr;
+    dlv->origin         = ingress;
+    dlv->settled        = settled;
+    dlv->link_exclusion = link_exclusion;
 
     action->args.connection.delivery = dlv;
-    action->args.connection.link_exclusion = link_exclusion;
     qdr_action_enqueue(link->core, action);
     return dlv;
 }
@@ -198,6 +198,7 @@ void qdr_delivery_free(qdr_delivery_t *delivery)
         qd_message_free(delivery->msg);
     if (delivery->to_addr)
         qd_field_iterator_free(delivery->to_addr);
+    qd_bitmask_free(delivery->link_exclusion);
     free_qdr_delivery_t(delivery);
 }
 
@@ -242,60 +243,6 @@ qd_message_t *qdr_delivery_message(const qdr_delivery_t *delivery)
 // In-Thread Functions
 //==================================================================================
 
-/**
- * Check the link's accumulated credit.  If the credit given to the connection thread
- * has been issued to Proton, provide the next batch of credit to the connection thread.
- */
-void qdr_link_issue_credit_CT(qdr_core_t *core, qdr_link_t *link, int credit)
-{
-    link->incremental_credit_CT += credit;
-    link->flow_started = true;
-
-    if (link->incremental_credit_CT && link->incremental_credit == 0) {
-        //
-        // Move the credit from the core-thread value to the connection-thread value.
-        //
-        link->incremental_credit    = link->incremental_credit_CT;
-        link->incremental_credit_CT = 0;
-
-        //
-        // Put this link on the connection's has-credit list.
-        //
-        sys_mutex_lock(link->conn->work_lock);
-        qdr_add_link_ref(&link->conn->links_with_credit, link, QDR_LINK_LIST_CLASS_FLOW);
-        sys_mutex_unlock(link->conn->work_lock);
-
-        //
-        // Activate the connection
-        //
-        qdr_connection_activate_CT(core, link->conn);
-    }
-}
-
-
-/**
- * This function should be called after adding a new destination (subscription, local link,
- * or remote node) to an address.  If this address now has exactly one destination (i.e. it
- * transitioned from unreachable to reachable), make sure any unstarted in-links are issued
- * initial credit.
- */
-void qdr_addr_start_inlinks_CT(qdr_core_t *core, qdr_address_t *addr)
-{
-    if (DEQ_SIZE(addr->inlinks) == 0)
-        return;
-
-    if (DEQ_SIZE(addr->subscriptions) + DEQ_SIZE(addr->rlinks) + qd_bitmask_cardinality(addr->rnodes) == 1) {
-        qdr_link_ref_t *ref = DEQ_HEAD(addr->inlinks);
-        while (ref) {
-            qdr_link_t *link = ref->link;
-            if (!link->flow_started)
-                qdr_link_issue_credit_CT(core, link, link->capacity);
-            ref = DEQ_NEXT(ref);
-        }
-    }
-}
-
-
 static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     if (discard)
@@ -335,49 +282,19 @@ static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discar
 }
 
 
-static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
+static int qdr_link_forward_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv, qdr_address_t *addr)
 {
-    if (discard)
-        return;
-
-    qdr_delivery_t *dlv          = action->args.connection.delivery;
-    qd_bitmask_t   *link_exclude = action->args.connection.link_exclusion;
-    qdr_link_t     *link         = dlv->link;
-    int             fanout       = 0;
-    bool            presettled   = dlv->settled;
-
-    //
-    // If this is an attach-routed link, put the delivery directly onto the peer link
-    //
-    if (link->connected_link) {
-        qdr_delivery_t *peer = qdr_forward_new_delivery_CT(core, dlv, link->connected_link, dlv->msg);
-        qdr_forward_deliver_CT(core, link->connected_link, peer);
-        qd_message_free(dlv->msg);
-        dlv->msg = 0;
-        return;
-    }
-
-    //
-    // NOTE: The link->undelivered list does not need to be protected by the
-    //       connection's work lock for incoming links.  This protection is only
-    //       needed for outgoing links.
-    //
-
-    if (DEQ_IS_EMPTY(link->undelivered)) {
-        qdr_address_t *addr = link->owning_addr;
-        if (!addr && dlv->to_addr)
-            qd_hash_retrieve(core->addr_hash, dlv->to_addr, (void**) &addr);
-        if (addr) {
-            fanout = qdr_forward_message_CT(core, addr, dlv->msg, dlv, false,
-                                            link->link_type == QD_LINK_CONTROL, link_exclude);
-            if (link->link_type != QD_LINK_CONTROL && link->link_type != QD_LINK_ROUTER)
-                addr->deliveries_ingress++;
-            link->total_deliveries++;
-        }
+    int  fanout     = 0;
+    bool presettled = dlv->settled;
+
+    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)
+            addr->deliveries_ingress++;
+        link->total_deliveries++;
     }
 
     if (fanout == 0) {
-        printf("TODO fanout == 0\n");
         if (link->owning_addr) {
             //
             // Message was not delivered and the link is not anonymous.
@@ -391,6 +308,7 @@ static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool dis
             //
         }
     } else if (fanout == 1) {
+        qd_bitmask_free(dlv->link_exclusion);
         if (dlv->settled) {
             //
             // The delivery is settled.  Keep it off the unsettled list and issue
@@ -411,6 +329,7 @@ static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool dis
         //
         // The fanout is greater than one.  Do something!  TODO
         //
+        qd_bitmask_free(dlv->link_exclusion);
 
         if (presettled) {
             qdr_link_issue_credit_CT(core, link, 1);
@@ -418,6 +337,43 @@ static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool dis
             qdr_delivery_free(dlv);
         }
     }
+
+    return fanout;
+}
+
+
+static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
+{
+    if (discard)
+        return;
+
+    qdr_delivery_t *dlv  = action->args.connection.delivery;
+    qdr_link_t     *link = dlv->link;
+
+    //
+    // If this is an attach-routed link, put the delivery directly onto the peer link
+    //
+    if (link->connected_link) {
+        qdr_delivery_t *peer = qdr_forward_new_delivery_CT(core, dlv, link->connected_link, dlv->msg);
+        qdr_forward_deliver_CT(core, link->connected_link, peer);
+        qd_message_free(dlv->msg);
+        dlv->msg = 0;
+        return;
+    }
+
+    //
+    // NOTE: The link->undelivered list does not need to be protected by the
+    //       connection's work lock for incoming links.  This protection is only
+    //       needed for outgoing links.
+    //
+
+    if (DEQ_IS_EMPTY(link->undelivered)) {
+        qdr_address_t *addr = link->owning_addr;
+        if (!addr && dlv->to_addr)
+            qd_hash_retrieve(core->addr_hash, dlv->to_addr, (void**) &addr);
+        qdr_link_forward_CT(core, link, dlv, addr);
+    } else
+        DEQ_INSERT_TAIL(link->undelivered, dlv);
 }
 
 
@@ -436,7 +392,7 @@ static void qdr_send_to_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
             // Forward the message.  We don't care what the fanout count is.
             //
             (void) qdr_forward_message_CT(core, addr, msg, 0, action->args.io.exclude_inprocess,
-                                          action->args.io.control, 0);
+                                          action->args.io.control);
             addr->deliveries_from_container++;
         } else
             qd_log(core->log, QD_LOG_DEBUG, "In-process send to an unknown address");
@@ -508,6 +464,89 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
 }
 
 
+/**
+ * Check the link's accumulated credit.  If the credit given to the connection thread
+ * has been issued to Proton, provide the next batch of credit to the connection thread.
+ */
+void qdr_link_issue_credit_CT(qdr_core_t *core, qdr_link_t *link, int credit)
+{
+    link->incremental_credit_CT += credit;
+    link->flow_started = true;
+
+    if (link->incremental_credit_CT && link->incremental_credit == 0) {
+        //
+        // Move the credit from the core-thread value to the connection-thread value.
+        //
+        link->incremental_credit    = link->incremental_credit_CT;
+        link->incremental_credit_CT = 0;
+
+        //
+        // Put this link on the connection's has-credit list.
+        //
+        sys_mutex_lock(link->conn->work_lock);
+        qdr_add_link_ref(&link->conn->links_with_credit, link, QDR_LINK_LIST_CLASS_FLOW);
+        sys_mutex_unlock(link->conn->work_lock);
+
+        //
+        // Activate the connection
+        //
+        qdr_connection_activate_CT(core, link->conn);
+    }
+}
+
+
+/**
+ * This function should be called after adding a new destination (subscription, local link,
+ * or remote node) to an address.  If this address now has exactly one destination (i.e. it
+ * transitioned from unreachable to reachable), make sure any unstarted in-links are issued
+ * initial credit.
+ *
+ * Also, check the inlinks to see if there are undelivered messages.  If so, drain them to
+ * the forwarder.
+ */
+void qdr_addr_start_inlinks_CT(qdr_core_t *core, qdr_address_t *addr)
+{
+    if (DEQ_SIZE(addr->inlinks) == 0)
+        return;
+
+    if (DEQ_SIZE(addr->subscriptions) + DEQ_SIZE(addr->rlinks) + qd_bitmask_cardinality(addr->rnodes) == 1) {
+        qdr_link_ref_t *ref = DEQ_HEAD(addr->inlinks);
+        while (ref) {
+            qdr_link_t *link = ref->link;
+
+            //
+            // Issue credit to stalled links
+            //
+            if (!link->flow_started)
+                qdr_link_issue_credit_CT(core, link, link->capacity);
+
+            //
+            // Drain undelivered deliveries via the forwarder
+            //
+            if (DEQ_SIZE(link->undelivered) > 0) {
+
+                //
+                // Move all the undelivered to a local list in case not all can be delivered.
+                // We don't want to loop here forever putting the same messages on the undelivered
+                // list.
+                //
+                qdr_delivery_list_t deliveries;
+                DEQ_MOVE(link->undelivered, deliveries);
+
+                qdr_delivery_t *dlv = DEQ_HEAD(deliveries);
+                while (dlv) {
+                    DEQ_REMOVE_HEAD(deliveries);
+                    qdr_link_forward_CT(core, link, dlv, addr);
+                    dlv = DEQ_HEAD(deliveries);
+                }
+            }
+
+            ref = DEQ_NEXT(ref);
+        }
+    }
+}
+
+
 void qdr_delivery_push_CT(qdr_core_t *core, qdr_delivery_t *dlv)
 {
     if (!dlv || !dlv->link)


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


[15/50] [abbrv] qpid-dispatch git commit: DISPATCH_179 - Link-routing implemented for attach, flow, transfer.

Posted by tr...@apache.org.
DISPATCH_179 - Link-routing implemented for attach, flow, transfer.


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

Branch: refs/heads/master
Commit: bb14ecfb6d070e41ac4d4dfe0eeb779f0b38117d
Parents: 3c84c0b
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Mar 7 17:21:15 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Mar 7 17:21:15 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |  2 +-
 src/router_core/connections.c         |  8 ++++
 src/router_core/forwarder.c           |  2 +-
 src/router_core/router_core_private.h |  4 ++
 src/router_core/transfer.c            | 71 +++++++++++++++++++-----------
 src/router_node.c                     |  4 +-
 6 files changed, 61 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 06669f5..4dcc167 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -494,7 +494,7 @@ qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, qd_message_t *msg, qd_field_i
 qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, qd_message_t *msg,
                                     qd_field_iterator_t *ingress, qd_field_iterator_t *addr,
                                     bool settled, qd_bitmask_t *link_exclusion);
-qdr_delivery_t *qdr_link_deliver_to_routed_link(qdr_link_t *link, qd_message_t *msg);
+qdr_delivery_t *qdr_link_deliver_to_routed_link(qdr_link_t *link, qd_message_t *msg, bool settled);
 
 void qdr_link_process_deliveries(qdr_core_t *core, qdr_link_t *link, int credit);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 1aca79f..ab8f6e1 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -957,6 +957,14 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
     qdr_terminus_t   *source = action->args.connection.source;
     qdr_terminus_t   *target = action->args.connection.target;
 
+    //
+    // Handle attach-routed links
+    //
+    if (link->connected_link) {
+        qdr_link_outbound_second_attach_CT(core, link->connected_link, source, target);
+        return;
+    }
+
     if (link->link_direction == QD_INCOMING) {
         //
         // Handle incoming link cases

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 1c0f7ec..0b4562b 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -351,7 +351,7 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
                                   qdr_terminus_t *target)
 {
     qdr_connection_ref_t *conn_ref = DEQ_HEAD(addr->conns);
-    qdr_connection_t     *conn;
+    qdr_connection_t     *conn     = 0;
 
     //
     // Check for locally connected containers that can handle this link attach.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/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 2877677..f44b1c5 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -236,6 +236,8 @@ struct qdr_link_t {
     int                      capacity;
     int                      incremental_credit_CT;
     int                      incremental_credit;
+    bool                     drain_mode;
+    int                      credit_to_core; ///< Number of the available credits incrementally given to the core
     uint64_t                 total_deliveries;
 };
 
@@ -552,6 +554,8 @@ void qdr_post_link_lost_CT(qdr_core_t *core, int link_maskbit);
 void qdr_post_general_work_CT(qdr_core_t *core, qdr_general_work_t *work);
 void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local);
 
+qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *peer, qdr_link_t *link, qd_message_t *msg);
+void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv);
 void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
 
 void qdr_connection_enqueue_work_CT(qdr_core_t            *core,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index fcc33be..9484489 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -77,31 +77,19 @@ qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, qd_message_t *msg,
 }
 
 
-qdr_delivery_t *qdr_link_deliver_to_routed_link(qdr_link_t *link, qd_message_t *msg)
+qdr_delivery_t *qdr_link_deliver_to_routed_link(qdr_link_t *link, qd_message_t *msg, bool settled)
 {
-    // TODO - Implement this.  Bypass the CT?
+    qdr_action_t   *action = qdr_action(qdr_link_deliver_CT, "link_deliver");
+    qdr_delivery_t *dlv    = new_qdr_delivery_t();
 
-    //
-    // We might wish to run link-routed transfers and updates through the core in order to
-    // track the number of outstanding deliveries and to have the ability to intervene in
-    // flow control.
-    //
-    // Use case: Quiescing a broker.  To do this, all inbound links to the broker shall be
-    // idled by preventing the propagation of flow credit out of the broker.  This will dry
-    // the transfer of inbound deliveries, allow all existing deliveries to be settled, and
-    // allow the router to know when it is safe to detach the inbound links.  Outbound links
-    // can also be detached after all deliveries are settled and "drained" indications are
-    // received.
-    //
-    // Waypoint disconnect procedure:
-    //   1) Block flow-credit propagation for link outbound to waypoint.
-    //   2) Wait for the number of unsettled outbound deliveries to go to zero.
-    //   3) Detach the outbound link.
-    //   4) Wait for inbound link to be drained with zero unsettled deliveries.
-    //   5) Detach inbound link.
-    //
+    ZERO(dlv);
+    dlv->link    = link;
+    dlv->msg     = msg;
+    dlv->settled = settled;
 
-    return 0;
+    action->args.connection.delivery = dlv;
+    qdr_action_enqueue(link->core, action);
+    return dlv;
 }
 
 
@@ -127,6 +115,7 @@ void qdr_link_process_deliveries(qdr_core_t *core, qdr_link_t *link, int credit)
         sys_mutex_unlock(conn->work_lock);
 
         if (dlv) {
+            link->credit_to_core--;
             core->deliver_handler(core->user_context, link, dlv, dlv->settled);
             if (dlv->settled)
                 qdr_delivery_free(dlv);
@@ -160,6 +149,17 @@ void qdr_link_process_deliveries(qdr_core_t *core, qdr_link_t *link, int credit)
 void qdr_link_flow(qdr_core_t *core, qdr_link_t *link, int credit, bool drain_mode)
 {
     qdr_action_t *action = qdr_action(qdr_link_flow_CT, "link_flow");
+
+    //
+    // Compute the number of credits now available that we haven't yet given
+    // incrementally to the router core.  i.e. convert absolute credit to
+    // incremental credit.
+    //
+    credit -= link->credit_to_core;
+    if (credit < 0)
+        credit = 0;
+    link->credit_to_core += credit;
+
     action->args.connection.link   = link;
     action->args.connection.credit = credit;
     action->args.connection.drain  = drain_mode;
@@ -278,13 +278,16 @@ static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discar
         return;
 
     qdr_link_t *link = action->args.connection.link;
-    int  credit = action->args.connection.credit;
-    //bool drain  = action->args.connection.drain;
-    bool activate = false;
+    int  credit      = action->args.connection.credit;
+    bool drain       = action->args.connection.drain;
+    bool activate    = false;
 
     //
-    // TODO - If this is a link-routed link, propagate the flow data downrange.
+    // If this is an attach-routed link, propagate the flow data downrange.
+    // Note that the credit value is incremental.
     //
+    if (link->connected_link)
+        qdr_link_issue_credit_CT(core, link->connected_link, credit);
 
     //
     // Handle the replenishing of credit outbound
@@ -298,6 +301,11 @@ static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discar
         sys_mutex_unlock(link->conn->work_lock);
     }
 
+    //
+    // Record the drain mode for the link
+    //
+    link->drain_mode = drain;
+
     if (activate)
         qdr_connection_activate_CT(core, link->conn);
 }
@@ -315,6 +323,17 @@ static void qdr_link_deliver_CT(qdr_core_t *core, qdr_action_t *action, bool dis
     bool            presettled   = dlv->settled;
 
     //
+    // If this is an attach-routed link, put the delivery directly onto the peer link
+    //
+    if (link->connected_link) {
+        qdr_delivery_t *peer = qdr_forward_new_delivery_CT(core, dlv, link->connected_link, dlv->msg);
+        qdr_forward_deliver_CT(core, link->connected_link, peer);
+        qd_message_free(dlv->msg);
+        dlv->msg = 0;
+        return;
+    }
+
+    //
     // NOTE: The link->undelivered list does not need to be protected by the
     //       connection's work lock for incoming links.  This protection is only
     //       needed for outgoing links.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bb14ecfb/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index a2b6e2d..27b54c0 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -222,7 +222,7 @@ static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd
     // Handle the link-routed case
     //
     if (qdr_link_is_routed(rlink)) {
-        // TODO - Add Link-Route Forwarding here
+        qdr_link_deliver_to_routed_link(rlink, msg, pn_delivery_settled(pnd));
         return;
     }
 
@@ -417,7 +417,7 @@ static int router_link_flow_handler(void* context, qd_link_t *link)
     if (!rlink)
         return 0;
 
-    qdr_link_flow(router->router_core, rlink, pn_link_credit(pnlink), pn_link_get_drain(pnlink));
+    qdr_link_flow(router->router_core, rlink, pn_link_remote_credit(pnlink), pn_link_get_drain(pnlink));
 
     return 0;
 }


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


[21/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Removed references to "label" in connectors/listeners. Use "name" instead.

Posted by tr...@apache.org.
DISPATCH-179 - Removed references to "label" in connectors/listeners.  Use "name" instead.


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

Branch: refs/heads/master
Commit: 722b0eb792d19d200ca57274522728e8e09682ff
Parents: 2eee109
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 10 16:20:45 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 10 16:20:45 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/server.h                |  4 ++--
 python/qpid_dispatch/management/qdrouter.json |  8 +-------
 src/connection_manager.c                      | 14 +++++++-------
 src/router_node.c                             | 10 +++++-----
 4 files changed, 15 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/722b0eb7/include/qpid/dispatch/server.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/server.h b/include/qpid/dispatch/server.h
index be9d117..e8d92b8 100644
--- a/include/qpid/dispatch/server.h
+++ b/include/qpid/dispatch/server.h
@@ -248,9 +248,9 @@ typedef struct qd_server_config_t {
     char *port;
 
     /**
-     * Connection label, used as a reference from other parts of the configuration.
+     * Connection name, used as a reference from other parts of the configuration.
      */
-    char *label;
+    char *name;
 
     /**
      * Space-separated list of SASL mechanisms to be accepted for the connection.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/722b0eb7/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index f558ee2..038b161 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -37,12 +37,6 @@
                     "default": "normal",
                     "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection.  In the inter-router role, the connection is assumed to be to another router in the network.  Inter-router discovery and routing protocols can only be used over inter-router connections.",
                     "create": true
-                },
-                "label": {
-                    "type": "string",
-                    "create": true,
-                    "required": false,
-                    "description": "When the role is 'route-container', this optional label may be used to identify connections for use in routes."
                 }
             }
         },
@@ -860,7 +854,7 @@
                 },
                 "connectors": {
                     "type": "string",
-                    "description": "Comma-separated list of labels associated with the connector leading to the target containers",
+                    "description": "Comma-separated list of names associated with the connector leading to the target containers",
                     "create": true,
                     "required": false
                 },

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/722b0eb7/src/connection_manager.c
----------------------------------------------------------------------
diff --git a/src/connection_manager.c b/src/connection_manager.c
index 31e2fad..794ddee 100644
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@ -79,7 +79,7 @@ static void qd_server_config_free(qd_server_config_t *cf)
     if (!cf) return;
     free(cf->host);
     free(cf->port);
-    free(cf->label);
+    free(cf->name);
     free(cf->role);
     free(cf->sasl_mechanisms);
     if (cf->ssl_enabled) {
@@ -141,7 +141,7 @@ static qd_error_t load_server_config(qd_dispatch_t *qd, qd_server_config_t *conf
     memset(config, 0, sizeof(*config));
     config->host            = qd_entity_get_string(entity, "addr"); CHECK();
     config->port            = qd_entity_get_string(entity, "port"); CHECK();
-    config->label           = qd_entity_opt_string(entity, "label", 0); CHECK();
+    config->name            = qd_entity_opt_string(entity, "name", 0); CHECK();
     config->role            = qd_entity_get_string(entity, "role"); CHECK();
     config->max_frame_size  = qd_entity_get_long(entity, "maxFrameSize"); CHECK();
     config->idle_timeout_seconds = qd_entity_get_long(entity, "idleTimeoutSeconds"); CHECK();
@@ -209,9 +209,9 @@ qd_error_t qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_entity_t *entit
     DEQ_ITEM_INIT(cc);
     if (strcmp(cc->configuration.role, "route-container") == 0) {
         DEQ_INSERT_TAIL(cm->on_demand_connectors, cc);
-        qd_log(cm->log_source, QD_LOG_INFO, "Configured route-container connector: %s:%s label=%s",
+        qd_log(cm->log_source, QD_LOG_INFO, "Configured route-container connector: %s:%s name=%s",
                cc->configuration.host, cc->configuration.port,
-               cc->configuration.label ? cc->configuration.label : "<none>");
+               cc->configuration.name ? cc->configuration.name : "<none>");
     } else {
         DEQ_INSERT_TAIL(cm->config_connectors, cc);
         qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s",
@@ -294,7 +294,7 @@ qd_config_connector_t *qd_connection_manager_find_on_demand(qd_dispatch_t *qd, c
     qd_config_connector_t *cc = DEQ_HEAD(qd->connection_manager->on_demand_connectors);
 
     while (cc) {
-        if (strcmp(cc->configuration.label, name) == 0)
+        if (strcmp(cc->configuration.name, name) == 0)
             break;
         cc = DEQ_NEXT(cc);
     }
@@ -320,7 +320,7 @@ void qd_connection_manager_start_on_demand(qd_dispatch_t *qd, qd_config_connecto
 {
     if (cc && cc->connector == 0) {
         qd_log(qd->connection_manager->log_source, QD_LOG_INFO, "Starting on-demand connector: %s",
-               cc->configuration.label);
+               cc->configuration.name);
         cc->connector = qd_server_connect(qd, &cc->configuration, cc);
     }
 }
@@ -345,7 +345,7 @@ void qd_config_connector_set_context(qd_config_connector_t *cc, void *context)
 
 const char *qd_config_connector_name(qd_config_connector_t *cc)
 {
-    return cc ? cc->configuration.label : 0;
+    return cc ? cc->configuration.name : 0;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/722b0eb7/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 100e204..5d70cb9 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -44,7 +44,7 @@ static char *node_id;
  */
 static void qd_router_connection_get_config(const qd_connection_t  *conn,
                                             qdr_connection_role_t  *role,
-                                            const char            **label,
+                                            const char            **name,
                                             bool                   *strip_annotations_in,
                                             bool                   *strip_annotations_out)
 {
@@ -64,7 +64,7 @@ static void qd_router_connection_get_config(const qd_connection_t  *conn,
         else
             *role = QDR_ROLE_NORMAL;
 
-        *label = cf->label;
+        *name = cf->name;
     }
 }
 
@@ -455,13 +455,13 @@ static void router_opened_handler(qd_router_t *router, qd_connection_t *conn, bo
     qdr_connection_role_t  role;
     bool                   strip_annotations_in;
     bool                   strip_annotations_out;
-    const char            *label;
+    const char            *name;
     pn_connection_t       *pn_conn = qd_connection_pn(conn);
 
-    qd_router_connection_get_config(conn, &role, &label,
+    qd_router_connection_get_config(conn, &role, &name,
                                     &strip_annotations_in, &strip_annotations_out);
 
-    qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, inbound, role, label,
+    qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, inbound, role, name,
                                                    pn_connection_remote_container(pn_conn),
                                                    strip_annotations_in, strip_annotations_out);
 


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


[39/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added proper lookup for treatment of addresses advertised by other routers.

Posted by tr...@apache.org.
DISPATCH-179 - Added proper lookup for treatment of addresses advertised by other routers.


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

Branch: refs/heads/master
Commit: 6dfb3dc18913668915eedcf50aeade3ceeb1ec75
Parents: 17ebf68
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 17 14:28:28 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 17 14:28:28 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c         | 44 ++++++++++++++++++++++++++++++
 src/router_core/route_tables.c        |  2 +-
 src/router_core/router_core_private.h |  1 +
 3 files changed, 46 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 4f38dcb..d014bf3 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -548,6 +548,50 @@ qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_i
 }
 
 
+qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_field_iterator_t *iter)
+{
+#define HASH_STORAGE_SIZE 1000
+    char  storage[HASH_STORAGE_SIZE + 1];
+    char *copy    = storage;
+    bool  on_heap = false;
+    int   length  = qd_field_iterator_length(iter);
+    qd_address_treatment_t trt = QD_TREATMENT_ANYCAST_CLOSEST;
+
+    if (length > HASH_STORAGE_SIZE) {
+        copy    = (char*) malloc(length + 1);
+        on_heap = true;
+    }
+
+    qd_field_iterator_strncpy(iter, copy, length + 1);
+
+    if (copy[0] == 'C' || copy[0] == 'D')
+        //
+        // Handle the link-route address case
+        // TODO - put link-routes into the config table with a different prefix from 'Z'
+        //
+        trt = QD_TREATMENT_LINK_BALANCED;
+
+    else if (copy[0] == 'M') {
+        //
+        // Handle the mobile address case
+        //
+        copy[1] = 'Z';
+        qd_field_iterator_t  *config_iter = qd_field_iterator_string(&copy[1]);
+        qdr_address_config_t *addr = 0;
+
+        qd_hash_retrieve_prefix(core->addr_hash, config_iter, (void**) &addr);
+        if (addr)
+            trt = addr->treatment;
+        qd_field_iterator_free(config_iter);
+    }
+
+    if (on_heap)
+        free(copy);
+
+    return trt;
+}
+
+
 /**
  * Check an address to see if it no longer has any associated destinations.
  * Depending on its policy, the address may be eligible for being closed out

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index 0529a84..7f715a5 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -501,7 +501,7 @@ static void qdr_map_destination_CT(qdr_core_t *core, qdr_action_t *action, bool
 
         qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
         if (!addr) {
-            addr = qdr_address_CT(core, 0); // FIXME - Treatment
+            addr = qdr_address_CT(core, qdr_treatment_for_address_hash_CT(core, iter));
             qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
             DEQ_ITEM_INIT(addr);
             DEQ_INSERT_TAIL(core->addrs, addr);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/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 1e5eb44..dadebc9 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -563,6 +563,7 @@ qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *pe
 void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv);
 void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
 qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter, int *in_phase, int *out_phase);
+qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_field_iterator_t *iter);
 
 void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
                                     qdr_connection_t      *conn,


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


[36/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added ingress and egress phases for waypoint addresses.

Posted by tr...@apache.org.
DISPATCH-179 - Added ingress and egress phases for waypoint addresses.


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

Branch: refs/heads/master
Commit: 8fb13f56cc54c2a2c430ad9ac4ec5ced56d92965
Parents: de4413f
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 18:22:23 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 18:22:23 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c         | 13 +++++++++++--
 src/router_core/route_control.c       |  2 +-
 src/router_core/router_core_private.h |  2 +-
 3 files changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/8fb13f56/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index a07d11a..4f38dcb 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -530,7 +530,7 @@ static char qdr_prefix_for_dir(qd_direction_t dir)
 }
 
 
-qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter)
+qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter, int *in_phase, int *out_phase)
 {
     qdr_address_config_t *addr = 0;
 
@@ -541,6 +541,9 @@ qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_i
     qd_address_iterator_override_prefix(iter, 'Z');
     qd_hash_retrieve_prefix(core->addr_hash, iter, (void**) &addr);
     qd_address_iterator_override_prefix(iter, '\0');
+    if (in_phase)  *in_phase  = addr ? addr->in_phase  : 0;
+    if (out_phase) *out_phase = addr ? addr->out_phase : 0;
+
     return addr ? addr->treatment : QD_TREATMENT_ANYCAST_CLOSEST;
 }
 
@@ -680,7 +683,13 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
     qd_address_iterator_override_prefix(iter, '\0'); // Cancel previous override
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr && create_if_not_found) {
-        addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter));
+        int in_phase;
+        int out_phase;
+        int addr_phase;
+
+        addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter, &in_phase, &out_phase));
+        addr_phase = dir == QD_INCOMING ? in_phase : out_phase;
+        qd_address_iterator_set_phase(iter, addr_phase);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/8fb13f56/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 54f4573..9ddad29 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -234,7 +234,7 @@ qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
 
     qd_hash_retrieve(core->addr_hash, iter, (void*) &al->addr);
     if (!al->addr) {
-        al->addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter));
+        al->addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter, 0, 0));
         DEQ_INSERT_TAIL(core->addrs, al->addr);
         qd_hash_insert(core->addr_hash, iter, al->addr, &al->addr->hash_handle);
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/8fb13f56/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 6956b67..1e5eb44 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -562,7 +562,7 @@ void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local);
 qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *peer, qdr_link_t *link, qd_message_t *msg);
 void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv);
 void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
-qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter);
+qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter, int *in_phase, int *out_phase);
 
 void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
                                     qdr_connection_t      *conn,


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


[29/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Significant update to the management model for routes. Removed the singular "route" configuration and replaced it with three distinct object types: address, linkRoute, and autoLink.

Posted by tr...@apache.org.
DISPATCH-179 - Significant update to the management model for routes.
Removed the singular "route" configuration and replaced it with three
distinct object types: address, linkRoute, and autoLink.


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

Branch: refs/heads/master
Commit: ab2734f9bf6761abfb1f54b26fd779a5f06961d9
Parents: 5c839b3
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 15 14:15:21 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 15 14:15:21 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h             |  28 +-
 python/qpid_dispatch/management/qdrouter.json   | 162 ++++---
 python/qpid_dispatch_internal/dispatch.py       |   6 +-
 .../qpid_dispatch_internal/management/agent.py  |  56 ++-
 src/CMakeLists.txt                              |   2 +-
 src/dispatch.c                                  |  20 +-
 src/router_config.c                             | 251 +++++++----
 src/router_core/agent.c                         | 115 +++--
 src/router_core/agent_config_address.c          | 415 ++++++++++++++++++
 src/router_core/agent_config_address.h          |  35 ++
 src/router_core/agent_route.c                   | 421 -------------------
 src/router_core/agent_route.h                   |  35 --
 src/router_core/management_agent.c              |  45 +-
 src/router_core/route_control.c                 | 331 +++++----------
 src/router_core/route_control.h                 |  38 +-
 src/router_core/router_core_private.h           |  83 ++--
 src/router_private.h                            |   6 +-
 17 files changed, 1052 insertions(+), 997 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 16aa513..271954b 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -544,7 +544,9 @@ qd_message_t *qdr_delivery_message(const qdr_delivery_t *delivery);
  ******************************************************************************
  */
 typedef enum {
-    QD_ROUTER_ROUTE,
+    QD_ROUTER_CONFIG_ADDRESS,
+    QD_ROUTER_CONFIG_LINK_ROUTE,
+    QD_ROUTER_CONFIG_AUTO_LINK,
     QD_ROUTER_CONNECTION,
     QD_ROUTER_LINK,
     QD_ROUTER_ADDRESS,
@@ -617,30 +619,6 @@ void qdr_manage_update(qdr_core_t *core, void *context, qd_router_entity_type_t
                        qd_parsed_field_t *in_body, qd_composed_field_t *out_body);
 
 /**
- * qdr_manage_method
- *
- * Invoke a custom method on a managed entity in the router core.
- *
- * @param core Pointer to the core object returned by qd_core()
- * @param context An opaque context that will be passed back in the invocation of the response callback
- * @param type The entity type for the update request
- * @param method The method being invoked
- * @param name The name supplied with the request (or 0 if the identity was supplied)
- * @param identity The identity supplied with the request (or 0 if the name was supplied)
- * @param in_body The body of the request message
- * @param out_body A composed field for the body of the response message
- */
-void qdr_manage_method(qdr_core_t              *core,
-                       void                    *context,
-                       qd_router_entity_type_t  type,
-                       qd_field_iterator_t     *method,
-                       qd_field_iterator_t     *name,
-                       qd_field_iterator_t     *identity,
-                       qd_parsed_field_t       *in_body,
-                       qd_composed_field_t     *out_body);
-
-
-/**
  * Sequence for running a query:
  *
  * 1) Locate the attributeNames field in the body of the QUERY request

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 327e504..40f3e19 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -829,46 +829,125 @@
             }
         },
 
-        "route": {
-            "description": "Provisioned route that affects the treatment of message deliveries and link attaches",
+        "router.config.address": {
+            "description": "Entity type for address configuration.  This is used to configure the treatment of message-routed deliveries within a particular address-space.  The configuration controls distribution and address phasing.",
             "extends": "configurationEntity",
-            "operations": ["CREATE", "DELETE", "ADD-CONTAINER", "REMOVE-CONTAINER-CLEAN", "REMOVE-CONTAINER-HARD"],
+            "operations": ["CREATE", "DELETE"],
             "attributes": {
-                "address": {
+                "prefix": {
                     "type": "string",
-                    "description": "The address or address prefix for the provisioned object",
+                    "description": "The address prefix for the configured settings",
                     "create": true,
                     "required": true
                 },
-                "path": {
-                    "type": ["direct", "source", "sink", "waypoint"],
-                    "description": "Type of object being provisioned:  address prefix, link destination, or waypoint",
+                "distribution": {
+                    "type": ["multicast", "closest", "balanced"],
+                    "description": "Treatment of traffic associated with the address",
                     "create": true,
-                    "default": "direct"
+                    "required": false,
+                    "default": "balanced"
                 },
-                "treatment": {
-                    "type": ["multicast", "closest", "balanced", "linkBalanced"],
+                "waypoint": {
+                    "type": "boolean",
+                    "description": "Designates this address space as being used for waypoints.  This will cause the proper address-phasing to be used.",
+                    "create": true,
+                    "required": false,
+                    "default": false
+                },
+                "ingressPhase": {
+                    "type": "integer",
+                    "description": "Advanced - Override the ingress phase for this address",
+                    "create": true,
+                    "required": false
+                },
+                "egressPhase": {
+                    "type": "integer",
+                    "description": "Advanced - Override the egress phase for this address",
+                    "create": true,
+                    "required": false
+                }
+            }
+        },
+
+        "router.config.linkRoute": {
+            "description": "Entity type for link-route configuration.  This is used to identify remote containers that shall be destinations for routed link-attaches.  The link-routing configuration applies to an addressing space defined by a prefix.",
+            "extends": "configurationEntity",
+            "operations": ["CREATE", "DELETE"],
+            "attributes": {
+                "prefix": {
+                    "type": "string",
+                    "description": "The address prefix for the configured settings",
+                    "create": true,
+                    "required": true
+                },
+                "containerId": {
+                    "type": "string",
+                    "description": "ContainerID for the target container",
+                    "create": true,
+                    "required": false
+                },
+                "connectionName": {
+                    "type": "string",
+                    "description": "The name from a connector or listener",
+                    "create": true,
+                    "required": false
+                },
+                "distribution": {
+                    "type": ["linkBalanced"],
                     "description": "Treatment of traffic associated with the address",
                     "create": true,
-                    "default": "balanced"
+                    "required": false,
+                    "default": "linkBalanced"
                 },
-                "connectors": {
+                "dir": {
+                    "type": ["in", "out"],
+                    "description": "The permitted direction of links: 'in' means client senders; 'out' means client receivers",
+                    "create": true,
+                    "required": false,
+                    "default": "both"
+                }
+            }
+        },
+
+        "router.config.autoLink": {
+            "description": "Entity type for configuring auto-links.  Auto-links are links whose lifecycle is managed by the router.  These are typically used to attach to waypoints on remote containers (brokers, etc.).",
+            "extends": "configurationEntity",
+            "operations": ["CREATE", "DELETE"],
+            "attributes": {
+                "addr": {
                     "type": "string",
-                    "description": "Comma-separated list of names associated with the connector leading to the target containers",
+                    "description": "The address or address prefix for the provisioned object",
+                    "create": true,
+                    "required": true
+                },
+                "dir": {
+                    "type": ["in", "out"],
+                    "description": "The direction of the link to be created.  In means into the router, out means out of the router.",
+                    "create": true,
+                    "required": true
+                },
+                "phase": {
+                    "type": "integer",
+                    "description": "The address phase for this link.  Defaults to '0' for 'out' links and '1' for 'in' links.",
                     "create": true,
                     "required": false
                 },
-                "containers": {
+                "containerId": {
                     "type": "string",
-                    "description": "Comma-separated list of container-IDs for target containers",
+                    "description": "ContainerID for the target container",
                     "create": true,
                     "required": false
                 },
-                "routeAddress": {
+                "connectionName": {
                     "type": "string",
-                    "description": "Alternate address to use for routing links/messages",
+                    "description": "The name from a connector or listener",
                     "create": true,
                     "required": false
+                },
+                "linkRef": {
+                    "type": "string",
+                    "description": "Reference to the org.apache.qpid.dispatch.router.link if the link is attached",
+                    "create": false
                 }
             }
         },
@@ -876,14 +955,23 @@
         "router.link": {
             "description": "Link to another AMQP endpoint: router node, client or other AMQP process.",
             "extends": "operationalEntity",
+            "operations": ["UPDATE"],
             "attributes": {
+                "adminStatus": {
+                    "type": ["enabled", "disabled"],
+                    "default": "enabled",
+                    "update": true
+                },
+                "operStatus": {
+                    "type": ["up", "down", "quiescing"]
+                },
                 "linkName": {
                     "type": "string",
                     "description": "Name assigned to the link in the Attach."
                 },
                 "linkType": {
-                    "type": ["endpoint", "waypoint", "router-control", "inter-router"],
-                    "description": "Type of link: endpoint: a link to a normally connected endpoint; waypoint: a link to a waypoint node; inter-router: a link to another router in the network."
+                    "type": ["endpoint", "router-control", "inter-router"],
+                    "description": "Type of link: endpoint: a link to a normally connected endpoint; inter-router: a link to another router in the network."
                 },
                 "linkDir": {
                     "type": ["in", "out"],
@@ -912,19 +1000,6 @@
                 "deliveryCount": {
                     "type": "integer",
                     "description": "The total number of deliveries that have traversed this link."
-                },
-                "adminState": {
-                    "type": ["enabled", "disabled"],
-                    "description": "",
-                    "default": "enabled",
-                    "create": false,
-                    "update": true
-                },
-                "operState": {
-                    "type": ["attaching", "up", "quiescing", "stopped", "detaching"],
-                    "description": "",
-                    "create": false,
-                    "update": false
                 }
             }
         },
@@ -934,7 +1009,7 @@
             "extends": "operationalEntity",
             "attributes": {
                 "treatment": {
-                    "type": ["flood", "multi", "anyClosest", "anyBalanced", "linkBalanced"],
+                    "type": ["flood", "multicast", "closest", "balanced", "linkBalanced"],
                     "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
                 },
                 "inProcess": {
@@ -1027,25 +1102,6 @@
             }
         },
 
-        "router.waypoint": {
-            "description": "Waypoint that is enabled in this router (i.e. a provisioned waypoint with a connector).",
-            "extends": "operationalEntity",
-            "attributes": {
-                "provisionedId": {
-                    "description": "Reference to the provisioning record that created this waypoint",
-                    "type": "string"
-                },
-                "outboundLink": {
-                    "description": "Reference to the link that is outbound from the waypoint to the remote node",
-                    "type": "string"
-                },
-                "inboundLink": {
-                    "description": "Reference to the link that is inbound to the waypoint from the remote node",
-                    "type": "string"
-                }
-            }
-        },
-
         "connection": {
             "description": "Connections to the router's container.",
             "extends": "operationalEntity",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/python/qpid_dispatch_internal/dispatch.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/dispatch.py b/python/qpid_dispatch_internal/dispatch.py
index 49f9a83..3b16193 100644
--- a/python/qpid_dispatch_internal/dispatch.py
+++ b/python/qpid_dispatch_internal/dispatch.py
@@ -65,10 +65,12 @@ class QdDll(ctypes.PyDLL):
         self._prototype(self.qd_connection_manager_delete_listener, None, [self.qd_dispatch_p, ctypes.c_void_p])
         self._prototype(self.qd_connection_manager_delete_connector, None, [self.qd_dispatch_p, ctypes.c_void_p])
 
-        self._prototype(self.qd_dispatch_configure_address, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_fixed_address, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_waypoint, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_lrp, None, [self.qd_dispatch_p, py_object])
-        self._prototype(self.qd_dispatch_configure_route, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_address, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_link_route, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_auto_link, None, [self.qd_dispatch_p, py_object])
 
         self._prototype(self.qd_dispatch_set_agent, None, [self.qd_dispatch_p, py_object])
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/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 26a3b54..a7dc4c5 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -244,6 +244,48 @@ class RouterEntity(EntityAdapter):
         self._qd.qd_dispatch_configure_router(self._dispatch, self)
 
 
+class AddressEntity(EntityAdapter):
+    def __init__(self, agent, entity_type, attributes=None):
+        super(AddressEntity, self).__init__(agent, entity_type, attributes, validate=False)
+        # Router 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 _identifier(self): return self.attributes.get('identity')
+
+    def create(self):
+        self._qd.qd_dispatch_configure_address(self._dispatch, self)
+
+
+class LinkRouteEntity(EntityAdapter):
+    def __init__(self, agent, entity_type, attributes=None):
+        super(LinkRouteEntity, self).__init__(agent, entity_type, attributes, validate=False)
+        # Router 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 _identifier(self): return self.attributes.get('identity')
+
+    def create(self):
+        self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
+
+
+class AutoLinkEntity(EntityAdapter):
+    def __init__(self, agent, entity_type, attributes=None):
+        super(AutoLinkEntity, self).__init__(agent, entity_type, attributes, validate=False)
+        # Router 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 _identifier(self): return self.attributes.get('identity')
+
+    def create(self):
+        self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
+
+
 class LogEntity(EntityAdapter):
 
     def __init__(self, agent, entity_type, attributes=None, validate=True):
@@ -296,7 +338,7 @@ class ConnectorEntity(EntityAdapter):
 
 class FixedAddressEntity(EntityAdapter):
     def create(self):
-        self._qd.qd_dispatch_configure_address(self._dispatch, self)
+        self._qd.qd_dispatch_configure_fixed_address(self._dispatch, self)
 
 
 class WaypointEntity(EntityAdapter):
@@ -308,9 +350,17 @@ class LinkRoutePatternEntity(EntityAdapter):
     def create(self):
         self._qd.qd_dispatch_configure_lrp(self._dispatch, self)
 
-class RouteEntity(EntityAdapter):
+class AddressEntity(EntityAdapter):
+    def create(self):
+        self._qd.qd_dispatch_configure_address(self._dispatch, self)
+
+class LinkRouteEntity(EntityAdapter):
+    def create(self):
+        self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
+
+class AutoLinkEntity(EntityAdapter):
     def create(self):
-        self._qd.qd_dispatch_configure_route(self._dispatch, self)
+        self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
 
 class ConsoleEntity(EntityAdapter):
     def create(self):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 472090d..9ae6d08 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -66,8 +66,8 @@ set(qpid_dispatch_SOURCES
   router_config.c
   router_core/agent.c
   router_core/agent_address.c
+  router_core/agent_config_address.c
   router_core/agent_link.c
-  router_core/agent_route.c
   router_core/connections.c
   router_core/error.c
   router_core/forwarder.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/dispatch.c
----------------------------------------------------------------------
diff --git a/src/dispatch.c b/src/dispatch.c
index ad2d621..d4cdafe 100644
--- a/src/dispatch.c
+++ b/src/dispatch.c
@@ -120,9 +120,9 @@ qd_error_t qd_dispatch_configure_router(qd_dispatch_t *qd, qd_entity_t *entity)
     return qd_error_code();
 }
 
-qd_error_t qd_dispatch_configure_address(qd_dispatch_t *qd, qd_entity_t *entity) {
+qd_error_t qd_dispatch_configure_fixed_address(qd_dispatch_t *qd, qd_entity_t *entity) {
     if (!qd->router) return qd_error(QD_ERROR_NOT_FOUND, "No router available");
-    qd_router_configure_address(qd->router, entity);
+    qd_router_configure_fixed_address(qd->router, entity);
     return qd_error_code();
 }
 
@@ -138,9 +138,21 @@ qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, qd_entity_t *entity) {
     return qd_error_code();
 }
 
-qd_error_t qd_dispatch_configure_route(qd_dispatch_t *qd, qd_entity_t *entity) {
+qd_error_t qd_dispatch_configure_address(qd_dispatch_t *qd, qd_entity_t *entity) {
+    if (!qd->router) return qd_error(QD_ERROR_NOT_FOUND, "No router available");
+    qd_router_configure_address(qd->router, entity);
+    return qd_error_code();
+}
+
+qd_error_t qd_dispatch_configure_link_route(qd_dispatch_t *qd, qd_entity_t *entity) {
+    if (!qd->router) return qd_error(QD_ERROR_NOT_FOUND, "No router available");
+    qd_router_configure_link_route(qd->router, entity);
+    return qd_error_code();
+}
+
+qd_error_t qd_dispatch_configure_auto_link(qd_dispatch_t *qd, qd_entity_t *entity) {
     if (!qd->router) return qd_error(QD_ERROR_NOT_FOUND, "No router available");
-    qd_router_configure_route(qd->router, entity);
+    qd_router_configure_auto_link(qd->router, entity);
     return qd_error_code();
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index c08307e..d22f8c1 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -27,7 +27,7 @@
 #include "entity_cache.h"
 #include "schema_enum.h"
 
-qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
+qd_error_t qd_router_configure_fixed_address(qd_router_t *router, qd_entity_t *entity)
 {
     qd_error_clear();
     int                             phase  = qd_entity_opt_long(entity, "phase", -1); QD_ERROR_RET();
@@ -49,17 +49,17 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     }
 
     //
-    // Convert fanout + bias to treatment
+    // Convert fanout + bias to distribution
     //
-    const char *trt;
+    const char *distrib;
 
     if (fanout == QD_SCHEMA_FIXEDADDRESS_FANOUT_MULTIPLE)
-        trt = "multicast";
+        distrib = "multicast";
     else {
         if (bias == QD_SCHEMA_FIXEDADDRESS_BIAS_CLOSEST)
-            trt = "closest";
+            distrib = "closest";
         else
-            trt = "balanced";
+            distrib = "balanced";
     }
 
     //
@@ -67,11 +67,11 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "address");
+    qd_compose_insert_string(body, "prefix");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "treatment");
-    qd_compose_insert_string(body, trt);
+    qd_compose_insert_string(body, "distribution");
+    qd_compose_insert_string(body, distrib);
     qd_compose_end_map(body);
 
     int              length = 0;
@@ -89,7 +89,7 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_ADDRESS, 0, in_body, 0);
 
     free(prefix);
     return qd_error_code();
@@ -139,25 +139,15 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "address");
+    qd_compose_insert_string(body, "prefix");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "path");
-    if      (strcmp("in", direction) == 0)
-        qd_compose_insert_string(body, "sink");
-    else if (strcmp("out", direction) == 0)
-        qd_compose_insert_string(body, "source");
-    else
-        qd_compose_insert_string(body, "waypoint");
-
-    qd_compose_insert_string(body, "treatment");
-    qd_compose_insert_string(body, "linkBalanced");
+    qd_compose_insert_string(body, "dir");
+    qd_compose_insert_string(body, direction);
 
     if (connector) {
-        qd_compose_insert_string(body, "connectors");
-        qd_compose_start_list(body);
+        qd_compose_insert_string(body, "connectionName");
         qd_compose_insert_string(body, connector);
-        qd_compose_end_list(body);
     }
 
     qd_compose_end_map(body);
@@ -177,7 +167,7 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_LINK_ROUTE, 0, in_body, 0);
 
     free(prefix);
     free(connector);
@@ -186,29 +176,84 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 }
 
 
-static void qd_router_insert_items(qd_composed_field_t *body, char *list)
+qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
 {
-    char *saveptr;
-    char *token;
-    char *delim = ", ";
-
-    token = strtok_r(list, delim, &saveptr);
-    while (token) {
-        qd_compose_insert_string(body, token);
-        token = strtok_r(0, delim, &saveptr);
+    char *name      = qd_entity_opt_string(entity, "name", 0);         QD_ERROR_RET();
+    char *prefix    = qd_entity_get_string(entity, "prefix");          QD_ERROR_RET();
+    char *distrib   = qd_entity_opt_string(entity, "distribution", 0); QD_ERROR_RET();
+    bool  waypoint  = qd_entity_opt_bool(entity, "waypoint", false);   QD_ERROR_RET();
+    long  in_phase  = qd_entity_opt_long(entity, "ingressPhase", -1);  QD_ERROR_RET();
+    long  out_phase = qd_entity_opt_long(entity, "egressPhase", -1);   QD_ERROR_RET();
+
+    //
+    // Formulate this configuration create it through the core management API.
+    //
+    qd_composed_field_t *body = qd_compose_subfield(0);
+    qd_compose_start_map(body);
+
+    if (name) {
+        qd_compose_insert_string(body, "name");
+        qd_compose_insert_string(body, name);
     }
+
+    if (prefix) {
+        qd_compose_insert_string(body, "prefix");
+        qd_compose_insert_string(body, prefix);
+    }
+
+    if (distrib) {
+        qd_compose_insert_string(body, "distribution");
+        qd_compose_insert_string(body, distrib);
+    }
+
+    qd_compose_insert_string(body, "waypoint");
+    qd_compose_insert_bool(body, waypoint);
+
+    if (in_phase >= 0) {
+        qd_compose_insert_string(body, "ingressPhase");
+        qd_compose_insert_int(body, in_phase);
+    }
+
+    if (out_phase >= 0) {
+        qd_compose_insert_string(body, "egressPhase");
+        qd_compose_insert_int(body, out_phase);
+    }
+
+    qd_compose_end_map(body);
+
+    int              length = 0;
+    qd_buffer_list_t buffers;
+
+    qd_compose_take_buffers(body, &buffers);
+    qd_compose_free(body);
+
+    qd_buffer_t *buf = DEQ_HEAD(buffers);
+    while (buf) {
+        length += qd_buffer_size(buf);
+        buf = DEQ_NEXT(buf);
+    }
+
+    qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
+    qd_parsed_field_t   *in_body = qd_parse(iter);
+
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_ADDRESS, 0, in_body, 0);
+
+    free(name);
+    free(prefix);
+    free(distrib);
+
+    return qd_error_code();
 }
 
 
-qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity)
+qd_error_t qd_router_configure_link_route(qd_router_t *router, qd_entity_t *entity)
 {
-    char *name          = qd_entity_opt_string(entity, "name", 0);          QD_ERROR_RET();
-    char *address       = qd_entity_opt_string(entity, "address", 0);       QD_ERROR_RET();
-    char *path          = qd_entity_opt_string(entity, "path", 0);          QD_ERROR_RET();
-    char *treatment     = qd_entity_opt_string(entity, "treatment", 0);     QD_ERROR_RET();
-    char *connectors    = qd_entity_opt_string(entity, "connectors", 0);    QD_ERROR_RET();
-    char *containers    = qd_entity_opt_string(entity, "containers", 0);    QD_ERROR_RET();
-    char *route_address = qd_entity_opt_string(entity, "route_address", 0); QD_ERROR_RET();
+    char *name      = qd_entity_opt_string(entity, "name", 0);           QD_ERROR_RET();
+    char *prefix    = qd_entity_get_string(entity, "prefix");            QD_ERROR_RET();
+    char *container = qd_entity_opt_string(entity, "containerId", 0);    QD_ERROR_RET();
+    char *c_name    = qd_entity_opt_string(entity, "connectionName", 0); QD_ERROR_RET();
+    char *distrib   = qd_entity_opt_string(entity, "distribution", 0);   QD_ERROR_RET();
+    char *dir       = qd_entity_opt_string(entity, "dir", 0);            QD_ERROR_RET();
 
     //
     // Formulate this configuration as a route and create it through the core management API.
@@ -221,38 +266,104 @@ qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity)
         qd_compose_insert_string(body, name);
     }
 
-    if (address) {
-        qd_compose_insert_string(body, "address");
-        qd_compose_insert_string(body, address);
+    if (prefix) {
+        qd_compose_insert_string(body, "prefix");
+        qd_compose_insert_string(body, prefix);
+    }
+
+    if (container) {
+        qd_compose_insert_string(body, "containerId");
+        qd_compose_insert_string(body, container);
+    }
+
+    if (c_name) {
+        qd_compose_insert_string(body, "connectionName");
+        qd_compose_insert_string(body, c_name);
+    }
+
+    if (distrib) {
+        qd_compose_insert_string(body, "distribution");
+        qd_compose_insert_string(body, distrib);
+    }
+
+    if (dir) {
+        qd_compose_insert_string(body, "dir");
+        qd_compose_insert_string(body, dir);
+    }
+
+    qd_compose_end_map(body);
+
+    int              length = 0;
+    qd_buffer_list_t buffers;
+
+    qd_compose_take_buffers(body, &buffers);
+    qd_compose_free(body);
+
+    qd_buffer_t *buf = DEQ_HEAD(buffers);
+    while (buf) {
+        length += qd_buffer_size(buf);
+        buf = DEQ_NEXT(buf);
+    }
+
+    qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
+    qd_parsed_field_t   *in_body = qd_parse(iter);
+
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_LINK_ROUTE, 0, in_body, 0);
+
+    free(name);
+    free(prefix);
+    free(container);
+    free(c_name);
+    free(distrib);
+    free(dir);
+
+    return qd_error_code();
+}
+
+
+qd_error_t qd_router_configure_auto_link(qd_router_t *router, qd_entity_t *entity)
+{
+    char *name      = qd_entity_opt_string(entity, "name", 0);           QD_ERROR_RET();
+    char *addr      = qd_entity_get_string(entity, "addr");              QD_ERROR_RET();
+    char *dir       = qd_entity_get_string(entity, "dir");               QD_ERROR_RET();
+    long  phase     = qd_entity_opt_long(entity, "phase", -1);           QD_ERROR_RET();
+    char *container = qd_entity_opt_string(entity, "containerId", 0);    QD_ERROR_RET();
+    char *c_name    = qd_entity_opt_string(entity, "connectionName", 0); QD_ERROR_RET();
+
+    //
+    // Formulate this configuration as a route and create it through the core management API.
+    //
+    qd_composed_field_t *body = qd_compose_subfield(0);
+    qd_compose_start_map(body);
+
+    if (name) {
+        qd_compose_insert_string(body, "name");
+        qd_compose_insert_string(body, name);
     }
 
-    if (path) {
-        qd_compose_insert_string(body, "path");
-        qd_compose_insert_string(body, path);
+    if (addr) {
+        qd_compose_insert_string(body, "addr");
+        qd_compose_insert_string(body, addr);
     }
 
-    if (treatment) {
-        qd_compose_insert_string(body, "treatment");
-        qd_compose_insert_string(body, treatment);
+    if (dir) {
+        qd_compose_insert_string(body, "dir");
+        qd_compose_insert_string(body, dir);
     }
 
-    if (connectors) {
-        qd_compose_insert_string(body, "connectors");
-        qd_compose_start_list(body);
-        qd_router_insert_items(body, connectors);
-        qd_compose_end_list(body);
+    if (phase >= 0) {
+        qd_compose_insert_string(body, "phase");
+        qd_compose_insert_int(body, phase);
     }
 
-    if (containers) {
-        qd_compose_insert_string(body, "containers");
-        qd_compose_start_list(body);
-        qd_router_insert_items(body, containers);
-        qd_compose_end_list(body);
+    if (container) {
+        qd_compose_insert_string(body, "containerId");
+        qd_compose_insert_string(body, container);
     }
 
-    if (route_address) {
-        qd_compose_insert_string(body, "routeAddress");
-        qd_compose_insert_string(body, route_address);
+    if (c_name) {
+        qd_compose_insert_string(body, "connectionName");
+        qd_compose_insert_string(body, c_name);
     }
 
     qd_compose_end_map(body);
@@ -272,15 +383,13 @@ qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_AUTO_LINK, 0, in_body, 0);
 
     free(name);
-    free(address);
-    free(path);
-    free(treatment);
-    free(connectors);
-    free(containers);
-    free(route_address);
+    free(addr);
+    free(dir);
+    free(container);
+    free(c_name);
 
     return qd_error_code();
 }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 1833880..5c20953 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -18,7 +18,7 @@
  */
 
 #include <qpid/dispatch/amqp.h>
-#include "agent_route.h"
+#include "agent_config_address.h"
 #include "agent_address.h"
 #include "agent_link.h"
 #include "router_core_private.h"
@@ -170,26 +170,14 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     qdr_query_t* query = qdr_query(core, context, type, body);
 
     switch (query->entity_type) {
-    case QD_ROUTER_ROUTE:
-        qdr_agent_set_columns(query, attribute_names, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT);
-        break;
-
-    case QD_ROUTER_CONNECTION:
-        break;
-
-    case QD_ROUTER_LINK:
-        qdr_agent_set_columns(query, attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT);
-        break;
-
-    case QD_ROUTER_ADDRESS:
-        qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT);
-        break;
-
-    case QD_ROUTER_EXCHANGE:
-        break;
-
-    case QD_ROUTER_BINDING:
-        break;
+    case QD_ROUTER_CONFIG_ADDRESS:    break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              qdr_agent_set_columns(query, attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT);  break;
+    case QD_ROUTER_ADDRESS:           qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
     }
 
     return query;
@@ -199,12 +187,14 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
 void qdr_query_add_attribute_names(qdr_query_t *query)
 {
     switch (query->entity_type) {
-    case QD_ROUTER_ROUTE: qdr_agent_emit_columns(query, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT); break;
-    case QD_ROUTER_CONNECTION:  break;
-    case QD_ROUTER_LINK:        qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
-    case QD_ROUTER_ADDRESS:     qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
-    case QD_ROUTER_EXCHANGE:    break;
-    case QD_ROUTER_BINDING:     break;
+    case QD_ROUTER_CONFIG_ADDRESS:    break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
+    case QD_ROUTER_ADDRESS:           qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
     }
 }
 
@@ -322,12 +312,14 @@ static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_ROUTE:       break;
-    case QD_ROUTER_CONNECTION:  break;
-    case QD_ROUTER_LINK:        break;
-    case QD_ROUTER_ADDRESS:     qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
-    case QD_ROUTER_EXCHANGE:    break;
-    case QD_ROUTER_BINDING:     break;
+    case QD_ROUTER_CONFIG_ADDRESS:    break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              break;
+    case QD_ROUTER_ADDRESS:           qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
    }
 }
 
@@ -339,13 +331,14 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qd_parsed_field_t       *in_body    = action->args.agent.in_body;
 
     switch (query->entity_type) {
-
-    case QD_ROUTER_ROUTE:       qdra_route_create_CT(core, name, query, in_body); break;
-    case QD_ROUTER_CONNECTION:  break;
-    case QD_ROUTER_LINK:        break;
-    case QD_ROUTER_ADDRESS:     break;
-    case QD_ROUTER_EXCHANGE:    break;
-    case QD_ROUTER_BINDING:     break;
+    case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_create_CT(core, name, query, in_body); break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              break;
+    case QD_ROUTER_ADDRESS:           break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
 
    }
 
@@ -360,12 +353,14 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_ROUTE:       qdra_route_delete_CT(core, query, name, identity); break;
-    case QD_ROUTER_CONNECTION:  break;
-    case QD_ROUTER_LINK:        break;
-    case QD_ROUTER_ADDRESS:     break;
-    case QD_ROUTER_EXCHANGE:    break;
-    case QD_ROUTER_BINDING:     break;
+    case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_delete_CT(core, query, name, identity); break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              break;
+    case QD_ROUTER_ADDRESS:           break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
    }
 }
 
@@ -379,12 +374,14 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_ROUTE:       qdra_route_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_CONNECTION:  break;
-        case QD_ROUTER_LINK:        qdra_link_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_ADDRESS:     qdra_address_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_EXCHANGE:    break;
-        case QD_ROUTER_BINDING:     break;
+        case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_first_CT(core, query, offset); break;
+        case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+        case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+        case QD_ROUTER_CONNECTION:        break;
+        case QD_ROUTER_LINK:              qdra_link_get_first_CT(core, query, offset); break;
+        case QD_ROUTER_ADDRESS:           qdra_address_get_first_CT(core, query, offset); break;
+        case QD_ROUTER_EXCHANGE:          break;
+        case QD_ROUTER_BINDING:           break;
         }
     }
 }
@@ -396,12 +393,14 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_ROUTE:       qdra_route_get_next_CT(core, query); break;
-        case QD_ROUTER_CONNECTION:  break;
-        case QD_ROUTER_LINK:        qdra_link_get_next_CT(core, query); break;
-        case QD_ROUTER_ADDRESS:     qdra_address_get_next_CT(core, query); break;
-        case QD_ROUTER_EXCHANGE:    break;
-        case QD_ROUTER_BINDING:     break;
+        case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_next_CT(core, query); break;
+        case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+        case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+        case QD_ROUTER_CONNECTION:        break;
+        case QD_ROUTER_LINK:              qdra_link_get_next_CT(core, query); break;
+        case QD_ROUTER_ADDRESS:           qdra_address_get_next_CT(core, query); break;
+        case QD_ROUTER_EXCHANGE:          break;
+        case QD_ROUTER_BINDING:           break;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/agent_config_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_address.c b/src/router_core/agent_config_address.c
new file mode 100644
index 0000000..2a86ad8
--- /dev/null
+++ b/src/router_core/agent_config_address.c
@@ -0,0 +1,415 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <qpid/dispatch/ctools.h>
+#include "agent_config_address.h"
+#include <stdio.h>
+
+#define QDR_CONFIG_ADDRESS_NAME          0
+#define QDR_CONFIG_ADDRESS_IDENTITY      1
+#define QDR_CONFIG_ADDRESS_TYPE          2
+#define QDR_CONFIG_ADDRESS_PREFIX        3
+#define QDR_CONFIG_ADDRESS_DISTRIBUTION  4
+#define QDR_CONFIG_ADDRESS_WAYPOINT      5
+#define QDR_CONFIG_ADDRESS_IN_PHASE      6
+#define QDR_CONFIG_ADDRESS_OUT_PHASE     7
+
+const char *qdr_config_address_columns[] =
+    {"name",
+     "identity",
+     "type",
+     "prefix",
+     "distribution",
+     "waypoint",
+     "ingressPhase",
+     "egressPhase",
+     0};
+
+
+static void qdr_config_address_insert_column_CT(qdr_address_config_t *addr, int col, qd_composed_field_t *body, bool as_map)
+{
+    const char *text = 0;
+    const char *key;
+
+    if (as_map)
+        qd_compose_insert_string(body, qdr_config_address_columns[col]);
+
+    switch(col) {
+    case QDR_CONFIG_ADDRESS_NAME:
+        if (addr->name)
+            qd_compose_insert_string(body, addr->name);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_ADDRESS_IDENTITY: {
+        char id_str[100];
+        snprintf(id_str, 100, "%ld", addr->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+    }
+
+    case QDR_CONFIG_ADDRESS_TYPE:
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.config.address");
+        break;
+
+    case QDR_CONFIG_ADDRESS_PREFIX:
+        key = (const char*) qd_hash_key_by_handle(addr->hash_handle);
+        if (key && key[0] == 'Z')
+            qd_compose_insert_string(body, &key[1]);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_ADDRESS_DISTRIBUTION:
+        switch (addr->treatment) {
+        case QD_TREATMENT_MULTICAST_FLOOD:
+        case QD_TREATMENT_MULTICAST_ONCE:   text = "multicast"; break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  text = "closest";   break;
+        case QD_TREATMENT_ANYCAST_BALANCED: text = "balanced";  break;
+        default:
+            text = 0;
+        }
+
+        if (text)
+            qd_compose_insert_string(body, text);
+        else
+            qd_compose_insert_null(body);
+
+        break;
+
+    case QDR_CONFIG_ADDRESS_WAYPOINT:
+        qd_compose_insert_bool(body, addr->in_phase == 0 && addr->out_phase == 1);
+        break;
+
+    case QDR_CONFIG_ADDRESS_IN_PHASE:
+        qd_compose_insert_int(body, addr->in_phase);
+        break;
+
+    case QDR_CONFIG_ADDRESS_OUT_PHASE:
+        qd_compose_insert_int(body, addr->out_phase);
+        break;
+    }
+}
+
+
+static void qdr_agent_write_config_address_CT(qdr_query_t *query,  qdr_address_config_t *addr)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_config_address_insert_column_CT(addr, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+
+static void qdr_manage_advance_config_address_CT(qdr_query_t *query, qdr_address_config_t *addr)
+{
+    query->next_offset++;
+    addr = DEQ_NEXT(addr);
+    query->more = !!addr;
+}
+
+
+void qdra_config_address_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->addr_config)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_address_config_t *addr = DEQ_HEAD(core->addr_config);
+    for (int i = 0; i < offset && addr; i++)
+        addr = DEQ_NEXT(addr);
+    assert(addr);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_config_address_CT(query, addr);
+
+    //
+    // Advance to the next address
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_config_address_CT(query, addr);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_config_address_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_address_config_t *addr = 0;
+
+    if (query->next_offset < DEQ_SIZE(core->addr_config)) {
+        addr = DEQ_HEAD(core->addr_config);
+        for (int i = 0; i < query->next_offset && addr; i++)
+            addr = DEQ_NEXT(addr);
+    }
+
+    if (addr) {
+        //
+        // Write the columns of the addr entity into the response body.
+        //
+        qdr_agent_write_config_address_CT(query, addr);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_config_address_CT(query, addr);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+static qd_address_treatment_t qdra_address_treatment_CT(qd_parsed_field_t *field)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multicast"))    return QD_TREATMENT_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "closest"))      return QD_TREATMENT_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "balanced"))     return QD_TREATMENT_ANYCAST_BALANCED;
+    }
+    return QD_TREATMENT_ANYCAST_BALANCED;
+}
+
+
+static qdr_address_config_t *qdr_address_config_find_by_identity_CT(qdr_core_t *core, qd_field_iterator_t *identity)
+{
+    if (!identity)
+        return 0;
+
+    qdr_address_config_t *rc = DEQ_HEAD(core->addr_config);
+    while (rc) {
+        // Convert the passed in identity to a char*
+        char id[100];
+        snprintf(id, 100, "%ld", rc->identity);
+        if (qd_field_iterator_equal(identity, (const unsigned char*) id))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+
+}
+
+
+static qdr_address_config_t *qdr_address_config_find_by_name_CT(qdr_core_t *core, qd_field_iterator_t *name)
+{
+    if (!name)
+        return 0;
+
+    qdr_address_config_t *rc = DEQ_HEAD(core->addr_config);
+    while (rc) { // Sometimes the name can be null
+        if (rc->name && qd_field_iterator_equal(name, (const unsigned char*) rc->name))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+}
+
+
+void qdra_config_address_delete_CT(qdr_core_t          *core,
+                                   qdr_query_t         *query,
+                                   qd_field_iterator_t *name,
+                                   qd_field_iterator_t *identity)
+{
+    qdr_address_config_t *addr = 0;
+
+    if (!name && !identity)
+        query->status = QD_AMQP_BAD_REQUEST;
+    else {
+        if (identity)
+            addr = qdr_address_config_find_by_identity_CT(core, identity);
+        else if (name)
+            addr = qdr_address_config_find_by_name_CT(core, name);
+
+        if (addr) {
+            //
+            // Remove the address from the list and the hash index.
+            //
+            qd_hash_remove_by_handle(core->addr_hash, addr->hash_handle);
+            DEQ_REMOVE(core->addr_config, addr);
+
+            //
+            // Free resources associated with this address.
+            //
+            if (addr->name)
+                free(addr->name);
+            free_qdr_address_config_t(addr);
+
+            query->status = QD_AMQP_NO_CONTENT;
+        } else
+            query->status = QD_AMQP_NOT_FOUND;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+void qdra_config_address_create_CT(qdr_core_t          *core,
+                                   qd_field_iterator_t *name,
+                                   qdr_query_t         *query,
+                                   qd_parsed_field_t   *in_body)
+{
+    while (true) {
+        //
+        // Ensure there isn't a duplicate name and that the body is a map
+        //
+        qdr_address_config_t *addr = DEQ_HEAD(core->addr_config);
+        while (addr) {
+            if (name && addr->name && qd_field_iterator_equal(name, (const unsigned char*) addr->name))
+                break;
+            addr = DEQ_NEXT(addr);
+        }
+
+        if (!!addr) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Name conflicts with an existing entity";
+            break;
+        }
+
+        if (!qd_parse_is_map(in_body)) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        //
+        // Extract the fields from the request
+        //
+        qd_parsed_field_t *prefix_field    = qd_parse_value_by_key(in_body, qdr_config_address_columns[QDR_CONFIG_ADDRESS_PREFIX]);
+        qd_parsed_field_t *distrib_field   = qd_parse_value_by_key(in_body, qdr_config_address_columns[QDR_CONFIG_ADDRESS_DISTRIBUTION]);
+        qd_parsed_field_t *waypoint_field  = qd_parse_value_by_key(in_body, qdr_config_address_columns[QDR_CONFIG_ADDRESS_WAYPOINT]);
+        qd_parsed_field_t *in_phase_field  = qd_parse_value_by_key(in_body, qdr_config_address_columns[QDR_CONFIG_ADDRESS_IN_PHASE]);
+        qd_parsed_field_t *out_phase_field = qd_parse_value_by_key(in_body, qdr_config_address_columns[QDR_CONFIG_ADDRESS_OUT_PHASE]);
+
+        //
+        // Prefix field is mandatory.  Fail if it is not here.
+        //
+        if (!prefix_field) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        //
+        // Ensure that there isn't another configured address with the same prefix
+        //
+        qd_field_iterator_t *iter = qd_parse_raw(prefix_field);
+        qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+        qd_address_iterator_override_prefix(iter, 'Z');
+        addr = 0;
+        qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+        if (!!addr) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Address prefix conflicts with an existing entity";
+            break;
+        }
+
+        bool waypoint  = waypoint_field  ? qd_parse_as_bool(waypoint_field) : false;
+        int  in_phase  = in_phase_field  ? qd_parse_as_int(in_phase_field)  : -1;
+        int  out_phase = out_phase_field ? qd_parse_as_int(in_phase_field)  : -1;
+
+        //
+        // Handle the address-phasing logic.  If the phases are provided, use them.  Otherwise
+        // use the waypoint flag to set the most common defaults.
+        //
+        if (in_phase == -1 && out_phase == -1) {
+            in_phase  = 0;
+            out_phase = waypoint ? 1 : 0;
+        }
+
+        //
+        // Validate the phase values
+        //
+        if (in_phase < 0 || in_phase > 9 || out_phase < 0 || out_phase > 9) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Phase values must be between 0 and 9";
+            break;
+        }
+
+        //
+        // The request is good.  Create the entity and insert it into the hash index and list.
+        //
+        addr = new_qdr_address_config_t();
+        DEQ_ITEM_INIT(addr);
+        addr->name      = name ? (char*) qd_field_iterator_copy(name) : 0;
+        addr->identity  = qdr_identifier(core);
+        addr->treatment = qdra_address_treatment_CT(distrib_field);
+        addr->in_phase  = in_phase;
+        addr->out_phase = out_phase;
+
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addr_config, addr);
+
+        //
+        // Compose the result map for the response.
+        //
+        if (query->body) {
+            qd_compose_start_map(query->body);
+            for (int col = 0; col < QDR_CONFIG_ADDRESS_COLUMN_COUNT; col++)
+                qdr_config_address_insert_column_CT(addr, col, query->body, true);
+            qd_compose_end_map(query->body);
+        }
+
+        query->status = QD_AMQP_CREATED;
+        break;
+    }
+
+    //
+    // Enqueue the response if there is a body. If there is no body, this is a management
+    // operation created internally by the configuration file parser.
+    //
+    if (query->body) {
+        //
+        // If there was an error in processing the create, insert a NULL value into the body.
+        //
+        if (query->status.status / 100 > 2)
+            qd_compose_insert_null(query->body);
+        qdr_agent_enqueue_response_CT(core, query);
+    } else
+        free_qdr_query_t(query);
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/agent_config_address.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_address.h b/src/router_core/agent_config_address.h
new file mode 100644
index 0000000..97d863b
--- /dev/null
+++ b/src/router_core/agent_config_address.h
@@ -0,0 +1,35 @@
+#ifndef qdr_agent_config_address
+#define qdr_agent_config_address 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_config_address_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
+void qdra_config_address_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_config_address_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_address_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_address_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
+                                qd_field_iterator_t *identity);
+
+#define QDR_CONFIG_ADDRESS_COLUMN_COUNT 8
+
+const char *qdr_config_address_columns[QDR_CONFIG_ADDRESS_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
deleted file mode 100644
index 383d1bc..0000000
--- a/src/router_core/agent_route.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <qpid/dispatch/ctools.h>
-#include "agent_route.h"
-#include "route_control.h"
-#include <stdio.h>
-
-#define QDR_ROUTE_NAME          0
-#define QDR_ROUTE_IDENTITY      1
-#define QDR_ROUTE_TYPE          2
-#define QDR_ROUTE_ADDRESS       3
-#define QDR_ROUTE_PATH          4
-#define QDR_ROUTE_TREATMENT     5
-#define QDR_ROUTE_CONNECTORS    6
-#define QDR_ROUTE_CONTAINERS    7
-#define QDR_ROUTE_ROUTE_ADDRESS 8
-
-const char *qdr_route_columns[] =
-    {"name",
-     "identity",
-     "type",
-     "address",
-     "path",
-     "treatment",
-     "connectors",
-     "containers",
-     "routeAddress",
-     0};
-
-
-static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_composed_field_t *body, bool as_map)
-{
-    const char *text = 0;
-    qdr_route_active_t *active;
-    const char         *key;
-
-    if (as_map)
-        qd_compose_insert_string(body, qdr_route_columns[col]);
-
-    switch(col) {
-    case QDR_ROUTE_NAME:
-        if (route->name)
-            qd_compose_insert_string(body, route->name);
-        else
-            qd_compose_insert_null(body);
-        break;
-
-    case QDR_ROUTE_IDENTITY: {
-        char id_str[100];
-        snprintf(id_str, 100, "%ld", route->identity);
-        qd_compose_insert_string(body, id_str);
-        break;
-    }
-
-    case QDR_ROUTE_TYPE:
-        qd_compose_insert_string(body, "org.apache.qpid.dispatch.route");
-        break;
-
-    case QDR_ROUTE_ADDRESS:
-        if (route->addr_config)
-            qd_compose_insert_string(body, (const char*) qd_hash_key_by_handle(route->addr_config->hash_handle));
-        else
-            qd_compose_insert_null(body);
-        break;
-
-    case QDR_ROUTE_PATH:
-        switch (route->path) {
-        case QDR_ROUTE_PATH_DIRECT:   text = "direct";  break;
-        case QDR_ROUTE_PATH_SOURCE:   text = "source";  break;
-        case QDR_ROUTE_PATH_SINK:     text = "sink";    break;
-        case QDR_ROUTE_PATH_WAYPOINT: text = "waypoint"; break;
-        }
-        qd_compose_insert_string(body, text);
-        break;
-
-    case QDR_ROUTE_TREATMENT:
-        switch (route->treatment) {
-        case QD_TREATMENT_MULTICAST_FLOOD:
-        case QD_TREATMENT_MULTICAST_ONCE:   text = "multicast";    break;
-        case QD_TREATMENT_ANYCAST_CLOSEST:  text = "closest";      break;
-        case QD_TREATMENT_ANYCAST_BALANCED: text = "balanced";     break;
-        case QD_TREATMENT_LINK_BALANCED:    text = "linkBalanced"; break;
-        }
-        qd_compose_insert_string(body, text);
-        break;
-
-    case QDR_ROUTE_CONNECTORS:
-        qd_compose_start_list(body);
-        active = DEQ_HEAD(route->active_list);
-        while(active) {
-            key = (const char*) qd_hash_key_by_handle(active->conn_id->hash_handle);
-            if (key && key[0] == 'L')
-                qd_compose_insert_string(body, &key[1]);
-            active = DEQ_NEXT(active);
-        }
-        qd_compose_end_list(body);
-        break;
-
-    case QDR_ROUTE_CONTAINERS:
-        qd_compose_start_list(body);
-        active = DEQ_HEAD(route->active_list);
-        while(active) {
-            key = (const char*) qd_hash_key_by_handle(active->conn_id->hash_handle);
-            if (key && key[0] == 'C')
-                qd_compose_insert_string(body, &key[1]);
-            active = DEQ_NEXT(active);
-        }
-        qd_compose_end_list(body);
-        break;
-
-    case QDR_ROUTE_ROUTE_ADDRESS:
-        qd_compose_insert_null(body);
-        break;
-    }
-}
-
-
-static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_config_t *route)
-{
-    qd_composed_field_t *body = query->body;
-
-    qd_compose_start_list(body);
-    int i = 0;
-    while (query->columns[i] >= 0) {
-        qdr_route_insert_column_CT(route, query->columns[i], body, false);
-        i++;
-    }
-    qd_compose_end_list(body);
-}
-
-static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_config_t *route)
-{
-    query->next_offset++;
-    route = DEQ_NEXT(route);
-    query->more = !!route;
-}
-
-
-void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
-{
-    //
-    // Queries that get this far will always succeed.
-    //
-    query->status = QD_AMQP_OK;
-
-    //
-    // If the offset goes beyond the set of objects, end the query now.
-    //
-    if (offset >= DEQ_SIZE(core->route_config)) {
-        query->more = false;
-        qdr_agent_enqueue_response_CT(core, query);
-        return;
-    }
-
-    //
-    // Run to the object at the offset.
-    //
-    qdr_route_config_t *route = DEQ_HEAD(core->route_config);
-    for (int i = 0; i < offset && route; i++)
-        route = DEQ_NEXT(route);
-    assert(route);
-
-    //
-    // Write the columns of the object into the response body.
-    //
-    qdr_agent_write_route_CT(query, route);
-
-    //
-    // Advance to the next address
-    //
-    query->next_offset = offset;
-    qdr_manage_advance_route_CT(query, route);
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
-{
-    qdr_route_config_t *route = 0;
-
-    if (query->next_offset < DEQ_SIZE(core->route_config)) {
-        route = DEQ_HEAD(core->route_config);
-        for (int i = 0; i < query->next_offset && route; i++)
-            route = DEQ_NEXT(route);
-    }
-
-    if (route) {
-        //
-        // Write the columns of the route entity into the response body.
-        //
-        qdr_agent_write_route_CT(query, route);
-
-        //
-        // Advance to the next object
-        //
-        qdr_manage_advance_route_CT(query, route);
-    } else
-        query->more = false;
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
-{
-    if (field) {
-        qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multicast"))    return QD_TREATMENT_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "closest"))      return QD_TREATMENT_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "balanced"))     return QD_TREATMENT_ANYCAST_BALANCED;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "linkBalanced")) return QD_TREATMENT_LINK_BALANCED;
-    }
-    return QD_TREATMENT_ANYCAST_BALANCED;
-}
-
-static qdr_route_config_t *qdr_route_config_find_by_identity(qdr_core_t *core, qd_field_iterator_t *identity) {
-    if (!identity)
-        return 0;
-
-    qdr_route_config_list_t  route_config = core->route_config;
-
-    qdr_route_config_t *rc = DEQ_HEAD(route_config);
-
-    while (rc) {
-        // Convert the passed in identity to a char*
-        char id[100];
-        snprintf(id, 100, "%ld", rc->identity);
-        if (qd_field_iterator_equal(identity, (const unsigned char *)id))
-            break;
-        rc = DEQ_NEXT(rc);
-    }
-
-    return rc;
-
-}
-
-static qdr_route_config_t *qdr_route_config_find_by_name(qdr_core_t *core, qd_field_iterator_t *name) {
-    if (!name)
-        return 0;
-
-    qdr_route_config_list_t  route_config = core->route_config;
-
-    qdr_route_config_t *rc = DEQ_HEAD(route_config);
-
-    while (rc) {// Sometimes the name can be null
-        if (rc->name && qd_field_iterator_equal(name, (const unsigned char *)rc->name))
-            break;
-        rc = DEQ_NEXT(rc);
-    }
-
-    return rc;
-
-}
-
-static void qdra_route_delete_route_set_status(qdr_core_t *core, qdr_query_t *query, qdr_route_config_t *route)
-{
-    if (route) {
-        qdr_route_delete_CT(core, route);
-        query->status = QD_AMQP_NO_CONTENT;
-    }
-    else {
-        query->status = QD_AMQP_NOT_FOUND;
-    }
-}
-
-void qdra_route_delete_CT(qdr_core_t          *core,
-                          qdr_query_t          *query,
-                          qd_field_iterator_t *name,
-                          qd_field_iterator_t *identity)
-{
-    if (identity) {
-         qdr_route_config_t *route = qdr_route_config_find_by_identity(core, identity);
-         qdra_route_delete_route_set_status(core, query, route);
-    }
-    else if (name) {
-        qdr_route_config_t *route = qdr_route_config_find_by_name(core, name);
-        qdra_route_delete_route_set_status(core, query, route);
-    }
-    else { // No name and no identity
-        query->status = QD_AMQP_BAD_REQUEST;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
-                          qdr_query_t *query, qd_parsed_field_t *in_body)
-{
-    // TODO - Validation
-    //    - No duplicate names
-    //    - For "direct" path, no containers or connections
-    //    - For "direct" path, no link-* treatments
-
-    while (true) {
-        //
-        // Validation of the request occurs here.  Make sure the body is a map.
-        //
-        if (!qd_parse_is_map(in_body)) {
-            query->status = QD_AMQP_BAD_REQUEST;
-            break;
-        }
-
-        //
-        // Extract the fields from the request
-        //
-        qd_parsed_field_t *addr_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
-        qd_parsed_field_t *path_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_PATH]);
-        qd_parsed_field_t *conn_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTORS]);
-        qd_parsed_field_t *cont_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONTAINERS]);
-        qd_parsed_field_t *treatment_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
-        qd_parsed_field_t *route_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ROUTE_ADDRESS]);
-
-        //
-        // Determine the path, which defaults to Direct
-        //
-        qdr_route_path_t path = QDR_ROUTE_PATH_DIRECT;
-        if (path_field) {
-            qd_field_iterator_t *path_iter = qd_parse_raw(path_field);
-            if  (qd_field_iterator_equal(path_iter, (unsigned char*) "direct"))
-                path = QDR_ROUTE_PATH_DIRECT;
-            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "source"))
-                path = QDR_ROUTE_PATH_SOURCE;
-            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "sink"))
-                path = QDR_ROUTE_PATH_SINK;
-            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "waypoint"))
-                path = QDR_ROUTE_PATH_WAYPOINT;
-            else {
-                query->status = QD_AMQP_BAD_REQUEST;
-                break;
-            }
-        }
-
-        qd_address_treatment_t treatment = qdra_treatment(treatment_field);
-
-        //
-        // Ask the route_control module to create the route object and put into effect any needed
-        // side effects.
-        //
-        qdr_route_config_t *route;
-        const char *error = qdr_route_create_CT(core, name, path, treatment, addr_field, route_addr_field, &route);
-
-        if (error) {
-            query->status.status      = 400;
-            query->status.description = error;
-            break;
-        }
-
-        //
-        // Add the initial list of connection labels to the route
-        //
-        if (conn_field && qd_parse_is_list(conn_field)) {
-            uint32_t count = qd_parse_sub_count(conn_field);
-            for (uint32_t i = 0; i < count; i++) {
-                qd_parsed_field_t *conn_label = qd_parse_sub_value(conn_field, i);
-                qdr_route_connection_add_CT(core, route, conn_label, false);
-            }
-        }
-
-        //
-        // Add the initial list of container IDs to the route
-        //
-        if (cont_field && qd_parse_is_list(cont_field)) {
-            uint32_t count = qd_parse_sub_count(cont_field);
-            for (uint32_t i = 0; i < count; i++) {
-                qd_parsed_field_t *cont_id = qd_parse_sub_value(cont_field, i);
-                qdr_route_connection_add_CT(core, route, cont_id, true);
-            }
-        }
-
-        //
-        // Compose the result map for the response.
-        //
-        if (query->body) {
-            qd_compose_start_map(query->body);
-            for (int col = 0; col < QDR_ROUTE_COLUMN_COUNT; col++)
-                qdr_route_insert_column_CT(route, col, query->body, true);
-            qd_compose_end_map(query->body);
-        }
-
-        query->status = QD_AMQP_CREATED;
-        break;
-    }
-
-    //
-    // Enqueue the response if there is a body. If there is no body, this is a management
-    // operation created internally by the configuration file parser.
-    //
-    if (query->body) {
-        if (query->status.status / 100 > 2)
-            qd_compose_insert_null(query->body);
-        qdr_agent_enqueue_response_CT(core, query);
-    } else
-        free_qdr_query_t(query);
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/agent_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.h b/src/router_core/agent_route.h
deleted file mode 100644
index ec8d6ba..0000000
--- a/src/router_core/agent_route.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef qdr_agent_route
-#define qdr_agent_route 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "router_core_private.h"
-
-void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
-void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query);
-void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
-                                qd_field_iterator_t *identity);
-
-#define QDR_ROUTE_COLUMN_COUNT 9
-
-const char *qdr_route_columns[QDR_ROUTE_COLUMN_COUNT + 1];
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 82f8c53..6a8e1a3 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -39,10 +39,11 @@ const char *IDENTITY = "identity";
 const char *OPERATION = "operation";
 const char *ATTRIBUTE_NAMES = "attributeNames";
 
-const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.route";
-const unsigned char *waypoint_entity_type = (unsigned char*) "org.apache.qpid.dispatch.waypoint";
-const unsigned char *address_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.address";
-const unsigned char *link_entity_type    = (unsigned char*) "org.apache.qpid.dispatch.router.link";
+const unsigned char *config_address_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.config.address";
+const unsigned char *link_route_entity_type     = (unsigned char*) "org.apache.qpid.dispatch.router.config.linkRoute";
+const unsigned char *auto_link_entity_type      = (unsigned char*) "org.apache.qpid.dispatch.router.config.autoLink";
+const unsigned char *address_entity_type        = (unsigned char*) "org.apache.qpid.dispatch.router.address";
+const unsigned char *link_entity_type           = (unsigned char*) "org.apache.qpid.dispatch.router.link";
 
 const char * const status_description = "statusDescription";
 const char * const correlation_id = "correlation-id";
@@ -52,14 +53,11 @@ const char * const status_code = "statusCode";
 const char * MANAGEMENT_INTERNAL = "_local/$_management_internal";
 
 //TODO - Move these to amqp.h
-const unsigned char *MANAGEMENT_QUERY                  = (unsigned char*) "QUERY";
-const unsigned char *MANAGEMENT_CREATE                 = (unsigned char*) "CREATE";
-const unsigned char *MANAGEMENT_READ                   = (unsigned char*) "READ";
-const unsigned char *MANAGEMENT_UPDATE                 = (unsigned char*) "UPDATE";
-const unsigned char *MANAGEMENT_DELETE                 = (unsigned char*) "DELETE";
-const unsigned char *MANAGEMENT_ADD_CONTAINER          = (unsigned char*) "ADD-CONTAINER";
-const unsigned char *MANAGEMENT_REMOVE_CONTAINER_CLEAN = (unsigned char*) "REMOVE-CONTAINER-CLEAN";
-const unsigned char *MANAGEMENT_REMOVE_CONTAINER_HARD  = (unsigned char*) "REMOVE-CONTAINER-HARD";
+const unsigned char *MANAGEMENT_QUERY  = (unsigned char*) "QUERY";
+const unsigned char *MANAGEMENT_CREATE = (unsigned char*) "CREATE";
+const unsigned char *MANAGEMENT_READ   = (unsigned char*) "READ";
+const unsigned char *MANAGEMENT_UPDATE = (unsigned char*) "UPDATE";
+const unsigned char *MANAGEMENT_DELETE = (unsigned char*) "DELETE";
 
 
 typedef enum {
@@ -67,10 +65,7 @@ typedef enum {
     QD_ROUTER_OPERATION_CREATE,
     QD_ROUTER_OPERATION_READ,
     QD_ROUTER_OPERATION_UPDATE,
-    QD_ROUTER_OPERATION_DELETE,
-    QD_ROUTER_OPERATION_ADD_CONTAINER,
-    QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN,
-    QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD
+    QD_ROUTER_OPERATION_DELETE
 } qd_router_operation_type_t;
 
 
@@ -380,8 +375,12 @@ static bool qd_can_handle_request(qd_parsed_field_t           *properties_fld,
         *entity_type = QD_ROUTER_ADDRESS;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), link_entity_type))
         *entity_type = QD_ROUTER_LINK;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), route_entity_type))
-        *entity_type = QD_ROUTER_ROUTE;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), config_address_entity_type))
+        *entity_type = QD_ROUTER_CONFIG_ADDRESS;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), link_route_entity_type))
+        *entity_type = QD_ROUTER_CONFIG_LINK_ROUTE;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), auto_link_entity_type))
+        *entity_type = QD_ROUTER_CONFIG_AUTO_LINK;
     else
         return false;
 
@@ -401,12 +400,6 @@ static bool qd_can_handle_request(qd_parsed_field_t           *properties_fld,
         (*operation_type) = QD_ROUTER_OPERATION_UPDATE;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_DELETE))
         (*operation_type) = QD_ROUTER_OPERATION_DELETE;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_ADD_CONTAINER) && *entity_type == QD_ROUTER_ROUTE)
-        (*operation_type) = QD_ROUTER_OPERATION_ADD_CONTAINER;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_CLEAN) && *entity_type == QD_ROUTER_ROUTE)
-        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_HARD) && *entity_type == QD_ROUTER_ROUTE)
-        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD;
     else
         // This is an unknown operation type. cannot be handled, return false.
         return false;
@@ -466,10 +459,6 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
         case QD_ROUTER_OPERATION_DELETE:
             qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
             break;
-        case QD_ROUTER_OPERATION_ADD_CONTAINER:
-        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN:
-        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD:
-            break;
         }
     } else {
         //


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


[32/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added configuration/management hooks for autoLink

Posted by tr...@apache.org.
DISPATCH-179 - Added configuration/management hooks for autoLink


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

Branch: refs/heads/master
Commit: 2aa0e26a7646110f6b9cfe66fe0f7a41a638f409
Parents: 56c5a93
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 10:28:43 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 10:28:43 2016 -0400

----------------------------------------------------------------------
 src/CMakeLists.txt                        |   1 +
 src/router_core/agent.c                   |  13 +-
 src/router_core/agent_config_auto_link.c  | 397 +++++++++++++++++++++++++
 src/router_core/agent_config_auto_link.h  |  35 +++
 src/router_core/agent_config_link_route.c |   2 +-
 src/router_core/agent_link.c              |   8 +-
 src/router_core/connections.c             |   4 +-
 src/router_core/forwarder.c               |   2 +-
 src/router_core/route_control.c           |   9 +-
 src/router_core/route_control.h           |   9 +-
 src/router_core/router_core_private.h     |   2 +-
 11 files changed, 457 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fbcbd6e..e901335 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -67,6 +67,7 @@ set(qpid_dispatch_SOURCES
   router_core/agent.c
   router_core/agent_address.c
   router_core/agent_config_address.c
+  router_core/agent_config_auto_link.c
   router_core/agent_config_link_route.c
   router_core/agent_link.c
   router_core/connections.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 450293a..485d738 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -20,6 +20,7 @@
 #include <qpid/dispatch/amqp.h>
 #include "agent_config_address.h"
 #include "agent_config_link_route.h"
+#include "agent_config_auto_link.h"
 #include "agent_address.h"
 #include "agent_link.h"
 #include "router_core_private.h"
@@ -180,7 +181,7 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_set_columns(query, attribute_names, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT);  break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_set_columns(query, attribute_names, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT);  break;
-    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  qdr_agent_set_columns(query, attribute_names, qdr_config_auto_link_columns, QDR_CONFIG_AUTO_LINK_COLUMN_COUNT);  break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              qdr_agent_set_columns(query, attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT);  break;
     case QD_ROUTER_ADDRESS:           qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
@@ -197,7 +198,7 @@ void qdr_query_add_attribute_names(qdr_query_t *query)
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_emit_columns(query, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT); break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_emit_columns(query, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT); break;
-    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  qdr_agent_emit_columns(query, qdr_config_auto_link_columns, QDR_CONFIG_AUTO_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:           qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
@@ -341,7 +342,7 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_create_CT(core, name, query, in_body); break;
-    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  qdra_config_auto_link_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              break;
     case QD_ROUTER_ADDRESS:           break;
@@ -363,7 +364,7 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_delete_CT(core, query, name, identity); break;
     case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_delete_CT(core, query, name, identity); break;
-    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  qdra_config_auto_link_delete_CT(core, query, name, identity); break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              break;
     case QD_ROUTER_ADDRESS:           break;
@@ -405,7 +406,7 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
         switch (query->entity_type) {
         case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+        case QD_ROUTER_CONFIG_AUTO_LINK:  qdra_config_auto_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_LINK:              qdra_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_ADDRESS:           qdra_address_get_first_CT(core, query, offset); break;
@@ -424,7 +425,7 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
         switch (query->entity_type) {
         case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_next_CT(core, query); break;
         case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_next_CT(core, query); break;
-        case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+        case QD_ROUTER_CONFIG_AUTO_LINK:  qdra_config_auto_link_get_next_CT(core, query); break;
         case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_LINK:              qdra_link_get_next_CT(core, query); break;
         case QD_ROUTER_ADDRESS:           qdra_address_get_next_CT(core, query); break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/agent_config_auto_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.c b/src/router_core/agent_config_auto_link.c
new file mode 100644
index 0000000..6f8ef8a
--- /dev/null
+++ b/src/router_core/agent_config_auto_link.c
@@ -0,0 +1,397 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <qpid/dispatch/ctools.h>
+#include "agent_config_auto_link.h"
+#include "route_control.h"
+#include <stdio.h>
+
+#define QDR_CONFIG_AUTO_LINK_NAME          0
+#define QDR_CONFIG_AUTO_LINK_IDENTITY      1
+#define QDR_CONFIG_AUTO_LINK_TYPE          2
+#define QDR_CONFIG_AUTO_LINK_ADDR          3
+#define QDR_CONFIG_AUTO_LINK_DIR           4
+#define QDR_CONFIG_AUTO_LINK_PHASE         5
+#define QDR_CONFIG_AUTO_LINK_CONNECTION    6
+#define QDR_CONFIG_AUTO_LINK_CONTAINER_ID  7
+#define QDR_CONFIG_AUTO_LINK_LINK_REF      8
+
+const char *qdr_config_auto_link_columns[] =
+    {"name",
+     "identity",
+     "type",
+     "addr",
+     "dir",
+     "phase",
+     "containerId",
+     "connection",
+     "linkRef",
+     0};
+
+
+static void qdr_config_auto_link_insert_column_CT(qdr_auto_link_t *al, int col, qd_composed_field_t *body, bool as_map)
+{
+    const char *text = 0;
+    const char *key;
+    char id_str[100];
+
+    if (as_map)
+        qd_compose_insert_string(body, qdr_config_auto_link_columns[col]);
+
+    switch(col) {
+    case QDR_CONFIG_AUTO_LINK_NAME:
+        if (al->name)
+            qd_compose_insert_string(body, al->name);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_IDENTITY:
+        snprintf(id_str, 100, "%ld", al->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_TYPE:
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.config.autoLink");
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_ADDR:
+        key = (const char*) qd_hash_key_by_handle(al->addr->hash_handle);
+        if (key && key[0] == 'M')
+            qd_compose_insert_string(body, &key[1]);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_DIR:
+        text = al->dir == QD_INCOMING ? "in" : "out";
+        qd_compose_insert_string(body, text);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_PHASE:
+        qd_compose_insert_int(body, al->phase);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_CONNECTION:
+    case QDR_CONFIG_AUTO_LINK_CONTAINER_ID:
+        if (al->conn_id) {
+            key = (const char*) qd_hash_key_by_handle(al->conn_id->hash_handle);
+            if (key && key[0] == 'L' && col == QDR_CONFIG_AUTO_LINK_CONNECTION) {
+                qd_compose_insert_string(body, &key[1]);
+                break;
+            }
+            if (key && key[0] == 'C' && col == QDR_CONFIG_AUTO_LINK_CONTAINER_ID) {
+                qd_compose_insert_string(body, &key[1]);
+                break;
+            }
+        }
+        qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_LINK_REF:
+        if (al->link) {
+            snprintf(id_str, 100, "%ld", al->link->identity);
+            qd_compose_insert_string(body, id_str);
+        } else
+            qd_compose_insert_null(body);
+    }
+}
+
+
+static void qdr_agent_write_config_auto_link_CT(qdr_query_t *query,  qdr_auto_link_t *al)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_config_auto_link_insert_column_CT(al, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+
+static void qdr_manage_advance_config_auto_link_CT(qdr_query_t *query, qdr_auto_link_t *al)
+{
+    query->next_offset++;
+    al = DEQ_NEXT(al);
+    query->more = !!al;
+}
+
+
+void qdra_config_auto_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->auto_links)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_auto_link_t *al = DEQ_HEAD(core->auto_links);
+    for (int i = 0; i < offset && al; i++)
+        al = DEQ_NEXT(al);
+    assert(al);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_config_auto_link_CT(query, al);
+
+    //
+    // Advance to the next auto_link
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_config_auto_link_CT(query, al);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_config_auto_link_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_auto_link_t *al = 0;
+
+    if (query->next_offset < DEQ_SIZE(core->auto_links)) {
+        al = DEQ_HEAD(core->auto_links);
+        for (int i = 0; i < query->next_offset && al; i++)
+            al = DEQ_NEXT(al);
+    }
+
+    if (al) {
+        //
+        // Write the columns of the addr entity into the response body.
+        //
+        qdr_agent_write_config_auto_link_CT(query, al);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_config_auto_link_CT(query, al);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+static const char *qdra_auto_link_direction_CT(qd_parsed_field_t *field, qd_direction_t *dir)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "in")) {
+            *dir = QD_INCOMING;
+            return 0;
+        } else if (qd_field_iterator_equal(iter, (unsigned char*) "out")) {
+            *dir = QD_OUTGOING;
+            return 0;
+        }
+        return "Invalid value for 'dir'";
+    }
+    return "Missing value for 'dir'";
+}
+
+
+static qdr_auto_link_t *qdr_auto_link_config_find_by_identity_CT(qdr_core_t *core, qd_field_iterator_t *identity)
+{
+    if (!identity)
+        return 0;
+
+    qdr_auto_link_t *rc = DEQ_HEAD(core->auto_links);
+    while (rc) {
+        // Convert the passed in identity to a char*
+        char id[100];
+        snprintf(id, 100, "%ld", rc->identity);
+        if (qd_field_iterator_equal(identity, (const unsigned char*) id))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+
+}
+
+
+static qdr_auto_link_t *qdr_auto_link_config_find_by_name_CT(qdr_core_t *core, qd_field_iterator_t *name)
+{
+    if (!name)
+        return 0;
+
+    qdr_auto_link_t *rc = DEQ_HEAD(core->auto_links);
+    while (rc) { // Sometimes the name can be null
+        if (rc->name && qd_field_iterator_equal(name, (const unsigned char*) rc->name))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+}
+
+
+void qdra_config_auto_link_delete_CT(qdr_core_t          *core,
+                                      qdr_query_t         *query,
+                                      qd_field_iterator_t *name,
+                                      qd_field_iterator_t *identity)
+{
+    qdr_auto_link_t *al = 0;
+
+    if (!name && !identity)
+        query->status = QD_AMQP_BAD_REQUEST;
+    else {
+        if (identity)
+            al = qdr_auto_link_config_find_by_identity_CT(core, identity);
+        else if (name)
+            al = qdr_auto_link_config_find_by_name_CT(core, name);
+
+        if (al) {
+            qdr_route_del_auto_link_CT(core, al);
+            query->status = QD_AMQP_NO_CONTENT;
+        } else
+            query->status = QD_AMQP_NOT_FOUND;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+void qdra_config_auto_link_create_CT(qdr_core_t          *core,
+                                      qd_field_iterator_t *name,
+                                      qdr_query_t         *query,
+                                      qd_parsed_field_t   *in_body)
+{
+    while (true) {
+        //
+        // Ensure there isn't a duplicate name and that the body is a map
+        //
+        qdr_auto_link_t *al = DEQ_HEAD(core->auto_links);
+        while (al) {
+            if (name && al->name && qd_field_iterator_equal(name, (const unsigned char*) al->name))
+                break;
+            al = DEQ_NEXT(al);
+        }
+
+        if (!!al) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Name conflicts with an existing entity";
+            break;
+        }
+
+        if (!qd_parse_is_map(in_body)) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        //
+        // Extract the fields from the request
+        //
+        qd_parsed_field_t *addr_field       = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_ADDR]);
+        qd_parsed_field_t *dir_field        = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_DIR]);
+        qd_parsed_field_t *phase_field      = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_PHASE]);
+        qd_parsed_field_t *connection_field = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_CONNECTION]);
+        qd_parsed_field_t *container_field  = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_CONTAINER_ID]);
+
+        //
+        // Addr and dir fields are mandatory.  Fail if they're not both here.
+        //
+        if (!addr_field || !dir_field) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        qd_direction_t dir;
+        const char *error = qdra_auto_link_direction_CT(dir_field, &dir);
+        if (error) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = error;
+            break;
+        }
+
+        //
+        // Use the specified phase if present.  Otherwise default based on the direction:
+        // Phase 0 for outgoing links and phase 1 for incoming links.
+        //
+        int phase = phase_field ? qd_parse_as_int(phase_field) : (dir == QD_OUTGOING ? 0 : 1);
+
+        //
+        // Validate the phase
+        //
+        if (phase < 0 || phase > 9) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "autoLink phase must be between 0 and 9";
+            break;
+        }
+
+        //
+        // The request is good.  Create the entity.
+        //
+        bool               is_container = !!container_field;
+        qd_parsed_field_t *in_use_conn  = is_container ? container_field : connection_field;
+
+        qdr_route_add_auto_link_CT(core, name, addr_field, dir, phase, in_use_conn, is_container);
+
+        //
+        // Compose the result map for the response.
+        //
+        if (query->body) {
+            qd_compose_start_map(query->body);
+            for (int col = 0; col < QDR_CONFIG_AUTO_LINK_COLUMN_COUNT; col++)
+                qdr_config_auto_link_insert_column_CT(al, col, query->body, true);
+            qd_compose_end_map(query->body);
+        }
+
+        query->status = QD_AMQP_CREATED;
+        break;
+    }
+
+    //
+    // Enqueue the response if there is a body. If there is no body, this is a management
+    // operation created internally by the configuration file parser.
+    //
+    if (query->body) {
+        //
+        // If there was an error in processing the create, insert a NULL value into the body.
+        //
+        if (query->status.status / 100 > 2)
+            qd_compose_insert_null(query->body);
+        qdr_agent_enqueue_response_CT(core, query);
+    } else {
+        if (query->status.status / 100 > 2)
+            qd_log(core->log, QD_LOG_ERROR, "Error configuring linkRoute: %s", query->status.description);
+        free_qdr_query_t(query);
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/agent_config_auto_link.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.h b/src/router_core/agent_config_auto_link.h
new file mode 100644
index 0000000..578d402
--- /dev/null
+++ b/src/router_core/agent_config_auto_link.h
@@ -0,0 +1,35 @@
+#ifndef qdr_agent_config_auto_link
+#define qdr_agent_config_auto_link 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_config_auto_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
+void qdra_config_auto_link_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_config_auto_link_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_auto_link_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_auto_link_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
+                                     qd_field_iterator_t *identity);
+
+#define QDR_CONFIG_AUTO_LINK_COLUMN_COUNT 9
+
+const char *qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/agent_config_link_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_link_route.c b/src/router_core/agent_config_link_route.c
index 839dab7..bfdc70f 100644
--- a/src/router_core/agent_config_link_route.c
+++ b/src/router_core/agent_config_link_route.c
@@ -67,7 +67,7 @@ static void qdr_config_link_route_insert_column_CT(qdr_link_route_t *lr, int col
     }
 
     case QDR_CONFIG_LINK_ROUTE_TYPE:
-        qd_compose_insert_string(body, "org.apache.qpid.dispatch.config.link_route");
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.config.linkRoute");
         break;
 
     case QDR_CONFIG_LINK_ROUTE_PREFIX:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index 33ed2be..b9f23c2 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -84,7 +84,7 @@ static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_li
 
         case QDR_LINK_IDENTITY: {
             char id[100];
-            snprintf(id, 100, "%ld", link->identifier);
+            snprintf(id, 100, "%ld", link->identity);
             qd_compose_insert_string(body, id);
             break;
         }
@@ -120,7 +120,7 @@ static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_li
         case QDR_LINK_PEER:
             if (link->connected_link) {
                 char id[100];
-                snprintf(id, 100, "link.%ld", link->connected_link->identifier);
+                snprintf(id, 100, "link.%ld", link->connected_link->identity);
                 qd_compose_insert_string(body, id);
               } else
                 qd_compose_insert_null(body);
@@ -266,8 +266,8 @@ static qdr_link_t *qdr_link_find_by_identity(qdr_core_t *core, qd_field_iterator
 
     while(link) {
         char id[100];
-        if (link->identifier) {
-            snprintf(id, 100, "%ld", link->identifier);
+        if (link->identity) {
+            snprintf(id, 100, "%ld", link->identity);
             if (qd_field_iterator_equal(identity, (const unsigned char *)id))
                 break;
         }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index c0c28d9..45d7920 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -266,7 +266,7 @@ qdr_link_t *qdr_link_first_attach(qdr_connection_t *conn,
 
     ZERO(link);
     link->core = conn->core;
-    link->identifier = qdr_identifier(conn->core);
+    link->identity = qdr_identifier(conn->core);
     link->conn = conn;
     link->name = (char*) malloc(strlen(name) + 1);
     strcpy(link->name, name);
@@ -448,7 +448,7 @@ static qdr_link_t *qdr_create_link_CT(qdr_core_t       *core,
     ZERO(link);
 
     link->core           = core;
-    link->identifier     = qdr_identifier(core);
+    link->identity       = qdr_identifier(core);
     link->user_context   = 0;
     link->conn           = conn;
     link->link_type      = link_type;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 3bae3fd..4327636 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -415,7 +415,7 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
         qdr_link_t *out_link = new_qdr_link_t();
         ZERO(out_link);
         out_link->core           = core;
-        out_link->identifier     = qdr_identifier(core);
+        out_link->identity       = qdr_identifier(core);
         out_link->conn           = conn;
         out_link->link_type      = QD_LINK_ENDPOINT;
         out_link->link_direction = qdr_link_direction(in_link) == QD_OUTGOING ? QD_INCOMING : QD_OUTGOING;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index a421802..88a1e93 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -172,16 +172,15 @@ void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr)
 void qdr_route_add_auto_link_CT(qdr_core_t             *core,
                                 qd_field_iterator_t    *name,
                                 qd_parsed_field_t      *addr_field,
-                                qd_address_treatment_t  treatment,
                                 qd_direction_t          dir,
-                                qd_parsed_field_t      *phase_field,
-                                qd_parsed_field_t      *container_id_field,
-                                qd_parsed_field_t      *conn_name_field)
+                                int                     phase,
+                                qd_parsed_field_t      *conn_id,
+                                bool                    is_container)
 {
 }
 
 
-void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *autolink)
+void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *auto_link)
 {
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index f725a3d..7738c6d 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -34,13 +34,12 @@ void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr);
 void qdr_route_add_auto_link_CT(qdr_core_t             *core,
                                 qd_field_iterator_t    *name,
                                 qd_parsed_field_t      *addr_field,
-                                qd_address_treatment_t  treatment,
                                 qd_direction_t          dir,
-                                qd_parsed_field_t      *phase_field,
-                                qd_parsed_field_t      *container_id_field,
-                                qd_parsed_field_t      *conn_name_field);
+                                int                     phase,
+                                qd_parsed_field_t      *conn_id,
+                                bool                    is_container);
 
-void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *autolink);
+void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *auto_link);
 
 void qdr_route_connection_opened_CT(qdr_core_t       *core,
                                     qdr_connection_t *conn,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2aa0e26a/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 c252063..28e4aef 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -218,7 +218,7 @@ void qdr_del_delivery_ref(qdr_delivery_ref_list_t *list, qdr_delivery_ref_t *ref
 struct qdr_link_t {
     DEQ_LINKS(qdr_link_t);
     qdr_core_t              *core;
-    uint64_t                 identifier;
+    uint64_t                 identity;
     void                    *user_context;
     qdr_connection_t        *conn;               ///< [ref] Connection that owns this link
     qd_link_type_t           link_type;


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


[20/50] [abbrv] qpid-dispatch git commit: DISPATCH_179 - Fixed propagation of seconds detach in routed links.

Posted by tr...@apache.org.
DISPATCH_179 - Fixed propagation of seconds detach in routed links.


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

Branch: refs/heads/master
Commit: 2eee1098f2eeff10b778bebb481c817240dfbca6
Parents: 6b5067e
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 10 16:08:55 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 10 16:08:55 2016 -0500

----------------------------------------------------------------------
 src/container.c               |  8 +++++++-
 src/router_core/connections.c | 37 +++++++++++++++++++++++++------------
 src/router_core/forwarder.c   | 31 +++++++++++++++++++++++++------
 3 files changed, 57 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2eee1098/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index f6083b3..c63a077 100644
--- a/src/container.c
+++ b/src/container.c
@@ -434,6 +434,9 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
                 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_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;
 
@@ -874,8 +877,11 @@ void qd_link_close(qd_link_t *link)
 {
     if (link->pn_link)
         pn_link_close(link->pn_link);
-    if (link->close_sess_with_link && link->pn_sess)
+
+    if (link->close_sess_with_link && link->pn_sess &&
+        pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
         pn_session_close(link->pn_sess);
+    }
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2eee1098/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index fffa4d3..c0c28d9 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -416,6 +416,14 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_li
     DEQ_REMOVE(core->open_links, link);
 
     //
+    // If the link has a connected peer, unlink the peer
+    //
+    if (link->connected_link) {
+        link->connected_link->connected_link = 0;
+        link->connected_link = 0;
+    }
+
+    //
     // Remove the reference to this link in the connection's reference lists
     //
     qdr_del_link_ref(&conn->links, link, QDR_LINK_LIST_CLASS_CONNECTION);
@@ -522,7 +530,7 @@ static char qdr_prefix_for_dir(qd_direction_t dir)
 }
 
 
-static qd_address_treatment_t qdr_treatment_for_address(qdr_core_t *core, qd_field_iterator_t *iter)
+static qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter)
 {
     qdr_address_config_t *addr = 0;
 
@@ -672,8 +680,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
     qd_address_iterator_override_prefix(iter, '\0'); // Cancel previous override
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr && create_if_not_found) {
-        qd_address_treatment_t sem = qdr_treatment_for_address(core, iter);
-        addr = qdr_address_CT(core, sem);
+        addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter));
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
     }
@@ -793,6 +800,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
     qd_direction_t     dir    = action->args.connection.dir;
     qdr_terminus_t    *source = action->args.connection.source;
     qdr_terminus_t    *target = action->args.connection.target;
+    bool               success;
 
     //
     // Put the link into the proper lists for tracking.
@@ -837,13 +845,18 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                     qdr_terminus_free(target);
                 }
 
-                else if (link_route)
+                else if (link_route) {
                     //
                     // This is a link-routed destination, forward the attach to the next hop
                     //
-                    qdr_forward_attach_CT(core, addr, link, source, target);
-
-                else {
+                    success = qdr_forward_attach_CT(core, addr, link, source, target);
+                    if (!success) {
+                        qdr_link_outbound_detach_CT(core, link, 0, QDR_CONDITION_NO_ROUTE_TO_DESTINATION);
+                        qdr_terminus_free(source);
+                        qdr_terminus_free(target);
+                    }
+
+                } else {
                     //
                     // Associate the link with the address.  With this association, it will be unnecessary
                     // to do an address lookup for deliveries that arrive on this link.
@@ -1037,6 +1050,11 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
     bool              was_local = false;
 
     //
+    // Bump the detach count to track half and full detaches
+    //
+    link->detach_count++;
+
+    //
     // TODO - For routed links, propagate the detach
     //
     if (link->connected_link) {
@@ -1092,11 +1110,6 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
         }
     }
 
-    //
-    // Bump the detach_count.  If it's now 1, the link is half-detached.  If it's 2,
-    // the link is fully detached.
-    //
-    link->detach_count++;
     if (link->detach_count == 1) {
         //
         // If the detach occurred via protocol, send a detach back.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2eee1098/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 862c498..3bae3fd 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -49,6 +49,29 @@ struct qdr_forwarder_t {
 // Built-in Forwarders
 //==================================================================================
 
+static int qdr_forward_message_null_CT(qdr_core_t      *core,
+                                       qdr_address_t   *addr,
+                                       qd_message_t    *msg,
+                                       qdr_delivery_t  *in_delivery,
+                                       bool             exclude_inprocess,
+                                       bool             control,
+                                       qd_bitmask_t    *link_exclusion)
+{
+    qd_log(core->log, QD_LOG_CRITICAL, "NULL Message Forwarder Invoked");
+    return 0;
+}
+
+
+static bool qdr_forward_attach_null_CT(qdr_core_t     *core,
+                                       qdr_address_t  *addr,
+                                       qdr_link_t     *link,
+                                       qdr_terminus_t *source,
+                                       qdr_terminus_t *target)
+{
+    qd_log(core->log, QD_LOG_CRITICAL, "NULL Attach Forwarder Invoked");
+    return false;
+}
+
 
 qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *peer, qdr_link_t *link, qd_message_t *msg)
 {
@@ -388,10 +411,6 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
         }
     }
 
-    //
-    // TODO - Use the next-hop connection if there are no local containers.
-    //
-
     if (conn) {
         qdr_link_t *out_link = new_qdr_link_t();
         ZERO(out_link);
@@ -432,8 +451,8 @@ qdr_forwarder_t *qdr_new_forwarder(qdr_forward_message_t fm, qdr_forward_attach_
 {
     qdr_forwarder_t *forw = NEW(qdr_forwarder_t);
 
-    forw->forward_message      = fm;
-    forw->forward_attach       = fa;
+    forw->forward_message      = fm ? fm : qdr_forward_message_null_CT;
+    forw->forward_attach       = fa ? fa : qdr_forward_attach_null_CT;
     forw->bypass_valid_origins = bypass_valid_origins;
 
     return forw;


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


[24/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added a core function for invoking custom management methods.

Posted by tr...@apache.org.
DISPATCH-179 - Added a core function for invoking custom management methods.


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

Branch: refs/heads/master
Commit: bd0f5585f7a821f27804acf07572448f297b760c
Parents: 90775af
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 11 11:09:29 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 11 11:09:29 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/bd0f5585/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 4dcc167..16aa513 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -616,6 +616,29 @@ void qdr_manage_update(qdr_core_t *core, void *context, qd_router_entity_type_t
                        qd_field_iterator_t *name, qd_field_iterator_t *identity,
                        qd_parsed_field_t *in_body, qd_composed_field_t *out_body);
 
+/**
+ * qdr_manage_method
+ *
+ * Invoke a custom method on a managed entity in the router core.
+ *
+ * @param core Pointer to the core object returned by qd_core()
+ * @param context An opaque context that will be passed back in the invocation of the response callback
+ * @param type The entity type for the update request
+ * @param method The method being invoked
+ * @param name The name supplied with the request (or 0 if the identity was supplied)
+ * @param identity The identity supplied with the request (or 0 if the name was supplied)
+ * @param in_body The body of the request message
+ * @param out_body A composed field for the body of the response message
+ */
+void qdr_manage_method(qdr_core_t              *core,
+                       void                    *context,
+                       qd_router_entity_type_t  type,
+                       qd_field_iterator_t     *method,
+                       qd_field_iterator_t     *name,
+                       qd_field_iterator_t     *identity,
+                       qd_parsed_field_t       *in_body,
+                       qd_composed_field_t     *out_body);
+
 
 /**
  * Sequence for running a query:


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


[12/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added configuration support for the "route" entity. Implemented link-route activation.

Posted by tr...@apache.org.
DISPATCH-179 - Added configuration support for the "route" entity.
               Implemented link-route activation.


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

Branch: refs/heads/master
Commit: 0d603e1bc67db18387d4f8491228540d106d16a5
Parents: da00ebc
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 4 13:58:04 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 4 13:58:04 2016 -0500

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json   |  15 ++-
 python/qpid_dispatch_internal/dispatch.py       |   1 +
 .../qpid_dispatch_internal/management/agent.py  |   4 +
 .../qpid_dispatch_internal/management/config.py |   4 +-
 src/dispatch.c                                  |   6 ++
 src/dispatch_private.h                          |   5 +
 src/router_config.c                             | 100 +++++++++++++++++++
 src/router_core/agent_address.c                 |  18 ++--
 src/router_core/agent_address.h                 |   2 +-
 src/router_core/agent_route.c                   |   2 +-
 src/router_core/management_agent.c              |   2 +-
 src/router_core/route_control.c                 |  18 ++++
 src/router_private.h                            |   1 +
 tools/qdstat                                    |   2 +
 14 files changed, 164 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 14a087a..58e7f75 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -835,7 +835,7 @@
             }
         },
 
-        "router.route": {
+        "route": {
             "description": "Provisioned route that affects the treatment of message deliveries and link attaches",
             "extends": "configurationEntity",
             "operations": ["CREATE", "DELETE", "ADD-CONTAINER", "REMOVE-CONTAINER-CLEAN", "REMOVE-CONTAINER-HARD"],
@@ -859,14 +859,14 @@
                     "default": "balanced"
                 },
                 "connectors": {
-                    "type": "list",
-                    "description": "List of labels associated with the connector leading to the target containers",
+                    "type": "string",
+                    "description": "Comma-separated list of labels associated with the connector leading to the target containers",
                     "create": true,
                     "required": false
                 },
                 "containers": {
-                    "type": "list",
-                    "description": "List of container-IDs for target containers",
+                    "type": "string",
+                    "description": "Comma-separated list of container-IDs for target containers",
                     "create": true,
                     "required": false
                 },
@@ -953,6 +953,11 @@
                     "description": "The number of remote routers that have at least one subscriber to this address",
                     "graph": true
                 },
+                "containerCount": {
+                    "type": "integer",
+                    "description": "The number of attached containers that serve this route address",
+                    "graph": true
+                },
                 "deliveriesIngress": {
                     "type": "integer",
                     "description": "The number of deliveries to this address that entered the router network on this router",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/python/qpid_dispatch_internal/dispatch.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/dispatch.py b/python/qpid_dispatch_internal/dispatch.py
index fdc6835..a1b6e8b 100644
--- a/python/qpid_dispatch_internal/dispatch.py
+++ b/python/qpid_dispatch_internal/dispatch.py
@@ -64,6 +64,7 @@ class QdDll(ctypes.PyDLL):
         self._prototype(self.qd_dispatch_configure_address, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_waypoint, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_lrp, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_route, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_set_agent, None, [self.qd_dispatch_p, py_object])
 
         self._prototype(self.qd_router_setup_late, None, [self.qd_dispatch_p])

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/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 886157d..c396366 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -301,6 +301,10 @@ class LinkRoutePatternEntity(EntityAdapter):
     def create(self):
         self._qd.qd_dispatch_configure_lrp(self._dispatch, self)
 
+class RouteEntity(EntityAdapter):
+    def create(self):
+        self._qd.qd_dispatch_configure_route(self._dispatch, self)
+
 class ConsoleEntity(EntityAdapter):
     def create(self):
         # if a named listener is present, use its addr:port 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/python/qpid_dispatch_internal/management/config.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/management/config.py b/python/qpid_dispatch_internal/management/config.py
index 1ecae6b..c5818b4 100644
--- a/python/qpid_dispatch_internal/management/config.py
+++ b/python/qpid_dispatch_internal/management/config.py
@@ -124,7 +124,7 @@ def configure_dispatch(dispatch, lib_handle, filename):
     dispatch = qd.qd_dispatch_p(dispatch)
     config = Config(filename)
 
-    # NOTE: Can't import agent till till dispatch C extension module is initialized.
+    # NOTE: Can't import agent till dispatch C extension module is initialized.
     from .agent import Agent
     agent = Agent(dispatch, qd)
     qd.qd_dispatch_set_agent(dispatch, agent)
@@ -150,7 +150,7 @@ def configure_dispatch(dispatch, lib_handle, filename):
     agent.activate("$_management_internal")
 
     # Remaining configuration
-    for t in "fixedAddress", "listener", "connector", "waypoint", "linkRoutePattern":
+    for t in "fixedAddress", "listener", "connector", "waypoint", "linkRoutePattern", "route":
         for a in config.by_type(t): configure(a)
     for e in config.entities:
         configure(e)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/dispatch.c
----------------------------------------------------------------------
diff --git a/src/dispatch.c b/src/dispatch.c
index 0a0d776..ad2d621 100644
--- a/src/dispatch.c
+++ b/src/dispatch.c
@@ -138,6 +138,12 @@ qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, qd_entity_t *entity) {
     return qd_error_code();
 }
 
+qd_error_t qd_dispatch_configure_route(qd_dispatch_t *qd, qd_entity_t *entity) {
+    if (!qd->router) return qd_error(QD_ERROR_NOT_FOUND, "No router available");
+    qd_router_configure_route(qd->router, entity);
+    return qd_error_code();
+}
+
 qd_error_t qd_dispatch_prepare(qd_dispatch_t *qd)
 {
     qd->server             = qd_server(qd, qd->thread_count, qd->container_name, qd->sasl_config_path, qd->sasl_config_name);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/dispatch_private.h
----------------------------------------------------------------------
diff --git a/src/dispatch_private.h b/src/dispatch_private.h
index cc7df08..b955e10 100644
--- a/src/dispatch_private.h
+++ b/src/dispatch_private.h
@@ -102,6 +102,11 @@ qd_error_t qd_dispatch_configure_waypoint(qd_dispatch_t *qd, qd_entity_t *entity
 qd_error_t qd_dispatch_configure_lrp(qd_dispatch_t *qd, qd_entity_t *entity);
 
 /**
+ * Configure a route, must be called after qd_dispatch_prepare
+ */
+qd_error_t qd_dispatch_configure_route(qd_dispatch_t *qd, qd_entity_t *entity);
+
+/**
  * \brief Configure the logging module from the
  *        parsed configuration file.  This must be called after the
  *        call to qd_dispatch_prepare completes.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 8039efe..30ff89b 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -178,6 +178,106 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 }
 
 
+static void qd_router_insert_items(qd_composed_field_t *body, char *list)
+{
+    char *saveptr;
+    char *token;
+    char *delim = ", ";
+
+    token = strtok_r(list, delim, &saveptr);
+    while (token) {
+        qd_compose_insert_string(body, token);
+        token = strtok_r(0, delim, &saveptr);
+    }
+}
+
+
+qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity)
+{
+    char *name          = qd_entity_opt_string(entity, "name", 0);          QD_ERROR_RET();
+    char *address       = qd_entity_opt_string(entity, "address", 0);       QD_ERROR_RET();
+    char *path          = qd_entity_opt_string(entity, "path", 0);          QD_ERROR_RET();
+    char *treatment     = qd_entity_opt_string(entity, "treatment", 0);     QD_ERROR_RET();
+    char *connectors    = qd_entity_opt_string(entity, "connectors", 0);    QD_ERROR_RET();
+    char *containers    = qd_entity_opt_string(entity, "containers", 0);    QD_ERROR_RET();
+    char *route_address = qd_entity_opt_string(entity, "route_address", 0); QD_ERROR_RET();
+
+    //
+    // Formulate this configuration as a route and create it through the core management API.
+    //
+    qd_composed_field_t *body = qd_compose_subfield(0);
+    qd_compose_start_map(body);
+
+    if (name) {
+        qd_compose_insert_string(body, "name");
+        qd_compose_insert_string(body, name);
+    }
+
+    if (address) {
+        qd_compose_insert_string(body, "address");
+        qd_compose_insert_string(body, address);
+    }
+
+    if (path) {
+        qd_compose_insert_string(body, "path");
+        qd_compose_insert_string(body, path);
+    }
+
+    if (treatment) {
+        qd_compose_insert_string(body, "treatment");
+        qd_compose_insert_string(body, treatment);
+    }
+
+    if (connectors) {
+        qd_compose_insert_string(body, "connectors");
+        qd_compose_start_list(body);
+        qd_router_insert_items(body, connectors);
+        qd_compose_end_list(body);
+    }
+
+    if (containers) {
+        qd_compose_insert_string(body, "containers");
+        qd_compose_start_list(body);
+        qd_router_insert_items(body, containers);
+        qd_compose_end_list(body);
+    }
+
+    if (route_address) {
+        qd_compose_insert_string(body, "routeAddress");
+        qd_compose_insert_string(body, route_address);
+    }
+
+    qd_compose_end_map(body);
+
+    int              length = 0;
+    qd_buffer_list_t buffers;
+
+    qd_compose_take_buffers(body, &buffers);
+    qd_compose_free(body);
+
+    qd_buffer_t *buf = DEQ_HEAD(buffers);
+    while (buf) {
+        length += qd_buffer_size(buf);
+        buf = DEQ_NEXT(buf);
+    }
+
+    qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
+    qd_parsed_field_t   *in_body = qd_parse(iter);
+
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
+
+    free(name);
+    free(address);
+    free(path);
+    free(treatment);
+    free(connectors);
+    free(containers);
+    free(route_address);
+
+    return qd_error_code();
+}
+
+
 void qd_router_configure_free(qd_router_t *router)
 {
     if (!router) return;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index 1ed1614..1a9a44c 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -28,12 +28,13 @@
 #define QDR_ADDRESS_IN_PROCESS                5
 #define QDR_ADDRESS_SUBSCRIBER_COUNT          6
 #define QDR_ADDRESS_REMOTE_COUNT              7
-#define QDR_ADDRESS_HOST_ROUTERS              8
-#define QDR_ADDRESS_DELIVERIES_INGRESS        9
-#define QDR_ADDRESS_DELIVERIES_EGRESS         10
-#define QDR_ADDRESS_DELIVERIES_TRANSIT        11
-#define QDR_ADDRESS_DELIVERIES_TO_CONTAINER   12
-#define QDR_ADDRESS_DELIVERIES_FROM_CONTAINER 13
+#define QDR_ADDRESS_CONTAINER_COUNT           8
+#define QDR_ADDRESS_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
 
 const char *qdr_address_columns[] =
     {"name",
@@ -44,6 +45,7 @@ const char *qdr_address_columns[] =
      "inProcess",
      "subscriberCount",
      "remoteCount",
+     "containerCount",
      "hostRouters",
      "deliveriesIngress",
      "deliveriesEgress",
@@ -94,6 +96,10 @@ static void qdr_insert_address_columns_CT(qdr_address_t        *addr,
         qd_compose_insert_uint(body, qd_bitmask_cardinality(addr->rnodes));
         break;
 
+    case QDR_ADDRESS_CONTAINER_COUNT:
+        qd_compose_insert_uint(body, DEQ_SIZE(addr->conns));
+        break;
+
     case QDR_ADDRESS_HOST_ROUTERS:
         qd_compose_insert_null(body);  // TEMP
         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_core/agent_address.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.h b/src/router_core/agent_address.h
index 77d6dcc..abe6d89 100644
--- a/src/router_core/agent_address.h
+++ b/src/router_core/agent_address.h
@@ -36,7 +36,7 @@ void qdra_address_delete_CT(qdr_core_t          *core,
                             qdr_query_t          *query);
 
 
-#define QDR_ADDRESS_COLUMN_COUNT 14
+#define QDR_ADDRESS_COLUMN_COUNT 15
 
 const char *qdr_address_columns[QDR_ADDRESS_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index acf397b..97e70cf 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -67,7 +67,7 @@ static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_co
     }
 
     case QDR_ROUTE_TYPE:
-        qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.route");
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.route");
         break;
 
     case QDR_ROUTE_ADDRESS:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 72f7d70..82f8c53 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -39,7 +39,7 @@ const char *IDENTITY = "identity";
 const char *OPERATION = "operation";
 const char *ATTRIBUTE_NAMES = "attributeNames";
 
-const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.route";
+const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.route";
 const unsigned char *waypoint_entity_type = (unsigned char*) "org.apache.qpid.dispatch.waypoint";
 const unsigned char *address_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.address";
 const unsigned char *link_entity_type    = (unsigned char*) "org.apache.qpid.dispatch.router.link";

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 2f66d14..96b5ef9 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -132,11 +132,27 @@ static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identi
 }
 
 
+static void qdr_route_log_CT(qdr_core_t *core, const char *text, qdr_route_config_t *route, qdr_connection_t *conn)
+{
+    const char *key = (const char*) qd_hash_key_by_handle(conn->conn_id->hash_handle);
+    char  id_string[64];
+    const char *name = route->name ? route->name : id_string;
+
+    if (!route->name)
+        snprintf(id_string, 64, "%ld", route->identity);
+
+    qd_log(core->log, QD_LOG_INFO, "Route '%s' %s on %s %s",
+           name, text, key[0] == 'L' ? "connection" : "container", &key[1]);
+}
+
+
 static void qdr_route_activate_CT(qdr_core_t *core, qdr_route_active_t *active, qdr_connection_t *conn)
 {
     qdr_route_config_t *route = active->config;
     const char         *key;
 
+    qdr_route_log_CT(core, "Activated", route, conn);
+
     if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
         //
         // Activate the address(es) for link-routed destinations.  If this is the first
@@ -168,6 +184,8 @@ static void qdr_route_deactivate_CT(qdr_core_t *core, qdr_route_active_t *active
     qdr_route_config_t *route = active->config;
     const char         *key;
 
+    qdr_route_log_CT(core, "Deactivated", route, conn);
+
     if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
         //
         // Deactivate the address(es) for link-routed destinations.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/src/router_private.h
----------------------------------------------------------------------
diff --git a/src/router_private.h b/src/router_private.h
index 5b14fc9..21497b4 100644
--- a/src/router_private.h
+++ b/src/router_private.h
@@ -41,6 +41,7 @@ qd_error_t qd_pyrouter_tick(qd_router_t *router);
 qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity);
 qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity);
 qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity);
+qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity);
 
 void qd_router_configure_free(qd_router_t *router);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d603e1b/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index fd941cf..2144b1f 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -293,6 +293,7 @@ class BusManager(Node):
         heads.append(Header("in-proc", Header.COMMAS))
         heads.append(Header("local", Header.COMMAS))
         heads.append(Header("remote", Header.COMMAS))
+        heads.append(Header("cntnr", Header.COMMAS))
         heads.append(Header("in", Header.COMMAS))
         heads.append(Header("out", Header.COMMAS))
         heads.append(Header("thru", Header.COMMAS))
@@ -309,6 +310,7 @@ class BusManager(Node):
             row.append(addr.inProcess)
             row.append(addr.subscriberCount)
             row.append(addr.remoteCount)
+            row.append(addr.containerCount)
             row.append(addr.deliveriesIngress)
             row.append(addr.deliveriesEgress)
             row.append(addr.deliveriesTransit)


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


[22/50] [abbrv] qpid-dispatch git commit: DISPATCH-232 - Add capability to delete listeners and connectors via the qdmanage DELETE operation

Posted by tr...@apache.org.
DISPATCH-232 - Add capability to delete listeners and connectors via the qdmanage DELETE operation


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

Branch: refs/heads/master
Commit: 68aab3815919a549fae4d44014fbce813ac57704
Parents: 722b0eb
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Mon Mar 7 22:52:58 2016 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Thu Mar 10 17:02:43 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/connection_manager.h      |  11 ++
 python/qpid_dispatch/management/qdrouter.json   |   4 +-
 python/qpid_dispatch_internal/dispatch.py       |  10 +-
 .../qpid_dispatch_internal/management/agent.py  |  32 +++--
 src/connection_manager.c                        |  71 +++++++++-
 tests/system_tests_qdmanage.py                  | 129 ++++++++++++++++---
 6 files changed, 218 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/include/qpid/dispatch/connection_manager.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/connection_manager.h b/include/qpid/dispatch/connection_manager.h
index 1c43a8b..686cf3b 100644
--- a/include/qpid/dispatch/connection_manager.h
+++ b/include/qpid/dispatch/connection_manager.h
@@ -47,6 +47,17 @@ qd_connection_manager_t *qd_connection_manager(qd_dispatch_t *qd);
  */
 void qd_connection_manager_free(qd_connection_manager_t *cm);
 
+/**
+ * Free all the resources associated with a config listener
+ */
+void qd_config_listener_free(qd_config_listener_t *cl);
+
+
+/**
+ * Free all the resources associated with a config connector
+ */
+void qd_config_connector_free(qd_config_connector_t *cl);
+
 
 /**
  * Start the configured Listeners and Connectors

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 038b161..327e504 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -568,7 +568,7 @@
         "listener": {
             "description": "Listens for incoming connections to the router.",
             "extends": "configurationEntity",
-            "operations": ["CREATE"],
+            "operations": ["CREATE", "DELETE"],
             "annotations": [
                 "addrPort",
                 "connectionRole",
@@ -643,7 +643,7 @@
         "connector": {
             "description": "Establishes an outgoing connections from the router.",
             "extends": "configurationEntity",
-            "operations": ["CREATE"],
+            "operations": ["CREATE", "DELETE"],
             "annotations": [
                 "addrPort",
                 "connectionRole",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/python/qpid_dispatch_internal/dispatch.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/dispatch.py b/python/qpid_dispatch_internal/dispatch.py
index a1b6e8b..49f9a83 100644
--- a/python/qpid_dispatch_internal/dispatch.py
+++ b/python/qpid_dispatch_internal/dispatch.py
@@ -59,12 +59,17 @@ class QdDll(ctypes.PyDLL):
         self._prototype(self.qd_dispatch_configure_container, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_router, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_prepare, None, [self.qd_dispatch_p])
-        self._prototype(self.qd_dispatch_configure_listener, None, [self.qd_dispatch_p, py_object])
-        self._prototype(self.qd_dispatch_configure_connector, None, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_listener, ctypes.c_void_p, [self.qd_dispatch_p, py_object])
+        self._prototype(self.qd_dispatch_configure_connector, ctypes.c_void_p, [self.qd_dispatch_p, py_object])
+
+        self._prototype(self.qd_connection_manager_delete_listener, None, [self.qd_dispatch_p, ctypes.c_void_p])
+        self._prototype(self.qd_connection_manager_delete_connector, None, [self.qd_dispatch_p, ctypes.c_void_p])
+
         self._prototype(self.qd_dispatch_configure_address, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_waypoint, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_lrp, None, [self.qd_dispatch_p, py_object])
         self._prototype(self.qd_dispatch_configure_route, None, [self.qd_dispatch_p, py_object])
+
         self._prototype(self.qd_dispatch_set_agent, None, [self.qd_dispatch_p, py_object])
 
         self._prototype(self.qd_router_setup_late, None, [self.qd_dispatch_p])
@@ -73,7 +78,6 @@ class QdDll(ctypes.PyDLL):
         self._prototype(self.qd_dispatch_router_unlock, None, [self.qd_dispatch_p])
 
         self._prototype(self.qd_connection_manager_start, None, [self.qd_dispatch_p])
-        #self._prototype(self.qd_waypoint_activate_all, None, [self.qd_dispatch_p])
         self._prototype(self.qd_entity_refresh_begin, c_long, [py_object])
         self._prototype(self.qd_entity_refresh_end, None, [])
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/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 c396366..f5443d4 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -211,8 +211,8 @@ class EntityAdapter(SchemaEntity):
 
     def delete(self, request):
         """Handle delete request from client"""
-        self._agent.remove(self)
         self._delete()
+        self._agent.remove(self)
         return (NO_CONTENT, {})
 
     def _delete(self):
@@ -274,16 +274,24 @@ def _addr_port_identifier(entity):
 
 class ListenerEntity(EntityAdapter):
     def create(self):
-        self._qd.qd_dispatch_configure_listener(self._dispatch, self)
+        config_listener = self._qd.qd_dispatch_configure_listener(self._dispatch, self)
         self._qd.qd_connection_manager_start(self._dispatch)
+        return config_listener
 
-    def _identifier(self): return _addr_port_identifier(self)
+    def _delete(self):
+        self._qd.qd_connection_manager_delete_listener(self._dispatch, self._implementations[0].key)
 
+    def _identifier(self): return _addr_port_identifier(self)
 
 class ConnectorEntity(EntityAdapter):
     def create(self):
-        self._qd.qd_dispatch_configure_connector(self._dispatch, self)
+        config_connector = self._qd.qd_dispatch_configure_connector(self._dispatch, self)
         self._qd.qd_connection_manager_start(self._dispatch)
+        return config_connector
+
+    def _delete(self):
+        """Can't actually delete a log source but return it to the default state"""
+        self._qd.qd_connection_manager_delete_connector(self._dispatch, self._implementations[0].key)
 
     def _identifier(self): return _addr_port_identifier(self)
 
@@ -399,16 +407,18 @@ class EntityCache(object):
         self.schema.validate_full(chain(iter([entity]), iter(self.entities)))
         self.entities.append(entity)
 
-    def _add_implementation(self, implementation):
+    def _add_implementation(self, implementation, adapter=None):
         """Create an adapter to wrap the implementation object and add it"""
         cls = self.agent.entity_class(implementation.entity_type)
-        adapter = cls(self.agent, implementation.entity_type, validate=False)
+        if not adapter:
+            adapter = cls(self.agent, implementation.entity_type, validate=False)
         self.implementations[implementation.key] = adapter
         adapter._add_implementation(implementation)
         adapter._refresh()
         self.add(adapter)
 
-    def add_implementation(self, implementation): self._add_implementation(implementation)
+    def add_implementation(self, implementation, adapter=None):
+        self._add_implementation(implementation, adapter=adapter)
 
     def _remove(self, entity):
         try:
@@ -695,8 +705,12 @@ class Agent(object):
     def _create(self, attributes):
         """Create an entity, called externally or from configuration file."""
         entity = self.create_entity(attributes)
-        self.add_entity(entity)
-        entity.create()
+        pointer = entity.create()
+        if pointer:
+            cimplementation = CImplementation(self.qd, entity.entity_type, pointer)
+            self.entities.add_implementation(cimplementation, entity)
+        else:
+            self.add_entity(entity)
         return entity
 
     def create(self, request):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/src/connection_manager.c
----------------------------------------------------------------------
diff --git a/src/connection_manager.c b/src/connection_manager.c
index 794ddee..039202e 100644
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@ -183,30 +183,53 @@ static qd_error_t load_server_config(qd_dispatch_t *qd, qd_server_config_t *conf
     return qd_error_code();
 }
 
-void qd_dispatch_configure_listener(qd_dispatch_t *qd, qd_entity_t *entity)
+qd_config_listener_t *qd_dispatch_configure_listener(qd_dispatch_t *qd, qd_entity_t *entity)
 {
+    qd_error_clear();
     qd_connection_manager_t *cm = qd->connection_manager;
     qd_config_listener_t *cl = NEW(qd_config_listener_t);
     cl->is_connector = false;
     cl->listener = 0;
-    load_server_config(qd, &cl->configuration, entity);
+    if (load_server_config(qd, &cl->configuration, entity) != QD_ERROR_NONE) {
+        qd_log(cm->log_source, QD_LOG_ERROR, "Unable to create config listener: %s", qd_error_message());
+        qd_config_listener_free(cl);
+        return 0;
+    }
     DEQ_ITEM_INIT(cl);
     DEQ_INSERT_TAIL(cm->config_listeners, cl);
     qd_log(cm->log_source, QD_LOG_INFO, "Configured Listener: %s:%s role=%s",
            cl->configuration.host, cl->configuration.port, cl->configuration.role);
+
+    return cl;
+}
+
+
+qd_error_t qd_entity_refresh_listener(qd_entity_t* entity, void *impl)
+{
+    return QD_ERROR_NONE;
 }
 
 
-qd_error_t qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_entity_t *entity)
+qd_error_t qd_entity_refresh_connector(qd_entity_t* entity, void *impl)
+{
+    return QD_ERROR_NONE;
+}
+
+
+qd_config_connector_t *qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_entity_t *entity)
 {
     qd_error_clear();
     qd_connection_manager_t *cm = qd->connection_manager;
     qd_config_connector_t *cc = NEW(qd_config_connector_t);
     memset(cc, 0, sizeof(*cc));
     cc->is_connector = true;
-    if (load_server_config(qd, &cc->configuration, entity))
-        return qd_error_code();
+    if (load_server_config(qd, &cc->configuration, entity) != QD_ERROR_NONE) {
+        qd_log(cm->log_source, QD_LOG_ERROR, "Unable to create config connector: %s", qd_error_message());
+        qd_config_connector_free(cc);
+        return 0;
+    }
     DEQ_ITEM_INIT(cc);
+
     if (strcmp(cc->configuration.role, "route-container") == 0) {
         DEQ_INSERT_TAIL(cm->on_demand_connectors, cc);
         qd_log(cm->log_source, QD_LOG_INFO, "Configured route-container connector: %s:%s name=%s",
@@ -217,7 +240,8 @@ qd_error_t qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_entity_t *entit
         qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s",
                cc->configuration.host, cc->configuration.port, cc->configuration.role);
     }
-    return QD_ERROR_NONE;
+
+    return cc;
 }
 
 
@@ -288,6 +312,41 @@ void qd_connection_manager_start(qd_dispatch_t *qd)
     }
 }
 
+void qd_config_connector_free(qd_config_connector_t *cc)
+{
+    if (cc->connector)
+        qd_server_connector_free(cc->connector);
+    free(cc);
+}
+
+void qd_config_listener_free(qd_config_listener_t *cl)
+{
+    if (cl->listener)
+        qd_server_listener_close(cl->listener);
+        qd_server_listener_free(cl->listener);
+    free(cl);
+}
+
+void qd_connection_manager_delete_listener(qd_dispatch_t *qd, void *impl)
+{
+    qd_config_listener_t *cl = (qd_config_listener_t*)impl;
+
+    if(cl) {
+        qd_server_listener_close(cl->listener);
+        DEQ_REMOVE(qd->connection_manager->config_listeners, cl);
+        qd_config_listener_free(cl);
+    }
+}
+
+void qd_connection_manager_delete_connector(qd_dispatch_t *qd, void *impl)
+{
+    qd_config_connector_t *cc = (qd_config_connector_t*)impl;
+
+    if(cc) {
+        DEQ_REMOVE(qd->connection_manager->config_connectors, cc);
+        qd_config_connector_free(cc);
+    }
+}
 
 qd_config_connector_t *qd_connection_manager_find_on_demand(qd_dispatch_t *qd, const char *name)
 {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/68aab381/tests/system_tests_qdmanage.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_qdmanage.py b/tests/system_tests_qdmanage.py
index 2103915..f11bec4 100644
--- a/tests/system_tests_qdmanage.py
+++ b/tests/system_tests_qdmanage.py
@@ -18,7 +18,7 @@
 #
 
 import re, json, unittest, os
-from system_test import TestCase, Process, Qdrouterd, main_module, TIMEOUT, DIR
+from system_test import TestCase, Process, Qdrouterd, main_module, TIMEOUT, DIR, wait_port
 from subprocess import PIPE, STDOUT
 from qpid_dispatch_internal.compat import OrderedDict, dictify
 from qpid_dispatch_internal.management.qdrouter import QdSchema
@@ -36,18 +36,30 @@ class QdmanageTest(TestCase):
     @classmethod
     def setUpClass(cls):
         super(QdmanageTest, cls).setUpClass()
-        config = Qdrouterd.Config([
+        cls.inter_router_port = cls.tester.get_port()
+        config_1 = Qdrouterd.Config([
+            ('container', {'workerThreads': 4, 'containerName': 'Qpid.Dispatch.Router.1'}),
+            ('router', {'mode': 'interior', 'routerId': 'R1'}),
             ('ssl-profile', {'name': 'server-ssl',
                              'cert-db': cls.ssl_file('ca-certificate.pem'),
                              'cert-file': cls.ssl_file('server-certificate.pem'),
                              'key-file': cls.ssl_file('server-private-key.pem'),
                              'password': 'server-password'}),
             ('listener', {'port': cls.tester.get_port()}),
+            ('connector', {'role': 'inter-router', 'port': cls.inter_router_port}),
             ('listener', {'port': cls.tester.get_port(), 'ssl-profile': 'server-ssl'})
         ])
-        cls.router = cls.tester.qdrouterd('test-router', config, wait=True)
 
-    def address(self): return self.router.addresses[0]
+        config_2 = Qdrouterd.Config([
+            ('container', {'workerThreads': 4, 'containerName': 'Qpid.Dispatch.Router.2'}),
+            ('router', {'mode': 'interior', 'routerId': 'R2'}),
+            ('listener', {'role': 'inter-router', 'port': cls.inter_router_port}),
+        ])
+        cls.router_2 = cls.tester.qdrouterd('test_router_2', config_2, wait=True)
+        cls.router_1 = cls.tester.qdrouterd('test_router_1', config_1, wait=True)
+
+    def address(self):
+        return self.router_1.addresses[0]
 
     def run_qdmanage(self, cmd, input=None, expect=Process.EXIT_OK, address=None):
         p = self.popen(
@@ -94,7 +106,6 @@ class QdmanageTest(TestCase):
         self.run_qdmanage('delete --name mydummy')
         self.run_qdmanage('read --name=mydummy', expect=Process.EXIT_FAIL)
 
-
     def test_stdin(self):
         """Test piping from stdin"""
         def check(cmd, expect, input, copy=None):
@@ -121,22 +132,27 @@ class QdmanageTest(TestCase):
         check_list('update', expect_list, json.dumps(expect_list))
 
     def test_query(self):
-        def long_type(name): return u'org.apache.qpid.dispatch.'+name
+
+        def long_type(name):
+            return u'org.apache.qpid.dispatch.'+name
+
         types = ['listener', 'log', 'container', 'router']
         long_types = [long_type(name) for name in types]
 
         qall = json.loads(self.run_qdmanage('query'))
         qall_types = set([e['type'] for e in qall])
-        for t in long_types: self.assertIn(t, qall_types)
+        for t in long_types:
+            self.assertIn(t, qall_types)
 
         qlistener = json.loads(self.run_qdmanage('query --type=listener'))
         self.assertEqual([long_type('listener')]*2, [e['type'] for e in qlistener])
-        self.assertEqual(self.router.ports[0], int(qlistener[0]['port']))
+        self.assertEqual(self.router_1.ports[0], int(qlistener[0]['port']))
 
         qattr = json.loads(
             self.run_qdmanage('query type name'))
 
-        for e in qattr: self.assertEqual(2, len(e))
+        for e in qattr:
+            self.assertEqual(2, len(e))
 
         def name_type(entities):
             ignore_types = [long_type(t) for t in ['router.link', 'connection', 'router.address']]
@@ -158,12 +174,36 @@ class QdmanageTest(TestCase):
 
     def test_ssl(self):
         """Simple test for SSL connection. Note system_tests_qdstat has a more complete SSL test"""
-        url = Url(self.router.addresses[1], scheme="amqps")
+        url = Url(self.router_1.addresses[1], scheme="amqps")
         schema = dictify(QdSchema().dump())
         actual = self.run_qdmanage("GET-JSON-SCHEMA")
         self.assertEquals(schema, dictify(json.loads(actual)))
 
-    def test_add_connector(self):
+    def create(self, type, name, port):
+        create_command = 'CREATE --type=' + type + ' --name=' + name + ' addr=0.0.0.0 port=' + port
+        connector = json.loads(self.run_qdmanage(create_command))
+        return connector
+
+    def test_create_delete_connector(self):
+        long_type = 'org.apache.qpid.dispatch.connector'
+        query_command = 'QUERY --type=' + long_type
+        output = json.loads(self.run_qdmanage(query_command))
+        name = output[0]['name']
+
+        # Delete an existing connector
+        delete_command = 'DELETE --type=' + long_type + ' --name=' + name
+        self.run_qdmanage(delete_command)
+        output = json.loads(self.run_qdmanage(query_command))
+        self.assertEqual(output, [])
+
+        # Re-create the connector and then try wait_connectors
+        self.create(long_type, name, str(QdmanageTest.inter_router_port))
+        full_name = 'connection/0.0.0.0:' + str(QdmanageTest.inter_router_port)
+        output = json.loads(self.run_qdmanage('READ --type=org.apache.qpid.dispatch.connection --name ' + full_name))
+
+        self.assertEquals(full_name, output['name'])
+
+    def test_zzz_add_connector(self):
         port = self.get_port()
         # dont provide role and make sure that role is defaulted to 'normal'
         command = "CREATE --type=connector --name=eaconn1 port=" + str(port) + " addr=0.0.0.0"
@@ -188,17 +228,68 @@ class QdmanageTest(TestCase):
         output = json.loads(self.run_qdmanage(command))
         self.assertEqual("normal", output['role'])
 
-        exception = False
-        port = self.get_port()
-        # provide mode as 'standalone' and role as 'inter-router'. This combination is not allowed
-        command = "CREATE --type=connector --name=eaconn3 port=" + str(port) + " addr=0.0.0.0 role=inter-router"
+    def test_zzz_create_delete_listener(self):
+        long_type = 'org.apache.qpid.dispatch.listener'
+        name = 'ealistener'
+
+        listener_port = self.get_port()
+
+        listener = self.create(long_type, name, str(listener_port))
+        self.assertEquals(listener['type'], long_type)
+        self.assertEquals(listener['name'], name)
+
+        exception_occurred = False
+
         try:
-            output = json.loads(self.run_qdmanage(command))
+            # Try to connect to the port that was closed, it should not return an error
+            wait_port(listener_port, host='127.0.0.1', timeout=2)
         except Exception as e:
-            self.assertTrue("BadRequestStatus: role='inter-router' only allowed with router mode='interior'" in e.message)
-            exception = True
+            exception_occurred = True
 
-        self.assertTrue(exception)
+        self.assertFalse(exception_occurred)
+
+        delete_command = 'DELETE --type=' + long_type + ' --name=' + name
+        self.run_qdmanage(delete_command)
+
+        exception_occurred = False
+        try:
+            # Try deleting an already deleted connector, this should raise an exception
+            self.run_qdmanage(delete_command)
+        except Exception as e:
+            exception_occurred = True
+            self.assertTrue("NotFoundStatus: No entity with name='" + name + "'" in e.message)
+
+        self.assertTrue(exception_occurred)
+
+        try:
+            # Try to connect to that port, it should not return an error
+            wait_port(listener_port, host='127.0.0.1', timeout=2)
+        except Exception as e:
+            exception_occurred = True
+
+        self.assertTrue(exception_occurred)
+
+        # Now try the same thing with a short_type
+        short_type = 'listener'
+
+        listener_port = self.get_port()
+
+        listener = self.create(long_type, name, str(listener_port))
+        self.assertEquals(listener['type'], long_type)
+        self.assertEquals(listener['name'], name)
+
+        delete_command = 'DELETE --type=' + short_type + ' --name=' + name
+        self.run_qdmanage(delete_command)
+
+        exception_occurred = False
+
+        try:
+            # Try to connect to that port, it should not return an error
+            wait_port(listener_port, host='127.0.0.1', timeout=2)
+        except Exception as e:
+            exception_occurred = True
+
+        self.assertTrue(exception_occurred)
 
 if __name__ == '__main__':
     unittest.main(main_module())


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


[19/50] [abbrv] qpid-dispatch git commit: DISPATCH-226 - Added a call to override _set() in SchemaEntity. Also added __getattr__ to EntityBase

Posted by tr...@apache.org.
DISPATCH-226 - Added a call to override _set() in SchemaEntity. Also added __getattr__ to EntityBase


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

Branch: refs/heads/master
Commit: 6b5067e7ec6d37694175013e6776cb9630ba7b64
Parents: 3bdc04f
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Fri Mar 4 09:32:17 2016 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Wed Mar 9 17:16:32 2016 -0500

----------------------------------------------------------------------
 python/qpid_dispatch/management/entity.py       | 16 ++++++---
 .../qpid_dispatch_internal/management/schema.py |  4 +--
 tests/system_tests_qdmanage.py                  | 37 ++++++++++++++++++++
 3 files changed, 50 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6b5067e7/python/qpid_dispatch/management/entity.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/entity.py b/python/qpid_dispatch/management/entity.py
index 442e30f..17ff00a 100644
--- a/python/qpid_dispatch/management/entity.py
+++ b/python/qpid_dispatch/management/entity.py
@@ -51,28 +51,34 @@ class EntityBase(object):
         self.__dict__['attributes'] = {}
         if attributes:
             for k, v in attributes.iteritems():
-                self._set(k, v)
+                self.attributes[k] = v
+                self.__dict__[self._pyname(k)] = v
         for k, v in kwargs.iteritems():
             self._set(k, v)
 
-    def __getitem__(self, name): return self.attributes[name]
+    def __getitem__(self, name):
+        return self.attributes[name]
+
+    def __getattr__(self, name):
+        return self.attributes[name]
 
     @staticmethod
     def _pyname(name): return name.replace('-', '_')
 
     def _set(self, name, value):
+        """Subclasses can override _set to do validation on each change"""
         self.attributes[name] = value
         self.__dict__[self._pyname(name)] = value
 
-    # Subclasses should override __setitem__ to do extra actions on set,
-    # e.g. validation.
+    # Access using []
     def __setitem__(self, name, value): self._set(name, value)
 
     def __delitem__(self, name):
         del self.attributes[name]
         del self.__dict__[self._pyname(name)]
 
-    def __setattr__(self, name, value): self.__setitem__(name, value)
+    # Access as python attribute.
+    def __setattr__(self, name, value): self._set(name, value)
 
     def __delattr__(self, name):
         self.__delitem__(name)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6b5067e7/python/qpid_dispatch_internal/management/schema.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/management/schema.py b/python/qpid_dispatch_internal/management/schema.py
index 8f7e961..a264285 100644
--- a/python/qpid_dispatch_internal/management/schema.py
+++ b/python/qpid_dispatch_internal/management/schema.py
@@ -634,8 +634,8 @@ class SchemaEntity(EntityBase):
         self.attributes.setdefault('type', entity_type.name)
         if validate: self.validate()
 
-    def __setitem__(self, name, value):
-        super(SchemaEntity, self).__setitem__(name, value)
+    def _set(self, name, value):
+        super(SchemaEntity, self)._set(name, value)
         self.validate()
 
     def validate(self, **kwargs):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6b5067e7/tests/system_tests_qdmanage.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_qdmanage.py b/tests/system_tests_qdmanage.py
index 6f1a1b4..2103915 100644
--- a/tests/system_tests_qdmanage.py
+++ b/tests/system_tests_qdmanage.py
@@ -163,5 +163,42 @@ class QdmanageTest(TestCase):
         actual = self.run_qdmanage("GET-JSON-SCHEMA")
         self.assertEquals(schema, dictify(json.loads(actual)))
 
+    def test_add_connector(self):
+        port = self.get_port()
+        # dont provide role and make sure that role is defaulted to 'normal'
+        command = "CREATE --type=connector --name=eaconn1 port=" + str(port) + " addr=0.0.0.0"
+        output = json.loads(self.run_qdmanage(command))
+        self.assertEqual("normal", output['role'])
+
+        exception = False
+        try:
+            port = self.get_port()
+            # provide the same connector name (eaconn1) and make sure there is a duplicate value failure
+            command = "CREATE --type=connector --name=eaconn1 port=" + str(port) + " addr=0.0.0.0"
+            output = json.loads(self.run_qdmanage(command))
+        except Exception as e:
+            self.assertTrue("Duplicate value 'eaconn1' for unique attribute 'name'" in e.message)
+            exception = True
+
+        self.assertTrue(exception)
+
+        port = self.get_port()
+        # provide role as 'normal' and make sure that it is preserved
+        command = "CREATE --type=connector --name=eaconn2 port=" + str(port) + " addr=0.0.0.0 role=normal"
+        output = json.loads(self.run_qdmanage(command))
+        self.assertEqual("normal", output['role'])
+
+        exception = False
+        port = self.get_port()
+        # provide mode as 'standalone' and role as 'inter-router'. This combination is not allowed
+        command = "CREATE --type=connector --name=eaconn3 port=" + str(port) + " addr=0.0.0.0 role=inter-router"
+        try:
+            output = json.loads(self.run_qdmanage(command))
+        except Exception as e:
+            self.assertTrue("BadRequestStatus: role='inter-router' only allowed with router mode='interior'" in e.message)
+            exception = True
+
+        self.assertTrue(exception)
+
 if __name__ == '__main__':
     unittest.main(main_module())


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


[40/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Pass in a char phase (not int phase) to the qd_address_iterator_set_phase() while creating new addresses

Posted by tr...@apache.org.
DISPATCH-179 - Pass in a char phase (not int phase) to the qd_address_iterator_set_phase() while creating new addresses


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

Branch: refs/heads/master
Commit: 7ec750b259789495b2e8974501b265b4b41605f7
Parents: 6dfb3dc
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Thu Mar 17 17:05:42 2016 -0400
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Thu Mar 17 17:05:42 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7ec750b2/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index d014bf3..f76311f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -733,7 +733,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
 
         addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter, &in_phase, &out_phase));
         addr_phase = dir == QD_INCOMING ? in_phase : out_phase;
-        qd_address_iterator_set_phase(iter, addr_phase);
+        qd_address_iterator_set_phase(iter, (char) addr_phase + '0');
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
     }


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


[38/50] [abbrv] qpid-dispatch git commit: NO-JIRA - Convert "true" and "false" into booleans for attribute values

Posted by tr...@apache.org.
NO-JIRA - Convert "true" and "false" into booleans for attribute values


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

Branch: refs/heads/master
Commit: 17ebf681a9f5945969aa66f1b9705dbf62c31366
Parents: b3e011e
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 17 07:11:59 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 17 07:11:59 2016 -0400

----------------------------------------------------------------------
 tools/qdmanage | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/17ebf681/tools/qdmanage
----------------------------------------------------------------------
diff --git a/tools/qdmanage b/tools/qdmanage
index 9c7dd18..6954872 100755
--- a/tools/qdmanage
+++ b/tools/qdmanage
@@ -30,7 +30,10 @@ def attr_split(attrstr):
     """Split an attribute string of the form name=value or name to indicate None"""
     nv = attrstr.split("=", 1)
     if len(nv) == 1: return [nv[0], None]
-    else: return nv
+    else:
+        if nv[1] == "true": nv[1] = True
+        if nv[1] == "false": nv[1] = False
+        return nv
 
 class QdManage():
 


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


[34/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Start outbound connectors on configuration.

Posted by tr...@apache.org.
DISPATCH-179 - Start outbound connectors on configuration.


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

Branch: refs/heads/master
Commit: 354e69165efbce24eb1400104b7526a07c7cd2ff
Parents: c8f2c9d
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 18:01:14 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 18:01:14 2016 -0400

----------------------------------------------------------------------
 src/connection_manager.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/354e6916/src/connection_manager.c
----------------------------------------------------------------------
diff --git a/src/connection_manager.c b/src/connection_manager.c
index 039202e..07c7d1e 100644
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@ -230,16 +230,10 @@ qd_config_connector_t *qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_ent
     }
     DEQ_ITEM_INIT(cc);
 
-    if (strcmp(cc->configuration.role, "route-container") == 0) {
-        DEQ_INSERT_TAIL(cm->on_demand_connectors, cc);
-        qd_log(cm->log_source, QD_LOG_INFO, "Configured route-container connector: %s:%s name=%s",
-               cc->configuration.host, cc->configuration.port,
-               cc->configuration.name ? cc->configuration.name : "<none>");
-    } else {
-        DEQ_INSERT_TAIL(cm->config_connectors, cc);
-        qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s",
-               cc->configuration.host, cc->configuration.port, cc->configuration.role);
-    }
+    DEQ_INSERT_TAIL(cm->config_connectors, cc);
+    qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s, name=%s",
+           cc->configuration.host, cc->configuration.port, cc->configuration.role,
+           cc->configuration.name ? cc->configuration.name : "<none>");
 
     return cc;
 }


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


[03/50] [abbrv] qpid-dispatch git commit: DISPATCH-228 - Added named DEQ macros for multi-list membership.

Posted by tr...@apache.org.
DISPATCH-228 - Added named DEQ macros for multi-list membership.

Conflicts:
	include/qpid/dispatch/ctools.h


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

Branch: refs/heads/master
Commit: c72e179ef297d4b94ebda5c025d3eb2f87936bfe
Parents: 1dffeb6
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Feb 29 15:54:22 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Feb 29 15:58:34 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/ctools.h | 128 ++++++++++++++++++++----------------
 tests/tool_test.c              |  56 ++++++++++++++++
 2 files changed, 126 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/include/qpid/dispatch/ctools.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/ctools.h b/include/qpid/dispatch/ctools.h
index 3ac5998..9ab1c70 100644
--- a/include/qpid/dispatch/ctools.h
+++ b/include/qpid/dispatch/ctools.h
@@ -41,134 +41,146 @@
     size_t  size;       \
     } d
 
-#define DEQ_LINKS(t) t *prev; t *next
+#define DEQ_LINKS_N(n,t) t *prev##n; t *next##n
+#define DEQ_LINKS(t) DEQ_LINKS_N(,t)
 #define DEQ_EMPTY {0,0,0,0}
 
 #define DEQ_INIT(d) do { (d).head = 0; (d).tail = 0; (d).scratch = 0; (d).size = 0; } while (0)
 #define DEQ_IS_EMPTY(d) ((d).head == 0)
-#define DEQ_ITEM_INIT(i) do { (i)->next = 0; (i)->prev = 0; } while(0)
+#define DEQ_ITEM_INIT_N(n,i) do { (i)->next##n = 0; (i)->prev##n = 0; } while(0)
+#define DEQ_ITEM_INIT(i) DEQ_ITEM_INIT_N(,i)
 #define DEQ_HEAD(d) ((d).head)
 #define DEQ_TAIL(d) ((d).tail)
 #define DEQ_SIZE(d) ((d).size)
-#define DEQ_NEXT(i) (i)->next
-#define DEQ_PREV(i) (i)->prev
+#define DEQ_NEXT_N(n,i) (i)->next##n
+#define DEQ_NEXT(i) DEQ_NEXT_N(,i)
+#define DEQ_PREV_N(n,i) (i)->prev##n
+#define DEQ_PREV(i) DEQ_PREV_N(,i)
 #define DEQ_MOVE(d1,d2) do {d2 = d1; DEQ_INIT(d1);} while (0)
 /**
  *@pre ptr points to first element of deq
  *@post ptr points to first element of deq that passes test, or 0. Test should involve ptr.
  */
-#define DEQ_FIND(ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT(ptr);
+#define DEQ_FIND_N(n,ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT_N(n,ptr);
+#define DEQ_FIND(ptr,test) DEQ_FIND_N(,ptr,test)
 
-#define DEQ_INSERT_HEAD(d,i)      \
+#define DEQ_INSERT_HEAD_N(n,d,i)  \
 do {                              \
-    CT_ASSERT((i)->next == 0);    \
-    CT_ASSERT((i)->prev == 0);    \
+    CT_ASSERT((i)->next##n == 0); \
+    CT_ASSERT((i)->prev##n == 0); \
     if ((d).head) {               \
-        (i)->next = (d).head;     \
-        (d).head->prev = i;       \
+        (i)->next##n = (d).head;  \
+        (d).head->prev##n = i;    \
     } else {                      \
         (d).tail = i;             \
-        (i)->next = 0;            \
+        (i)->next##n = 0;         \
         CT_ASSERT((d).size == 0); \
     }                             \
-    (i)->prev = 0;                \
+    (i)->prev##n = 0;             \
     (d).head = i;                 \
     (d).size++;                   \
 } while (0)
+#define DEQ_INSERT_HEAD(d,i) DEQ_INSERT_HEAD_N(,d,i)
 
-#define DEQ_INSERT_TAIL(d,i)      \
+#define DEQ_INSERT_TAIL_N(n,d,i)  \
 do {                              \
-    CT_ASSERT((i)->next == 0);    \
-    CT_ASSERT((i)->prev == 0);    \
+    CT_ASSERT((i)->next##n == 0); \
+    CT_ASSERT((i)->prev##n == 0); \
     if ((d).tail) {               \
-        (i)->prev = (d).tail;     \
-        (d).tail->next = i;       \
+        (i)->prev##n = (d).tail;  \
+        (d).tail->next##n = i;    \
     } else {                      \
         (d).head = i;             \
-        (i)->prev = 0;            \
+        (i)->prev##n = 0;         \
         CT_ASSERT((d).size == 0); \
     }                             \
-    (i)->next = 0;                \
+    (i)->next##n = 0;             \
     (d).tail = i;                 \
     (d).size++;                   \
 } while (0)
+#define DEQ_INSERT_TAIL(d,i) DEQ_INSERT_TAIL_N(,d,i)
 
-#define DEQ_REMOVE_HEAD(d)        \
+#define DEQ_REMOVE_HEAD_N(n,d)    \
 do {                              \
     CT_ASSERT((d).head);          \
     if ((d).head) {               \
         (d).scratch = (d).head;   \
-        (d).head = (d).head->next;  \
+        (d).head = (d).head->next##n;  \
         if ((d).head == 0) {      \
             (d).tail = 0;         \
             CT_ASSERT((d).size == 1); \
-        } else                  \
-            (d).head->prev = 0; \
-        (d).size--;             \
-        (d).scratch->next = 0;  \
-        (d).scratch->prev = 0;  \
-    }                           \
+        } else                     \
+            (d).head->prev##n = 0; \
+        (d).size--;                \
+        (d).scratch->next##n = 0;  \
+        (d).scratch->prev##n = 0;  \
+    }                              \
 } while (0)
+#define DEQ_REMOVE_HEAD(d)  DEQ_REMOVE_HEAD_N(,d)
 
-#define DEQ_REMOVE_TAIL(d)      \
+#define DEQ_REMOVE_TAIL_N(n,d)  \
 do {                            \
     CT_ASSERT((d).tail);        \
     if ((d).tail) {             \
         (d).scratch = (d).tail; \
-        (d).tail = (d).tail->prev;  \
+        (d).tail = (d).tail->prev##n;  \
         if ((d).tail == 0) {    \
             (d).head = 0;       \
             CT_ASSERT((d).size == 1); \
         } else                  \
-            (d).tail->next = 0; \
+            (d).tail->next##n = 0; \
         (d).size--;             \
-        (d).scratch->next = 0;  \
-        (d).scratch->prev = 0;  \
+        (d).scratch->next##n = 0;  \
+        (d).scratch->prev##n = 0;  \
     }                           \
 } while (0)
-
-#define DEQ_INSERT_AFTER(d,i,a) \
-do {                            \
-    CT_ASSERT((i)->next == 0);  \
-    CT_ASSERT((i)->prev == 0);  \
-    CT_ASSERT(a);               \
-    if ((a)->next)              \
-        (a)->next->prev = (i);  \
-    else                        \
-        (d).tail = (i);         \
-    (i)->next = (a)->next;      \
-    (i)->prev = (a);            \
-    (a)->next = (i);            \
-    (d).size++;                 \
+#define DEQ_REMOVE_TAIL(d) DEQ_REMOVE_TAIL_N(,d)
+
+#define DEQ_INSERT_AFTER_N(n,d,i,a) \
+do {                                \
+    CT_ASSERT((i)->next##n == 0);   \
+    CT_ASSERT((i)->prev##n == 0);   \
+    CT_ASSERT(a);                   \
+    if ((a)->next##n)               \
+        (a)->next##n->prev##n = (i);  \
+    else                            \
+        (d).tail = (i);             \
+    (i)->next##n = (a)->next##n;    \
+    (i)->prev##n = (a);             \
+    (a)->next##n = (i);             \
+    (d).size++;                     \
 } while (0)
+#define DEQ_INSERT_AFTER(d,i,a) DEQ_INSERT_AFTER_N(,d,i,a)
 
-#define DEQ_REMOVE(d,i)                        \
+#define DEQ_REMOVE_N(n,d,i)                    \
 do {                                           \
-    if ((i)->next)                             \
-        (i)->next->prev = (i)->prev;           \
+    if ((i)->next##n)                          \
+        (i)->next##n->prev##n = (i)->prev##n;  \
     else                                       \
-        (d).tail = (i)->prev;                  \
-    if ((i)->prev)                             \
-        (i)->prev->next = (i)->next;           \
+        (d).tail = (i)->prev##n;               \
+    if ((i)->prev##n)                          \
+        (i)->prev##n->next##n = (i)->next##n;  \
     else                                       \
-        (d).head = (i)->next;                  \
+        (d).head = (i)->next##n;               \
     (d).size--;                                \
-    (i)->next = 0;                             \
-    (i)->prev = 0;                             \
+    (i)->next##n = 0;                          \
+    (i)->prev##n = 0;                          \
     CT_ASSERT((d).size || (!(d).head && !(d).tail)); \
 } while (0)
+#define DEQ_REMOVE(d,i) DEQ_REMOVE_N(,d,i)
 
-#define DEQ_APPEND(d1,d2)               \
+#define DEQ_APPEND_N(n,d1,d2)           \
 do {                                    \
     if (!(d1).head)                     \
         (d1) = (d2);                    \
     else if ((d2).head) {               \
-        (d1).tail->next = (d2).head;    \
-        (d2).head->prev = (d1).tail;    \
+        (d1).tail->next##n = (d2).head; \
+        (d2).head->prev##n = (d1).tail; \
         (d1).tail = (d2).tail;          \
         (d1).size += (d2).size;         \
     }                                   \
     DEQ_INIT(d2);                       \
 } while (0)
+#define DEQ_APPEND(d1,d2) DEQ_APPEND_N(,d1,d2)
 
 #endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/tests/tool_test.c
----------------------------------------------------------------------
diff --git a/tests/tool_test.c b/tests/tool_test.c
index a4ce830..4b68edc 100644
--- a/tests/tool_test.c
+++ b/tests/tool_test.c
@@ -32,6 +32,15 @@ typedef struct item_t {
 DEQ_DECLARE(item_t, item_list_t);
 
 
+typedef struct multi_item_t {
+    DEQ_LINKS(struct multi_item_t);
+    DEQ_LINKS_N(second, struct multi_item_t);
+    char letter;
+} multi_item_t;
+
+DEQ_DECLARE(multi_item_t, multi_item_list_t);
+
+
 static char* list_well_formed(item_list_t list, char *key)
 {
     item_t *ptr;
@@ -190,6 +199,52 @@ static char* test_deq_basic2(void *context)
 }
 
 
+static char* test_deq_multi(void *context)
+{
+    multi_item_list_t  list1;
+    multi_item_list_t  list2;
+    multi_item_t       item[10];
+    multi_item_t      *ptr;
+    int                idx;
+
+    DEQ_INIT(list1);
+    DEQ_INIT(list2);
+    if (DEQ_SIZE(list1) != 0) return "Expected zero initial size 1";
+    if (DEQ_SIZE(list2) != 0) return "Expected zero initial size 2";
+
+    for (idx = 0; idx < 10; idx++) {
+        DEQ_ITEM_INIT(&item[idx]);
+        DEQ_ITEM_INIT_N(second, &item[idx]);
+        item[idx].letter = '0' + idx;
+
+        DEQ_INSERT_TAIL(list1, &item[idx]);
+        if ((idx & 1) == 0) // even index
+            DEQ_INSERT_TAIL_N(second, list2, &item[idx]);
+    }
+
+    if (DEQ_SIZE(list1) != 10) return "Expected list 1 size to be 10";
+    if (DEQ_SIZE(list2) != 5)  return "Expected list 2 size to be 5";
+
+    idx = 0;
+    while (DEQ_HEAD(list1)) {
+        ptr = DEQ_HEAD(list1);
+        DEQ_REMOVE_HEAD(list1);
+        if (ptr->letter != '0' + idx) return "Incorrect value in list 1";
+        idx++;
+    }
+
+    idx = 0;
+    while (DEQ_HEAD(list2)) {
+        ptr = DEQ_HEAD(list2);
+        DEQ_REMOVE_HEAD_N(second, list2);
+        if (ptr->letter != '0' + idx) return "Incorrect value in list 2";
+        idx += 2;
+    }
+
+    return 0;
+}
+
+
 static char* test_bitmask(void *context)
 {
     qd_bitmask_t *bm;
@@ -257,6 +312,7 @@ int tool_tests(void)
 
     TEST_CASE(test_deq_basic, 0);
     TEST_CASE(test_deq_basic2, 0);
+    TEST_CASE(test_deq_multi, 0);
     TEST_CASE(test_bitmask, 0);
 
     return result;


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


[25/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Implemented plumbing for management delete of route objects

Posted by tr...@apache.org.
DISPATCH-179 - Implemented plumbing for management delete of route objects


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

Branch: refs/heads/master
Commit: 0a98b3a17522149392708e30805ed2eeee578ea8
Parents: bd0f558
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Fri Mar 11 12:06:01 2016 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Fri Mar 11 12:06:01 2016 -0500

----------------------------------------------------------------------
 src/router_core/agent.c         |  4 +-
 src/router_core/agent_address.c | 31 ---------------
 src/router_core/agent_address.h |  5 ---
 src/router_core/agent_route.c   | 75 +++++++++++++++++++++++++++++++++++-
 4 files changed, 76 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0a98b3a1/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 2150b43..1833880 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -360,10 +360,10 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_ROUTE:       break;
+    case QD_ROUTER_ROUTE:       qdra_route_delete_CT(core, query, name, identity); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
-    case QD_ROUTER_ADDRESS:     qdra_address_delete_CT(core, name, identity, query); break;
+    case QD_ROUTER_ADDRESS:     break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0a98b3a1/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index 1a9a44c..c8a1b5d 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -293,34 +293,3 @@ void qdra_address_get_next_CT(qdr_core_t *core, qdr_query_t *query)
     //
     qdr_agent_enqueue_response_CT(core, query);
 }
-
-void qdra_address_delete_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qd_field_iterator_t *identity,
-                             qdr_query_t          *query)
-{
-    bool success = true;
-
-    if (identity) {//If there is identity, ignore the name
-       //TOOD - do something here
-    }
-    else if (name) {
-       //TOOD - do something here
-    }
-    else {
-        query->status = QD_AMQP_BAD_REQUEST;
-        success = false;
-    }
-
-
-    // TODO - Add more logic here.
-    if (success) {
-        // If the request was successful then the statusCode MUST be 204 (No Content).
-        query->status = QD_AMQP_NO_CONTENT;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0a98b3a1/src/router_core/agent_address.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.h b/src/router_core/agent_address.h
index abe6d89..b47433e 100644
--- a/src/router_core/agent_address.h
+++ b/src/router_core/agent_address.h
@@ -30,11 +30,6 @@ void qdra_address_get_CT(qdr_core_t *core,
                       qdr_query_t          *query,
                       const char *qdr_address_columns[]);
 
-void qdra_address_delete_CT(qdr_core_t          *core,
-                            qd_field_iterator_t *name,
-                            qd_field_iterator_t *identity,
-                            qdr_query_t          *query);
-
 
 #define QDR_ADDRESS_COLUMN_COUNT 15
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0a98b3a1/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index 2373624..383d1bc 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+#include <qpid/dispatch/ctools.h>
 #include "agent_route.h"
 #include "route_control.h"
 #include <stdio.h>
@@ -236,6 +237,78 @@ static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
     return QD_TREATMENT_ANYCAST_BALANCED;
 }
 
+static qdr_route_config_t *qdr_route_config_find_by_identity(qdr_core_t *core, qd_field_iterator_t *identity) {
+    if (!identity)
+        return 0;
+
+    qdr_route_config_list_t  route_config = core->route_config;
+
+    qdr_route_config_t *rc = DEQ_HEAD(route_config);
+
+    while (rc) {
+        // Convert the passed in identity to a char*
+        char id[100];
+        snprintf(id, 100, "%ld", rc->identity);
+        if (qd_field_iterator_equal(identity, (const unsigned char *)id))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+
+}
+
+static qdr_route_config_t *qdr_route_config_find_by_name(qdr_core_t *core, qd_field_iterator_t *name) {
+    if (!name)
+        return 0;
+
+    qdr_route_config_list_t  route_config = core->route_config;
+
+    qdr_route_config_t *rc = DEQ_HEAD(route_config);
+
+    while (rc) {// Sometimes the name can be null
+        if (rc->name && qd_field_iterator_equal(name, (const unsigned char *)rc->name))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+
+}
+
+static void qdra_route_delete_route_set_status(qdr_core_t *core, qdr_query_t *query, qdr_route_config_t *route)
+{
+    if (route) {
+        qdr_route_delete_CT(core, route);
+        query->status = QD_AMQP_NO_CONTENT;
+    }
+    else {
+        query->status = QD_AMQP_NOT_FOUND;
+    }
+}
+
+void qdra_route_delete_CT(qdr_core_t          *core,
+                          qdr_query_t          *query,
+                          qd_field_iterator_t *name,
+                          qd_field_iterator_t *identity)
+{
+    if (identity) {
+         qdr_route_config_t *route = qdr_route_config_find_by_identity(core, identity);
+         qdra_route_delete_route_set_status(core, query, route);
+    }
+    else if (name) {
+        qdr_route_config_t *route = qdr_route_config_find_by_name(core, name);
+        qdra_route_delete_route_set_status(core, query, route);
+    }
+    else { // No name and no identity
+        query->status = QD_AMQP_BAD_REQUEST;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
 
 void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
                           qdr_query_t *query, qd_parsed_field_t *in_body)
@@ -270,7 +343,7 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
         qdr_route_path_t path = QDR_ROUTE_PATH_DIRECT;
         if (path_field) {
             qd_field_iterator_t *path_iter = qd_parse_raw(path_field);
-            if      (qd_field_iterator_equal(path_iter, (unsigned char*) "direct"))
+            if  (qd_field_iterator_equal(path_iter, (unsigned char*) "direct"))
                 path = QDR_ROUTE_PATH_DIRECT;
             else if (qd_field_iterator_equal(path_iter, (unsigned char*) "source"))
                 path = QDR_ROUTE_PATH_SOURCE;


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


[23/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Removed wrong comment on ConnectorEntity delete. Cut and paste mistake

Posted by tr...@apache.org.
DISPATCH-179 - Removed wrong comment on ConnectorEntity delete. Cut and paste mistake


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

Branch: refs/heads/master
Commit: 90775af4126f32ed75ab7323234a997611d685b0
Parents: 68aab38
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Fri Mar 11 09:54:14 2016 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Fri Mar 11 09:54:14 2016 -0500

----------------------------------------------------------------------
 python/qpid_dispatch_internal/management/agent.py | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/90775af4/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 f5443d4..26a3b54 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -290,7 +290,6 @@ class ConnectorEntity(EntityAdapter):
         return config_connector
 
     def _delete(self):
-        """Can't actually delete a log source but return it to the default state"""
         self._qd.qd_connection_manager_delete_connector(self._dispatch, self._implementations[0].key)
 
     def _identifier(self): return _addr_port_identifier(self)


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


[35/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Removed QD_LINK_WAYPOINT link-type which is no longer used.

Posted by tr...@apache.org.
DISPATCH-179 - Removed QD_LINK_WAYPOINT link-type which is no longer used.


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

Branch: refs/heads/master
Commit: de4413fe69de2dd81d5d62d4b03e8f879549c7bc
Parents: 354e691
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 18:01:57 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 18:01:57 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h |  1 -
 src/router_core/agent_link.c        |  1 -
 src/router_core/connections.c       | 24 +-----------------------
 3 files changed, 1 insertion(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/de4413fe/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 271954b..6e5baa5 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -128,7 +128,6 @@ void qdr_send_to2(qdr_core_t *core, qd_message_t *msg, const char *addr,
 
 typedef enum {
     QD_LINK_ENDPOINT,   ///< A link to a connected endpoint
-    QD_LINK_WAYPOINT,   ///< A link to a configured waypoint
     QD_LINK_CONTROL,    ///< A link to a peer router for control messages
     QD_LINK_ROUTER      ///< A link to a peer router for routed messages
 } qd_link_type_t;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/de4413fe/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index b9f23c2..af06f6d 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -56,7 +56,6 @@ static const char *qd_link_type_name(qd_link_type_t lt)
 {
     switch (lt) {
     case QD_LINK_ENDPOINT : return "endpoint";
-    case QD_LINK_WAYPOINT : return "waypoint";
     case QD_LINK_CONTROL  : return "router-control";
     case QD_LINK_ROUTER   : return "inter-router";
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/de4413fe/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index fbce669..a07d11a 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -810,10 +810,8 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
 
     //
     // Reject any attaches of inter-router links that arrive on connections that are not inter-router.
-    // Reject any waypoint links.  Waypoint links are always initiated by a router, not the remote container.
     //
-    if ((link->link_type == QD_LINK_WAYPOINT) ||
-        ((link->link_type == QD_LINK_CONTROL || link->link_type == QD_LINK_ROUTER) && conn->role != QDR_ROLE_INTER_ROUTER)) {
+    if (((link->link_type == QD_LINK_CONTROL || link->link_type == QD_LINK_ROUTER) && conn->role != QDR_ROLE_INTER_ROUTER)) {
         qdr_link_outbound_detach_CT(core, link, 0, QDR_CONDITION_FORBIDDEN);
         qdr_terminus_free(source);
         qdr_terminus_free(target);
@@ -870,10 +868,6 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
             break;
         }
 
-        case QD_LINK_WAYPOINT:
-            // No action, waypoint links are rejected above.
-            break;
-
         case QD_LINK_CONTROL:
             qdr_link_outbound_second_attach_CT(core, link, source, target);
             qdr_link_issue_credit_CT(core, link, link->capacity);
@@ -923,10 +917,6 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
             break;
         }
 
-        case QD_LINK_WAYPOINT:
-            // No action, waypoint links are rejected above.
-            break;
-
         case QD_LINK_CONTROL:
             link->owning_addr = core->hello_addr;
             qdr_add_link_ref(&core->hello_addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
@@ -998,9 +988,6 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
             }
             break;
 
-        case QD_LINK_WAYPOINT:
-            break;
-
         case QD_LINK_CONTROL:
             break;
 
@@ -1031,9 +1018,6 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
             }
             break;
 
-        case QD_LINK_WAYPOINT:
-            break;
-
         case QD_LINK_CONTROL:
             link->owning_addr = core->hello_addr;
             qdr_add_link_ref(&core->hello_addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
@@ -1109,9 +1093,6 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
                 qdr_del_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
             break;
 
-        case QD_LINK_WAYPOINT:
-            break;
-
         case QD_LINK_CONTROL:
             break;
 
@@ -1130,9 +1111,6 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
             }
             break;
 
-        case QD_LINK_WAYPOINT:
-            break;
-
         case QD_LINK_CONTROL:
             qdr_del_link_ref(&core->hello_addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
             core->control_links_by_mask_bit[conn->mask_bit] = 0;


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


[41/50] [abbrv] qpid-dispatch git commit: DISPATCH_179 - Accept senders to unknown addresses; Don't issue credit to senders if there are no receivers; Disconnect linkage from PN->QDR on detach.

Posted by tr...@apache.org.
DISPATCH_179 - Accept senders to unknown addresses; Don't issue credit to senders if
there are no receivers; Disconnect linkage from PN->QDR on detach.


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

Branch: refs/heads/master
Commit: 620d779a528252a7bd3a252a42679fe8d26644d1
Parents: 7ec750b
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 09:07:37 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 09:07:37 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c | 9 +++++++--
 src/router_node.c             | 6 ++++++
 2 files changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/620d779a/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index f76311f..8ecd633 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -886,7 +886,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                 // This link has a target address
                 //
                 bool           link_route;
-                qdr_address_t *addr = qdr_lookup_terminus_address_CT(core, dir, target, false, false, &link_route);
+                qdr_address_t *addr = qdr_lookup_terminus_address_CT(core, dir, target, true, false, &link_route);
                 if (!addr) {
                     //
                     // No route to this destination, reject the link
@@ -915,7 +915,12 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                     link->owning_addr = addr;
                     qdr_add_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
                     qdr_link_outbound_second_attach_CT(core, link, source, target);
-                    qdr_link_issue_credit_CT(core, link, link->capacity);
+
+                    //
+                    // Issue the initial credit only if there are destinations for the address.
+                    //
+                    if (DEQ_SIZE(addr->subscriptions) || DEQ_SIZE(addr->rlinks) || qd_bitmask_cardinality(addr->rnodes))
+                        qdr_link_issue_credit_CT(core, link, link->capacity);
                 }
             }
             break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/620d779a/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 3a9b8af..b374cd7 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -447,6 +447,12 @@ static int router_link_detach_handler(void* context, qd_link_t *link, qd_detach_
         if (!error && dt == QD_LOST)
             error = qdr_error("qd:routed-link-lost", "Connectivity to the peer container was lost");
         qdr_link_detach(rlink, dt, error);
+
+        //
+        // This is the last event for this link that we will send into the core.  Remove the
+        // core linkage.  Note that the core->qd linkage is still in place.
+        //
+        qd_link_set_context(link, 0);
     }
 
     return 0;


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


[48/50] [abbrv] qpid-dispatch git commit: DISPATCH-231 - Withhold the initial credit on auto-links as well (for waypoints).

Posted by tr...@apache.org.
DISPATCH-231 - Withhold the initial credit on auto-links as well (for waypoints).


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

Branch: refs/heads/master
Commit: 51d0793e2ff43037f8b561194ad4c13e3c7a8608
Parents: 8c19dd1
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 16:38:12 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 16:38:12 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/51d0793e/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 17d8591..6a65707 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -724,16 +724,18 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
     //
     // There was no match for a link-route destination, look for a message-route address.
     //
+    int in_phase;
+    int out_phase;
+    int addr_phase;
+    qd_address_treatment_t treat = qdr_treatment_for_address_CT(core, iter, &in_phase, &out_phase);
+
     qd_address_iterator_override_prefix(iter, '\0'); // Cancel previous override
+    addr_phase = dir == QD_INCOMING ? in_phase : out_phase;
+    qd_address_iterator_set_phase(iter, (char) addr_phase + '0');
+
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr && create_if_not_found) {
-        int in_phase;
-        int out_phase;
-        int addr_phase;
-
-        addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter, &in_phase, &out_phase));
-        addr_phase = dir == QD_INCOMING ? in_phase : out_phase;
-        qd_address_iterator_set_phase(iter, (char) addr_phase + '0');
+        addr = qdr_address_CT(core, treat);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
     }
@@ -1031,7 +1033,6 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
         //
         // Handle incoming link cases
         //
-        qdr_link_issue_credit_CT(core, link, link->capacity);
         switch (link->link_type) {
         case QD_LINK_ENDPOINT:
             if (link->auto_link) {
@@ -1045,12 +1046,18 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
                     link->owning_addr = link->auto_link->addr;
                 }
             }
-            break;
 
-        case QD_LINK_CONTROL:
+            //
+            // Issue credit if this is an anonymous link or if its address has at least one reachable destination.
+            //
+            qdr_address_t *addr = link->owning_addr;
+            if (!addr || (DEQ_SIZE(addr->subscriptions) || DEQ_SIZE(addr->rlinks) || qd_bitmask_cardinality(addr->rnodes)))
+                qdr_link_issue_credit_CT(core, link, link->capacity);
             break;
 
+        case QD_LINK_CONTROL:
         case QD_LINK_ROUTER:
+            qdr_link_issue_credit_CT(core, link, link->capacity);
             break;
         }
     } else {


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


[28/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Significant update to the management model for routes. Removed the singular "route" configuration and replaced it with three distinct object types: address, linkRoute, and autoLink.

Posted by tr...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 96b5ef9..4e1c57c 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -20,85 +20,11 @@
 #include "route_control.h"
 #include <stdio.h>
 
-ALLOC_DEFINE(qdr_route_active_t);
-ALLOC_DEFINE(qdr_route_config_t);
+ALLOC_DEFINE(qdr_link_route_t);
+ALLOC_DEFINE(qdr_auto_link_t);
 ALLOC_DEFINE(qdr_conn_identifier_t);
 
 
-
-static const char *qdr_configure_address_prefix_CT(qdr_core_t              *core,
-                                                   qd_parsed_field_t       *addr_field,
-                                                   char                     cls,
-                                                   qd_address_treatment_t   treatment,
-                                                   qdr_address_config_t   **_addr)
-{
-    if (!addr_field)
-        return "Missing address field";
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_config_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr)
-        return "Address prefix conflicts with existing prefix";
-
-    addr = new_qdr_address_config_t();
-    DEQ_ITEM_INIT(addr);
-    addr->treatment = treatment;
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addr_config, addr);
-    }
-
-    *_addr = addr;
-    return 0;
-}
-
-
-static const char *qdr_configure_address_CT(qdr_core_t              *core,
-                                            qd_parsed_field_t       *addr_field,
-                                            char                     cls,
-                                            qd_address_treatment_t   treatment,
-                                            qdr_address_t          **_addr)
-{
-    if (!addr_field)
-        return "Missing address field";
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr)
-        return "Address conflicts with existing address";
-
-    addr = qdr_address_CT(core, treatment);
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addrs, addr);
-    }
-
-    *_addr = addr;
-    return 0;
-}
-
-
-static void qdr_route_free_CT(qdr_core_t *core, qdr_route_config_t *route)
-{
-    if (route->name)
-        free(route->name);
-    // TODO - Clean up address records
-    free_qdr_route_config_t(route);
-}
-
-
 static qdr_conn_identifier_t *qdr_route_declare_id_CT(qdr_core_t          *core,
                                                       qd_field_iterator_t *conn_id,
                                                       bool                 is_container)
@@ -119,207 +45,138 @@ static qdr_conn_identifier_t *qdr_route_declare_id_CT(qdr_core_t          *core,
     return cid;
 }
 
+
 static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identifier_t *cid)
 {
     //
     // If this connection identifier has no open connection and no referencing routes,
     // it can safely be deleted and removed from the hash index.
     //
-    if (cid->open_connection == 0 && DEQ_IS_EMPTY(cid->active_refs)) {
+    if (cid->open_connection == 0 && DEQ_IS_EMPTY(cid->link_route_refs) && DEQ_IS_EMPTY(cid->auto_link_refs)) {
         qd_hash_remove_by_handle(core->conn_id_hash, cid->hash_handle);
         free_qdr_conn_identifier_t(cid);
     }
 }
 
 
-static void qdr_route_log_CT(qdr_core_t *core, const char *text, qdr_route_config_t *route, qdr_connection_t *conn)
+static void qdr_route_log_CT(qdr_core_t *core, const char *text, const char *name, uint64_t id, qdr_connection_t *conn)
 {
     const char *key = (const char*) qd_hash_key_by_handle(conn->conn_id->hash_handle);
     char  id_string[64];
-    const char *name = route->name ? route->name : id_string;
+    const char *log_name = name ? name : id_string;
 
-    if (!route->name)
-        snprintf(id_string, 64, "%ld", route->identity);
+    if (!name)
+        snprintf(id_string, 64, "%ld", id);
 
-    qd_log(core->log, QD_LOG_INFO, "Route '%s' %s on %s %s",
-           name, text, key[0] == 'L' ? "connection" : "container", &key[1]);
+    qd_log(core->log, QD_LOG_INFO, "%s '%s' on %s %s",
+           log_name, text, key[0] == 'L' ? "connection" : "container", &key[1]);
 }
 
 
-static void qdr_route_activate_CT(qdr_core_t *core, qdr_route_active_t *active, qdr_connection_t *conn)
+static void qdr_link_route_activate_CT(qdr_core_t *core, qdr_link_route_t *lr, qdr_connection_t *conn)
 {
-    qdr_route_config_t *route = active->config;
-    const char         *key;
+    const char *key;
 
-    qdr_route_log_CT(core, "Activated", route, conn);
+    qdr_route_log_CT(core, "Activated Link Route", lr->name, lr->identity, conn);
 
-    if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
-        //
-        // Activate the address(es) for link-routed destinations.  If this is the first
-        // activation for this address, notify the router module of the added address.
-        //
-        if (route->out_addr) {
-            qdr_add_connection_ref(&route->out_addr->conns, conn);
-            if (DEQ_SIZE(route->out_addr->conns) == 1) {
-                key = (const char*) qd_hash_key_by_handle(route->out_addr->hash_handle);
-                if (key)
-                    qdr_post_mobile_added_CT(core, key);
-            }
-        }
-
-        if (route->in_addr) {
-            qdr_add_connection_ref(&route->in_addr->conns, conn);
-            if (DEQ_SIZE(route->in_addr->conns) == 1) {
-                key = (const char*) qd_hash_key_by_handle(route->in_addr->hash_handle);
-                if (key)
-                    qdr_post_mobile_added_CT(core, key);
-            }
+    //
+    // Activate the address for link-routed destinations.  If this is the first
+    // activation for this address, notify the router module of the added address.
+    //
+    if (lr->addr) {
+        qdr_add_connection_ref(&lr->addr->conns, conn);
+        if (DEQ_SIZE(lr->addr->conns) == 1) {
+            key = (const char*) qd_hash_key_by_handle(lr->addr->hash_handle);
+            if (key)
+                qdr_post_mobile_added_CT(core, key);
         }
     }
 }
 
 
-static void qdr_route_deactivate_CT(qdr_core_t *core, qdr_route_active_t *active, qdr_connection_t *conn)
+static void qdr_link_route_deactivate_CT(qdr_core_t *core, qdr_link_route_t *lr, qdr_connection_t *conn)
 {
-    qdr_route_config_t *route = active->config;
-    const char         *key;
+    const char *key;
 
-    qdr_route_log_CT(core, "Deactivated", route, conn);
+    qdr_route_log_CT(core, "Deactivated Link Route", lr->name, lr->identity, conn);
 
-    if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
-        //
-        // Deactivate the address(es) for link-routed destinations.
-        //
-        if (route->out_addr) {
-            qdr_del_connection_ref(&route->out_addr->conns, conn);
-            if (DEQ_IS_EMPTY(route->out_addr->conns)) {
-                key = (const char*) qd_hash_key_by_handle(route->out_addr->hash_handle);
-                if (key)
-                    qdr_post_mobile_removed_CT(core, key);
-            }
-        }
-
-        if (route->in_addr) {
-            qdr_del_connection_ref(&route->in_addr->conns, conn);
-            if (DEQ_IS_EMPTY(route->in_addr->conns)) {
-                key = (const char*) qd_hash_key_by_handle(route->in_addr->hash_handle);
-                if (key)
-                    qdr_post_mobile_removed_CT(core, key);
-            }
+    //
+    // Deactivate the address(es) for link-routed destinations.
+    //
+    if (lr->addr) {
+        qdr_del_connection_ref(&lr->addr->conns, conn);
+        if (DEQ_IS_EMPTY(lr->addr->conns)) {
+            key = (const char*) qd_hash_key_by_handle(lr->addr->hash_handle);
+            if (key)
+                qdr_post_mobile_removed_CT(core, key);
         }
     }
 }
 
 
-const char *qdr_route_create_CT(qdr_core_t             *core,
-                                qd_field_iterator_t    *name,
-                                qdr_route_path_t        path,
-                                qd_address_treatment_t  treatment,
-                                qd_parsed_field_t      *addr_field,
-                                qd_parsed_field_t      *route_addr_field,
-                                qdr_route_config_t    **_route)
+void qdr_route_add_link_route_CT(qdr_core_t             *core,
+                                 qd_field_iterator_t    *name,
+                                 qd_parsed_field_t      *prefix_field,
+                                 qd_parsed_field_t      *conn_id,
+                                 bool                    is_container,
+                                 qd_address_treatment_t  treatment,
+                                 qd_direction_t          dir)
 {
-    const char *error = 0;
-
-    qdr_route_config_t *route = new_qdr_route_config_t();
-    ZERO(route);
-
-    if (name)
-        route->name = (char*) qd_field_iterator_copy(name);
-    route->identity  = qdr_identifier(core);
-    route->path      = path;
-    route->treatment = treatment;
+    qdr_link_route_t *lr = new_qdr_link_route_t();
 
     //
-    // Direct message routing - Create a address prefix with the provided treatment.
+    // Set up the link_route structure
     //
-    if (path == QDR_ROUTE_PATH_DIRECT)
-        error = qdr_configure_address_prefix_CT(core, addr_field, 'Z', treatment, &route->addr_config);
+    ZERO(lr);
+    lr->identity  = qdr_identifier(core);
+    lr->name      = name ? (char*) qd_field_iterator_copy(name) : 0;
+    lr->dir       = dir;
+    lr->treatment = treatment;
 
     //
-    // Link routing - Create inbound and outbound link-route addresses based on the path.
+    // Find or create an address for link-attach routing
     //
-    else if (treatment == QD_TREATMENT_LINK_BALANCED) {
-        if (path == QDR_ROUTE_PATH_SOURCE || path == QDR_ROUTE_PATH_WAYPOINT)
-            error = qdr_configure_address_CT(core, addr_field, 'D', treatment, &route->out_addr);
-        if (path == QDR_ROUTE_PATH_SINK   || path == QDR_ROUTE_PATH_WAYPOINT)
-            error = qdr_configure_address_CT(core, addr_field, 'C', treatment, &route->in_addr);
+    qd_field_iterator_t *iter = qd_parse_raw(prefix_field);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+    qd_address_iterator_override_prefix(iter, dir == QD_INCOMING ? 'C' : 'D');
+
+    qd_hash_retrieve(core->addr_hash, iter, (void*) &lr->addr);
+    if (!lr->addr) {
+        lr->addr = qdr_address_CT(core, treatment);
+        DEQ_INSERT_TAIL(core->addrs, lr->addr);
+        qd_hash_insert(core->addr_hash, iter, lr->addr, &lr->addr->hash_handle);
     }
 
     //
-    // Indirect message routing cases - Create a normal address with the provided treatment.
+    // Find or create a connection identifier structure for this link route
     //
-    else {
-        error = qdr_configure_address_CT(core, addr_field, '\0', treatment, &route->addr);
-    }
-
-    if (error)
-        qdr_route_free_CT(core, route);
-    else {
-        DEQ_INSERT_TAIL(core->route_config, route);
-        *_route = route;
+    if (conn_id) {
+        lr->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
+        DEQ_INSERT_TAIL_N(REF, lr->conn_id->link_route_refs, lr);
+        if (lr->conn_id->open_connection)
+            qdr_link_route_activate_CT(core, lr, lr->conn_id->open_connection);
     }
-
-    return error;
-}
-
-
-void qdr_route_delete_CT(qdr_core_t *core, qdr_route_config_t *route)
-{
 }
 
 
-void qdr_route_connection_add_CT(qdr_core_t         *core,
-                                 qdr_route_config_t *route,
-                                 qd_parsed_field_t  *conn_id,
-                                 bool                is_container)
+void qdr_route_del_link_route_CT(qdr_core_t *core)
 {
-    //
-    // Create a new active record for this route+connection and get a connection identifier
-    // record (find and existing one or create a new one).
-    //
-    qdr_route_active_t    *active = new_qdr_route_active_t();
-    qdr_conn_identifier_t *cid    = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
-
-    //
-    // Initialize the active record in the DOWN state.
-    //
-    DEQ_ITEM_INIT(active);
-    DEQ_ITEM_INIT_N(REF, active);
-    active->in_state  = QDR_ROUTE_STATE_DOWN;
-    active->out_state = QDR_ROUTE_STATE_DOWN;
-    active->in_link   = 0;
-    active->out_link  = 0;
-
-    //
-    // Create the linkages between the route-config, active, and connection-identifier.
-    //
-    active->config  = route;
-    active->conn_id = cid;
-
-    DEQ_INSERT_TAIL(route->active_list, active);
-    DEQ_INSERT_TAIL_N(REF, cid->active_refs, active);
-
-    //
-    // If the connection identifier represents an already open connection, activate the route.
-    //
-    if (cid->open_connection)
-        qdr_route_activate_CT(core, active, cid->open_connection);
 }
 
 
-void qdr_route_connection_delete_CT(qdr_core_t         *core,
-                                    qdr_route_config_t *route,
-                                    qd_parsed_field_t  *conn_id,
-                                    bool                is_container)
+void qdr_route_add_auto_link_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qd_parsed_field_t      *addr_field,
+                                qd_address_treatment_t  treatment,
+                                qd_direction_t          dir,
+                                qd_parsed_field_t      *phase_field,
+                                qd_parsed_field_t      *container_id_field,
+                                qd_parsed_field_t      *conn_name_field)
 {
 }
 
 
-void qdr_route_connection_kill_CT(qdr_core_t         *core,
-                                  qdr_route_config_t *route,
-                                  qd_parsed_field_t  *conn_id,
-                                  bool                is_container)
+void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *autolink)
 {
 }
 
@@ -339,12 +196,21 @@ void qdr_route_connection_opened_CT(qdr_core_t       *core,
     conn->conn_id        = cid;
 
     //
-    // Activate all routes associated with this remote container.
+    // Activate all link-routes associated with this remote container.
+    //
+    qdr_link_route_t *lr = DEQ_HEAD(cid->link_route_refs);
+    while (lr) {
+        qdr_link_route_activate_CT(core, lr, conn);
+        lr = DEQ_NEXT_N(REF, lr);
+    }
+
+    //
+    // Activate all auto-links associated with this remote container.
     //
-    qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
-    while (active) {
-        qdr_route_activate_CT(core, active, conn);
-        active = DEQ_NEXT_N(REF, active);
+    qdr_auto_link_t *al = DEQ_HEAD(cid->auto_link_refs);
+    while (al) {
+        //qdr_link_route_activate_CT(core, lr, conn);
+        al = DEQ_NEXT_N(REF, al);
     }
 }
 
@@ -357,12 +223,21 @@ void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
     qdr_conn_identifier_t *cid = conn->conn_id;
     if (cid) {
         //
-        // De-activate all routes associated with this remote container.
+        // Deactivate all link-routes associated with this remote container.
+        //
+        qdr_link_route_t *lr = DEQ_HEAD(cid->link_route_refs);
+        while (lr) {
+            qdr_link_route_deactivate_CT(core, lr, conn);
+            lr = DEQ_NEXT_N(REF, lr);
+        }
+
+        //
+        // Deactivate all auto-links associated with this remote container.
         //
-        qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
-        while (active) {
-            qdr_route_deactivate_CT(core, active, conn);
-            active = DEQ_NEXT_N(REF, active);
+        qdr_auto_link_t *al = DEQ_HEAD(cid->auto_link_refs);
+        while (al) {
+            //qdr_link_route_deactivate_CT(core, lr, conn);
+            al = DEQ_NEXT_N(REF, al);
         }
 
         cid->open_connection = 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index 53e1758..5fe8202 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -21,30 +21,26 @@
 
 #include "router_core_private.h"
 
-const char *qdr_route_create_CT(qdr_core_t             *core,
-                                qd_field_iterator_t    *name,
-                                qdr_route_path_t        path,
-                                qd_address_treatment_t  treatment,
-                                qd_parsed_field_t      *addr_field,
-                                qd_parsed_field_t      *route_addr_field,
-                                qdr_route_config_t    **route);
-
-void qdr_route_delete_CT(qdr_core_t *core, qdr_route_config_t *route);
+void qdr_route_add_link_route_CT(qdr_core_t             *core,
+                                 qd_field_iterator_t    *name,
+                                 qd_parsed_field_t      *prefix_field,
+                                 qd_parsed_field_t      *conn_id,
+                                 bool                    is_container,
+                                 qd_address_treatment_t  treatment,
+                                 qd_direction_t          dir);
 
-void qdr_route_connection_add_CT(qdr_core_t         *core,
-                                 qdr_route_config_t *route,
-                                 qd_parsed_field_t  *conn_id,
-                                 bool                is_container);
+void qdr_route_del_link_route_CT(qdr_core_t *core);
 
-void qdr_route_connection_delete_CT(qdr_core_t         *core,
-                                    qdr_route_config_t *route,
-                                    qd_parsed_field_t  *conn_id,
-                                    bool                is_container);
+void qdr_route_add_auto_link_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qd_parsed_field_t      *addr_field,
+                                qd_address_treatment_t  treatment,
+                                qd_direction_t          dir,
+                                qd_parsed_field_t      *phase_field,
+                                qd_parsed_field_t      *container_id_field,
+                                qd_parsed_field_t      *conn_name_field);
 
-void qdr_route_connection_kill_CT(qdr_core_t         *core,
-                                  qdr_route_config_t *route,
-                                  qd_parsed_field_t  *conn_id,
-                                  bool                is_container);
+void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *autolink);
 
 void qdr_route_connection_opened_CT(qdr_core_t       *core,
                                     qdr_connection_t *conn,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/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 f44b1c5..c252063 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -31,8 +31,8 @@ typedef struct qdr_node_t            qdr_node_t;
 typedef struct qdr_router_ref_t      qdr_router_ref_t;
 typedef struct qdr_link_ref_t        qdr_link_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
-typedef struct qdr_route_config_t    qdr_route_config_t;
-typedef struct qdr_route_active_t    qdr_route_active_t;
+typedef struct qdr_link_route_t      qdr_link_route_t;
+typedef struct qdr_auto_link_t       qdr_auto_link_t;
 typedef struct qdr_conn_identifier_t qdr_conn_identifier_t;
 typedef struct qdr_connection_ref_t  qdr_connection_ref_t;
 
@@ -316,7 +316,11 @@ void qdr_del_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
 struct qdr_address_config_t {
     DEQ_LINKS(qdr_address_config_t);
     qd_hash_handle_t       *hash_handle;
+    char                   *name;
+    uint64_t                identity;
     qd_address_treatment_t  treatment;
+    int                     in_phase;
+    int                     out_phase;
 };
 
 ALLOC_DECLARE(qdr_address_config_t);
@@ -397,54 +401,43 @@ struct qdr_connection_t {
 ALLOC_DECLARE(qdr_connection_t);
 DEQ_DECLARE(qdr_connection_t, qdr_connection_list_t);
 
-typedef enum {
-    QDR_ROUTE_PATH_DIRECT,
-    QDR_ROUTE_PATH_SOURCE,
-    QDR_ROUTE_PATH_SINK,
-    QDR_ROUTE_PATH_WAYPOINT
-} qdr_route_path_t;
 
-typedef enum {
-    QDR_ROUTE_STATE_DOWN,
-    QDR_ROUTE_STATE_UP,
-    QDR_ROUTE_STATE_QUIESCING
-} qdr_route_state_t;
-
-struct qdr_route_active_t {
-    DEQ_LINKS(qdr_route_active_t);
-    DEQ_LINKS_N(REF, qdr_route_active_t);
-    qdr_route_config_t    *config;
-    qdr_conn_identifier_t *conn_id;
-    qdr_route_state_t      in_state;
-    qdr_route_state_t      out_state;
-    qdr_link_t            *in_link;
-    qdr_link_t            *out_link;
+struct qdr_link_route_t {
+    DEQ_LINKS(qdr_link_route_t);
+    DEQ_LINKS_N(REF, qdr_link_route_t);
+    uint64_t                identity;
+    char                   *name;
+    qdr_address_t          *addr;
+    qd_direction_t          dir;
+    qdr_conn_identifier_t  *conn_id;
+    qd_address_treatment_t  treatment;
 };
 
-ALLOC_DECLARE(qdr_route_active_t);
-DEQ_DECLARE(qdr_route_active_t, qdr_route_active_list_t);
+ALLOC_DECLARE(qdr_link_route_t);
+DEQ_DECLARE(qdr_link_route_t, qdr_link_route_list_t);
 
-struct qdr_route_config_t {
-    DEQ_LINKS(qdr_route_config_t);
-    char                    *name;
-    uint64_t                 identity;
-    qdr_route_path_t         path;
-    qdr_address_config_t    *addr_config;
-    qdr_address_t           *addr;
-    qdr_address_t           *in_addr;
-    qdr_address_t           *out_addr;
-    qd_address_treatment_t   treatment;
-
-    qdr_route_active_list_t  active_list;
+
+struct qdr_auto_link_t {
+    DEQ_LINKS(qdr_auto_link_t);
+    DEQ_LINKS_N(REF, qdr_auto_link_t);
+    uint64_t               identity;
+    char                  *name;
+    qdr_address_t         *addr;
+    int                    phase;
+    qd_direction_t         dir;
+    qdr_conn_identifier_t *conn_id;
+    qdr_link_t            *link;
 };
 
-ALLOC_DECLARE(qdr_route_config_t);
-DEQ_DECLARE(qdr_route_config_t, qdr_route_config_list_t);
+ALLOC_DECLARE(qdr_auto_link_t);
+DEQ_DECLARE(qdr_auto_link_t, qdr_auto_link_list_t);
+
 
 struct qdr_conn_identifier_t {
-    qd_hash_handle_t        *hash_handle;
-    qdr_connection_t        *open_connection;
-    qdr_route_active_list_t  active_refs;
+    qd_hash_handle_t      *hash_handle;
+    qdr_connection_t      *open_connection;
+    qdr_link_route_list_t  link_route_refs;
+    qdr_auto_link_list_t   auto_link_refs;
 };
 
 ALLOC_DECLARE(qdr_conn_identifier_t);
@@ -463,8 +456,6 @@ struct qdr_core_t {
     qdr_general_work_list_t  work_list;
     qd_timer_t              *work_timer;
 
-    qdr_route_config_list_t  route_config;
-
     qdr_connection_list_t open_connections;
     qdr_link_list_t       open_links;
     //
@@ -505,6 +496,9 @@ struct qdr_core_t {
     const char       *router_id;
 
     qdr_address_config_list_t  addr_config;
+    qdr_auto_link_list_t       auto_links;
+    qdr_link_route_list_t      link_routes;
+    qd_hash_t                 *conn_id_hash;
     qdr_address_list_t         addrs;
     qd_hash_t                 *addr_hash;
     qdr_address_t             *hello_addr;
@@ -524,7 +518,6 @@ struct qdr_core_t {
     uint64_t              next_identifier;
     sys_mutex_t          *id_lock;
 
-    qd_hash_t            *conn_id_hash;
 
     qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
 };

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ab2734f9/src/router_private.h
----------------------------------------------------------------------
diff --git a/src/router_private.h b/src/router_private.h
index 21497b4..533955a 100644
--- a/src/router_private.h
+++ b/src/router_private.h
@@ -38,10 +38,12 @@
 qd_error_t qd_router_python_setup(qd_router_t *router);
 void qd_router_python_free(qd_router_t *router);
 qd_error_t qd_pyrouter_tick(qd_router_t *router);
-qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity);
+qd_error_t qd_router_configure_fixed_address(qd_router_t *router, qd_entity_t *entity);
 qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity);
 qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity);
-qd_error_t qd_router_configure_route(qd_router_t *router, qd_entity_t *entity);
+qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity);
+qd_error_t qd_router_configure_link_route(qd_router_t *router, qd_entity_t *entity);
+qd_error_t qd_router_configure_auto_link(qd_router_t *router, qd_entity_t *entity);
 
 void qd_router_configure_free(qd_router_t *router);
 


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


[07/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Test cleanup

Posted by tr...@apache.org.
DISPATCH-179 - Test cleanup


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

Branch: refs/heads/master
Commit: ba7ad5889c1054b2ac562b4da739339bb8d910e6
Parents: e51dd8c
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 16:09:59 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 16:09:59 2016 -0500

----------------------------------------------------------------------
 tests/mock/dispatch.py           | 10 +++++-----
 tests/system_tests_management.py |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ba7ad588/tests/mock/dispatch.py
----------------------------------------------------------------------
diff --git a/tests/mock/dispatch.py b/tests/mock/dispatch.py
index df15297..dd08f7d 100644
--- a/tests/mock/dispatch.py
+++ b/tests/mock/dispatch.py
@@ -29,11 +29,11 @@ LOG_ERROR    = 32
 LOG_CRITICAL = 64
 LOG_STACK_LIMIT = 8
 
-SEMANTICS_MULTICAST_FLOOD  = 0
-SEMANTICS_MULTICAST_ONCE   = 1
-SEMANTICS_ANYCAST_CLOSEST  = 2
-SEMANTICS_ANYCAST_BALANCED = 3
-SEMANTICS_LINK_BALANCED    = 4
+TREATMENT_MULTICAST_FLOOD  = 0
+TREATMENT_MULTICAST_ONCE   = 1
+TREATMENT_ANYCAST_CLOSEST  = 2
+TREATMENT_ANYCAST_BALANCED = 3
+TREATMENT_LINK_BALANCED    = 4
 
 
 class LogAdapter:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ba7ad588/tests/system_tests_management.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_management.py b/tests/system_tests_management.py
index 1fb512f..b2c529e 100644
--- a/tests/system_tests_management.py
+++ b/tests/system_tests_management.py
@@ -459,7 +459,7 @@ class ManagementTest(system_test.TestCase):
         result = self.node.get_operations()
         for type in LISTENER, WAYPOINT, LINK: self.assertIn(type, result)
         self.assertEqual(["READ"], result[LINK])
-        self.assertEqual(["CREATE", "READ"], result[WAYPOINT])
+        self.assertEqual(["CREATE", "DELETE", "READ"], result[WAYPOINT])
 
     def test_get_attributes(self):
         result = self.node.get_attributes(type=DUMMY)


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


[14/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - WIP for routed attaches.

Posted by tr...@apache.org.
DISPATCH-179 - WIP for routed attaches.


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

Branch: refs/heads/master
Commit: 3c84c0be46cd3dda34b1aa904c4149afdcd06ca9
Parents: f970827
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 4 17:19:19 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 4 17:19:19 2016 -0500

----------------------------------------------------------------------
 src/router_core/connections.c         | 16 ++-----
 src/router_core/forwarder.c           | 74 +++++++++++++++++++++++++++---
 src/router_core/router_core_private.h |  7 ++-
 3 files changed, 78 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3c84c0be/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 923114f..1aca79f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -352,9 +352,9 @@ void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn)
 }
 
 
-static void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
-                                           qdr_connection_t      *conn,
-                                           qdr_connection_work_t *work)
+void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
+                                    qdr_connection_t      *conn,
+                                    qdr_connection_work_t *work)
 {
     sys_mutex_lock(conn->work_lock);
     DEQ_INSERT_TAIL(conn->work_list, work);
@@ -516,12 +516,6 @@ static void qdr_link_outbound_second_attach_CT(qdr_core_t *core, qdr_link_t *lin
 }
 
 
-static void qdr_forward_first_attach_CT(qdr_core_t *core, qdr_link_t *link, qdr_address_t *addr,
-                                        qdr_terminus_t *source, qdr_terminus_t *target)
-{
-}
-
-
 static char qdr_prefix_for_dir(qd_direction_t dir)
 {
     return (dir == QD_INCOMING) ? 'C' : 'D';
@@ -847,7 +841,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                     //
                     // This is a link-routed destination, forward the attach to the next hop
                     //
-                    qdr_forward_first_attach_CT(core, link, addr, source, target);
+                    qdr_forward_attach_CT(core, addr, link, source, target);
 
                 else {
                     //
@@ -898,7 +892,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                 //
                 // This is a link-routed destination, forward the attach to the next hop
                 //
-                qdr_forward_first_attach_CT(core, link, addr, source, target);
+                qdr_forward_attach_CT(core, addr, link, source, target);
 
             else {
                 //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3c84c0be/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 4628e02..1c0f7ec 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -33,9 +33,11 @@ typedef int (*qdr_forward_message_t) (qdr_core_t      *core,
                                       bool             control,
                                       qd_bitmask_t    *link_exclusion);
 
-typedef void (*qdr_forward_attach_t) (qdr_core_t      *core,
-                                      qdr_forwarder_t *forw,
-                                      qdr_link_t      *link);
+typedef bool (*qdr_forward_attach_t) (qdr_core_t     *core,
+                                      qdr_address_t  *addr,
+                                      qdr_link_t     *link,
+                                      qdr_terminus_t *source,
+                                      qdr_terminus_t *target);
 
 struct qdr_forwarder_t {
     qdr_forward_message_t forward_message;
@@ -342,10 +344,64 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
 }
 
 
-void qdr_forward_link_balanced_CT(qdr_core_t      *core,
-                                  qdr_forwarder_t *forw,
-                                  qdr_link_t      *link)
+bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
+                                  qdr_address_t  *addr,
+                                  qdr_link_t     *in_link,
+                                  qdr_terminus_t *source,
+                                  qdr_terminus_t *target)
 {
+    qdr_connection_ref_t *conn_ref = DEQ_HEAD(addr->conns);
+    qdr_connection_t     *conn;
+
+    //
+    // Check for locally connected containers that can handle this link attach.
+    //
+    if (conn_ref) {
+        conn = conn_ref->conn;
+
+        //
+        // If there are more than one local connections available for handling this link,
+        // rotate the list so the attaches are balanced across the containers.
+        //
+        if (DEQ_SIZE(addr->conns) > 1) {
+            DEQ_REMOVE_HEAD(addr->conns);
+            DEQ_INSERT_TAIL(addr->conns, conn_ref);
+        }
+    }
+
+    //
+    // TODO - Use the next-hop connection if there are no local containers.
+    //
+
+    if (conn) {
+        qdr_link_t *out_link = new_qdr_link_t();
+        ZERO(out_link);
+        out_link->core           = core;
+        out_link->identifier     = qdr_identifier(core);
+        out_link->conn           = conn;
+        out_link->link_type      = QD_LINK_ENDPOINT;
+        out_link->link_direction = qdr_link_direction(in_link) == QD_OUTGOING ? QD_INCOMING : QD_OUTGOING;
+        out_link->name           = in_link->name;
+
+        out_link->connected_link = in_link;
+        in_link->connected_link  = out_link;
+
+        DEQ_INSERT_TAIL(core->open_links, out_link);
+        qdr_add_link_ref(&conn->links, out_link, QDR_LINK_LIST_CLASS_CONNECTION);
+
+        qdr_connection_work_t *work = new_qdr_connection_work_t();
+        ZERO(work);
+        work->work_type = QDR_CONNECTION_WORK_FIRST_ATTACH;
+        work->link      = out_link;
+        work->source    = source;
+        work->target    = target;
+
+        qdr_connection_enqueue_work_CT(core, conn, work);
+
+        return true;
+    }
+
+    return false;
 }
 
 
@@ -401,7 +457,11 @@ int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *
 }
 
 
-void qdr_forward_attach_CT(qdr_core_t *core, qdr_forwarder_t *forwarder, qdr_link_t *in_link)
+bool qdr_forward_attach_CT(qdr_core_t *core, qdr_address_t *addr, qdr_link_t *in_link,
+                           qdr_terminus_t *source, qdr_terminus_t *target)
 {
+    if (addr->forwarder)
+        return addr->forwarder->forward_attach(core, addr, in_link, source, target);
+    return false;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3c84c0be/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 0988ffa..2877677 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -39,7 +39,8 @@ typedef struct qdr_connection_ref_t  qdr_connection_ref_t;
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
                            bool exclude_inprocess, bool control, qd_bitmask_t *link_exclusion);
-void qdr_forward_attach_CT(qdr_core_t *core, qdr_forwarder_t *forwarder, qdr_link_t *in_link);
+bool qdr_forward_attach_CT(qdr_core_t *core, qdr_address_t *addr, qdr_link_t *in_link, qdr_terminus_t *source,
+                           qdr_terminus_t *target);
 
 /**
  * qdr_field_t - This type is used to pass variable-length fields (strings, etc.) into
@@ -553,6 +554,10 @@ void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local);
 
 void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
 
+void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
+                                    qdr_connection_t      *conn,
+                                    qdr_connection_work_t *work);
+
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,


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


[44/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added configuration-file capability for address, linkRoute, and autoLink

Posted by tr...@apache.org.
DISPATCH-179 - Added configuration-file capability for address, linkRoute, and autoLink


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

Branch: refs/heads/master
Commit: f0cb3ea4a06500610a9cf268b1e9199315767403
Parents: ce66606
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 15:23:18 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 15:23:18 2016 -0400

----------------------------------------------------------------------
 .../qpid_dispatch_internal/management/agent.py  | 54 +++-----------------
 .../qpid_dispatch_internal/management/config.py |  9 +++-
 2 files changed, 13 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f0cb3ea4/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 1a77129..5b9a7f5 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -254,48 +254,6 @@ class RouterEntity(EntityAdapter):
         return super(RouterEntity, self).__str__().replace("Entity(", "RouterEntity(")
 
 
-class AddressEntity(EntityAdapter):
-    def __init__(self, agent, entity_type, attributes=None):
-        super(AddressEntity, self).__init__(agent, entity_type, attributes, validate=False)
-        # Router 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 _identifier(self): return self.attributes.get('identity')
-
-    def create(self):
-        self._qd.qd_dispatch_configure_address(self._dispatch, self)
-
-
-class LinkRouteEntity(EntityAdapter):
-    def __init__(self, agent, entity_type, attributes=None):
-        super(LinkRouteEntity, self).__init__(agent, entity_type, attributes, validate=False)
-        # Router 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 _identifier(self): return self.attributes.get('identity')
-
-    def create(self):
-        self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
-
-
-class AutoLinkEntity(EntityAdapter):
-    def __init__(self, agent, entity_type, attributes=None):
-        super(AutoLinkEntity, self).__init__(agent, entity_type, attributes, validate=False)
-        # Router 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 _identifier(self): return self.attributes.get('identity')
-
-    def create(self):
-        self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
-
-
 class LogEntity(EntityAdapter):
 
     def __init__(self, agent, entity_type, attributes=None, validate=True):
@@ -382,26 +340,26 @@ class LinkRoutePatternEntity(EntityAdapter):
     def __str__(self):
         return super(LinkRoutePatternEntity, self).__str__().replace("Entity(", "LinkRoutePatternEntity(")
 
-class AddressEntity(EntityAdapter):
+class RouterConfigAddressEntity(EntityAdapter):
     def create(self):
         self._qd.qd_dispatch_configure_address(self._dispatch, self)
 
     def __str__(self):
-        return super(AddressEntity, self).__str__().replace("Entity(", "AddressEntity(")
+        return super(RouterConfigAddressEntity, self).__str__().replace("Entity(", "RouterConfigAddressEntity(")
 
-class LinkRouteEntity(EntityAdapter):
+class RouterConfigLinkrouteEntity(EntityAdapter):
     def create(self):
         self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
 
     def __str__(self):
-        return super(LinkRouteEntity, self).__str__().replace("Entity(", "LinkRouteEntity(")
+        return super(RouterConfigLinkrouteEntity, self).__str__().replace("Entity(", "RouterConfigLinkrouteEntity(")
 
-class AutoLinkEntity(EntityAdapter):
+class RouterConfigAutolinkEntity(EntityAdapter):
     def create(self):
         self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
 
     def __str__(self):
-        return super(AutoLinkEntity, self).__str__().replace("Entity(", "AutoLinkEntity(")
+        return super(RouterConfigAutolinkEntity, self).__str__().replace("Entity(", "RouterConfigAutolinkEntity(")
 
 class ConsoleEntity(EntityAdapter):
     def __str__(self):

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f0cb3ea4/python/qpid_dispatch_internal/management/config.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/management/config.py b/python/qpid_dispatch_internal/management/config.py
index c5818b4..aedd8d5 100644
--- a/python/qpid_dispatch_internal/management/config.py
+++ b/python/qpid_dispatch_internal/management/config.py
@@ -65,6 +65,9 @@ class Config(object):
         for s in sections:
             s[0] = camelcase(s[0])
             s[1] = dict((camelcase(k), v) for k, v in s[1].iteritems())
+            if s[0] == "address":   s[0] = "router.config.address"
+            if s[0] == "linkRoute": s[0] = "router.config.linkRoute"
+            if s[0] == "autoLink":  s[0] = "router.config.autoLink"
         return sections
 
 
@@ -150,8 +153,10 @@ def configure_dispatch(dispatch, lib_handle, filename):
     agent.activate("$_management_internal")
 
     # Remaining configuration
-    for t in "fixedAddress", "listener", "connector", "waypoint", "linkRoutePattern", "route":
-        for a in config.by_type(t): configure(a)
+    for t in "fixedAddress", "listener", "connector", "waypoint", "linkRoutePattern", \
+        "router.config.address", "router.config.linkRoute", "router.config.autoLink":
+        for a in config.by_type(t):
+            configure(a)
     for e in config.entities:
         configure(e)
 


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


[17/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Handle next-hop for link-routes. Complete backward-compat linkRoutePattern.

Posted by tr...@apache.org.
DISPATCH-179 - Handle next-hop for link-routes.  Complete backward-compat linkRoutePattern.


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

Branch: refs/heads/master
Commit: a12a08523f136b3592252778508c8a6ec2d115a7
Parents: 9d0a8e6
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 8 14:22:13 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 8 14:22:13 2016 -0500

----------------------------------------------------------------------
 src/router_config.c         |  8 ++++++++
 src/router_core/forwarder.c | 19 +++++++++++++++++++
 2 files changed, 27 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a12a0852/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 30ff89b..c08307e 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -152,6 +152,14 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 
     qd_compose_insert_string(body, "treatment");
     qd_compose_insert_string(body, "linkBalanced");
+
+    if (connector) {
+        qd_compose_insert_string(body, "connectors");
+        qd_compose_start_list(body);
+        qd_compose_insert_string(body, connector);
+        qd_compose_end_list(body);
+    }
+
     qd_compose_end_map(body);
 
     int              length = 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a12a0852/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 0b4562b..862c498 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -367,6 +367,25 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
             DEQ_REMOVE_HEAD(addr->conns);
             DEQ_INSERT_TAIL(addr->conns, conn_ref);
         }
+    } else {
+        //
+        // Look for a next-hop we can use to forward the link-attach.
+        //
+        int         router_bit;
+        qdr_node_t *next_node;
+
+        if (qd_bitmask_first_set(addr->rnodes, &router_bit)) {
+            qdr_node_t *rnode = core->routers_by_mask_bit[router_bit];
+            if (rnode) {
+                if (rnode->next_hop)
+                    next_node = rnode->next_hop;
+                else
+                    next_node = rnode;
+
+                if (next_node && next_node->peer_data_link)
+                    conn = next_node->peer_data_link->conn;
+            }
+        }
     }
 
     //


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


[49/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Removed dead files

Posted by tr...@apache.org.
DISPATCH-179 - Removed dead files


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

Branch: refs/heads/master
Commit: 2291e5cd4ce7128a6e9fcabae80958042fa009a2
Parents: 51d0793
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 16:43:53 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 16:43:53 2016 -0400

----------------------------------------------------------------------
 src/dispatch.c          |   1 -
 src/lrp.c               | 248 ----------------------------------
 src/lrp_private.h       |  40 ------
 src/router_config.c     |   1 -
 src/router_delivery.c   | 210 -----------------------------
 src/router_forwarders.c | 286 ---------------------------------------
 src/router_node.c       |   1 -
 src/router_pynode.c     |   1 -
 src/waypoint.c          | 309 -------------------------------------------
 src/waypoint_private.h  |  61 ---------
 10 files changed, 1158 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/dispatch.c
----------------------------------------------------------------------
diff --git a/src/dispatch.c b/src/dispatch.c
index d4cdafe..c05d24c 100644
--- a/src/dispatch.c
+++ b/src/dispatch.c
@@ -29,7 +29,6 @@
 #include "alloc.h"
 #include "log_private.h"
 #include "router_private.h"
-#include "waypoint_private.h"
 #include "message_private.h"
 #include "entity.h"
 #include "entity_cache.h"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/lrp.c
----------------------------------------------------------------------
diff --git a/src/lrp.c b/src/lrp.c
deleted file mode 100644
index d3d0b47..0000000
--- a/src/lrp.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "dispatch_private.h"
-#include "entity_cache.h"
-#include <qpid/dispatch/ctools.h>
-#include <qpid/dispatch/connection_manager.h>
-#include <qpid/dispatch/timer.h>
-#include <memory.h>
-#include <stdio.h>
-
-static const char qd_link_route_addr_prefix_inbound  = 'C';
-static const char qd_link_route_addr_prefix_outbound = 'D';
-
-
-//
-// DEPRECATE
-//
-static void qd_lrpc_open_handler(void *context, qd_connection_t *conn)
-{
-    qd_lrp_container_t *lrpc   = (qd_lrp_container_t*) context;
-    qd_lrp_t           *lrp    = DEQ_HEAD(lrpc->lrps);
-    qd_router_t        *router = lrpc->qd->router;
-
-    lrpc->conn = conn;
-
-    while (lrp) {
-        qd_address_t        *addr;
-        qd_field_iterator_t *iter;
-        //bool                 propagate;
-        char                 unused;
-
-        qd_log(router->log_source, QD_LOG_INFO, "Activating Prefix '%s' for routed links to '%s'",
-               lrp->prefix, qd_config_connector_name(lrpc->cc));
-
-        //
-        // Create an address iterator for the prefix address with the namespace
-        // prefix for link-attach routed addresses.
-        //
-        iter = qd_address_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
-
-        if (lrp->inbound) {
-            qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix_inbound);
-
-            //
-            // Find the address in the router's hash table.  If not found, create one
-            // and hash it into the table.
-            //
-            sys_mutex_lock(router->lock);
-            qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
-            if (!addr) {
-                addr = qd_address(router_semantics_for_addr(router, iter, '\0', &unused));
-                qd_hash_insert(router->addr_hash, iter, addr, &addr->hash_handle);
-                DEQ_INSERT_TAIL(router->addrs, addr);
-                qd_entity_cache_add(QD_ROUTER_ADDRESS_TYPE, addr);
-            }
-
-            //
-            // Link the LRP record into the address as a local endpoint for routed link-attaches.
-            // If this is the first instance for this address, flag the address for propagation
-            // across the network.
-            //
-            qd_router_add_lrp_ref_LH(&addr->lrps, lrp);
-            //propagate = DEQ_SIZE(addr->lrps) == 1;
-            sys_mutex_unlock(router->lock);
-
-            //
-            // Propagate the address if appropriate
-            //
-            //if (propagate)
-            //    qd_router_mobile_added(router, iter);
-        }
-
-        if (lrp->outbound) {
-            qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-            qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix_outbound);
-
-            //
-            // Find the address in the router's hash table.  If not found, create one
-            // and hash it into the table.
-            //
-            sys_mutex_lock(router->lock);
-            qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
-            if (!addr) {
-                addr = qd_address(router_semantics_for_addr(router, iter, '\0', &unused));
-                qd_hash_insert(router->addr_hash, iter, addr, &addr->hash_handle);
-                DEQ_INSERT_TAIL(router->addrs, addr);
-                qd_entity_cache_add(QD_ROUTER_ADDRESS_TYPE, addr);
-            }
-
-            //
-            // Link the LRP record into the address as a local endpoint for routed link-attaches.
-            // If this is the first instance for this address, flag the address for propagation
-            // across the network.
-            //
-            qd_router_add_lrp_ref_LH(&addr->lrps, lrp);
-            //propagate = DEQ_SIZE(addr->lrps) == 1;
-            sys_mutex_unlock(router->lock);
-
-            //
-            // Propagate the address if appropriate
-            //
-            //if (propagate)
-            //    qd_router_mobile_added(router, iter);
-        }
-
-        qd_field_iterator_free(iter);
-        lrp = DEQ_NEXT(lrp);
-    }
-}
-
-
-static void qd_lrpc_close_handler(void *context, qd_connection_t *conn)
-{
-    qd_lrp_container_t *lrpc   = (qd_lrp_container_t*) context;
-    qd_lrp_t           *lrp    = DEQ_HEAD(lrpc->lrps);
-    qd_router_t        *router = lrpc->qd->router;
-
-    lrpc->conn = 0;
-
-    while (lrp) {
-        qd_address_t        *addr;
-        qd_field_iterator_t *iter;
-        bool                 propagate = false;
-
-        qd_log(router->log_source, QD_LOG_INFO, "Removing Prefix '%s' for routed links to '%s'",
-               lrp->prefix, qd_config_connector_name(lrpc->cc));
-
-        //
-        // Create an address iterator for the prefix address with the namespace
-        // prefix for link-attach routed addresses.
-        //
-        iter = qd_address_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
-
-        if (lrp->inbound) {
-            //
-            // Find the address in the router's hash table.
-            //
-            qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix_inbound);
-            sys_mutex_lock(router->lock);
-            qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
-            if (addr) {
-                //
-                // Unlink the lrp from the address.  If this is the last lrp in the address, we need
-                // to tell the other routers.
-                //
-                qd_router_del_lrp_ref_LH(&addr->lrps, lrp);
-                propagate = DEQ_SIZE(addr->lrps) == 0;
-            }
-            sys_mutex_unlock(router->lock);
-
-            //
-            // Propagate the address if appropriate
-            //
-            if (propagate) {
-                char *text = (char*) qd_field_iterator_copy(iter);
-                //qd_router_mobile_removed(router, text);
-                free(text);
-            }
-        }
-
-        if (lrp->outbound) {
-            //
-            // Find the address in the router's hash table.
-            //
-            qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-            qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix_outbound);
-            sys_mutex_lock(router->lock);
-            qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
-            if (addr) {
-                //
-                // Unlink the lrp from the address.  If this is the last lrp in the address, we need
-                // to tell the other routers.
-                //
-                qd_router_del_lrp_ref_LH(&addr->lrps, lrp);
-                propagate = DEQ_SIZE(addr->lrps) == 0;
-            }
-            sys_mutex_unlock(router->lock);
-
-            //
-            // Propagate the address if appropriate
-            //
-            if (propagate) {
-                char *text = (char*) qd_field_iterator_copy(iter);
-                //qd_router_mobile_removed(router, text);
-                free(text);
-            }
-        }
-
-        qd_field_iterator_free(iter);
-        lrp = DEQ_NEXT(lrp);
-    }
-}
-
-
-void qd_lrpc_timer_handler(void *context)
-{
-    qd_lrp_container_t *lrpc = (qd_lrp_container_t*) context;
-    qd_connection_manager_set_handlers(lrpc->cc,
-                                       qd_lrpc_open_handler,
-                                       qd_lrpc_close_handler,
-                                       (void*) lrpc);
-    qd_connection_manager_start_on_demand(lrpc->qd, lrpc->cc);
-}
-
-
-qd_lrp_t *qd_lrp_LH(const char *prefix, bool inbound, bool outbound, qd_lrp_container_t *lrpc)
-{
-    qd_lrp_t *lrp = NEW(qd_lrp_t);
-
-    if (lrp) {
-        DEQ_ITEM_INIT(lrp);
-        lrp->prefix    = strdup(prefix);
-        lrp->inbound   = inbound;
-        lrp->outbound  = outbound;
-        lrp->container = lrpc;
-        DEQ_INSERT_TAIL(lrpc->lrps, lrp);
-    }
-
-    return lrp;
-}
-
-
-void qd_lrp_free(qd_lrp_t *lrp)
-{
-    if (lrp) {
-        free(lrp->prefix);
-        DEQ_REMOVE(lrp->container->lrps, lrp);
-        free(lrp);
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/lrp_private.h
----------------------------------------------------------------------
diff --git a/src/lrp_private.h b/src/lrp_private.h
deleted file mode 100644
index 6dda219..0000000
--- a/src/lrp_private.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __lrp_private_h__
-#define __lrp_private_h__ 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "dispatch_private.h"
-
-/**
- * @file
- *
- * An link-route-pattern is an object that defines an address prefix for link-routing
- * and associates that prefix with an on-demand connector.
- *
- * The address prefix is propagated across the network and can be used as a target for
- * routed links destined for this LRP.
- */
-
-qd_lrp_t *qd_lrp_LH(const char *prefix, bool inbound, bool outbound, qd_lrp_container_t *lrpc);
-
-void qd_lrp_free(qd_lrp_t *lrp);
-
-void qd_lrpc_timer_handler(void *context);
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index c6963e8..962b5b4 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -22,7 +22,6 @@
 #include <qpid/dispatch/log.h>
 #include "dispatch_private.h"
 #include "router_private.h"
-#include "lrp_private.h"
 #include "entity.h"
 #include "entity_cache.h"
 #include "schema_enum.h"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/router_delivery.c
----------------------------------------------------------------------
diff --git a/src/router_delivery.c b/src/router_delivery.c
deleted file mode 100644
index 44f9581..0000000
--- a/src/router_delivery.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/** Encapsulates a proton message delivery */
-
-#include <qpid/dispatch.h>
-#include "dispatch_private.h"
-#include "router_private.h"
-
-struct qd_router_delivery_t {
-    DEQ_LINKS(qd_router_delivery_t);
-    pn_delivery_t        *pn_delivery;
-    qd_router_delivery_t *peer;
-    void                 *context;
-    uint64_t              disposition;
-    qd_router_link_t     *link;
-    int                   in_fifo;
-    bool                  pending_delete;
-};
-ALLOC_DECLARE(qd_router_delivery_t);
-ALLOC_DEFINE(qd_router_delivery_t);
-
-// create a router delivery from a proton delivery received on rlink
-qd_router_delivery_t *qd_router_delivery(qd_router_link_t *rlink, pn_delivery_t *pnd)
-{
-    assert(pn_delivery_get_context(pnd) == 0);
-    qd_router_delivery_t *delivery = new_qd_router_delivery_t();
-    if (delivery) {
-        DEQ_ITEM_INIT(delivery);
-        delivery->pn_delivery    = pnd;
-        delivery->peer           = 0;
-        delivery->context        = 0;
-        delivery->disposition    = 0;
-        delivery->link           = rlink;
-        delivery->in_fifo        = 0;
-        delivery->pending_delete = false;
-        DEQ_INSERT_TAIL(rlink->deliveries, delivery);
-        pn_delivery_set_context(pnd, delivery);
-    }
-
-    return delivery;
-}
-
-
-// generate a new router delivery for rlink
-qd_router_delivery_t *qd_router_link_new_delivery(qd_router_link_t *rlink, pn_delivery_tag_t tag)
-{
-    qd_link_t *link = rlink->link;
-    pn_link_t *pnl = qd_link_pn(link);
-
-    //
-    // If there is a current delivery on this outgoing link, something
-    // is wrong with the delivey algorithm.  We assume that the current
-    // delivery ('pnd' below) is the one created by pn_delivery.  If it is
-    // not, then my understanding of how proton works is incorrect.
-    //
-    assert(!pn_link_current(pnl));
-
-    pn_delivery(pnl, tag);
-    pn_delivery_t *pnd = pn_link_current(pnl);
-
-    if (!pnd)
-        return 0;
-
-    return qd_router_delivery(rlink, pnd);
-}
-
-// mark the delivery as 'undeliverable-here' so peers won't re-forward it to
-// us.
-void qd_router_delivery_set_undeliverable_LH(qd_router_delivery_t *delivery)
-{
-    if (delivery->pn_delivery) {
-        pn_disposition_t *dp = pn_delivery_local(delivery->pn_delivery);
-        if (dp) {
-            pn_disposition_set_undeliverable(dp, true);
-        }
-    }
-}
-
-void qd_router_delivery_free_LH(qd_router_delivery_t *delivery, uint64_t final_disposition)
-{
-    if (delivery->pn_delivery) {
-        if (final_disposition > 0)
-            pn_delivery_update(delivery->pn_delivery, final_disposition);
-        pn_delivery_set_context(delivery->pn_delivery, 0);
-        pn_delivery_settle(delivery->pn_delivery);
-        delivery->pn_delivery = 0;
-    }
-
-    if (delivery->peer)
-        qd_router_delivery_unlink_LH(delivery);
-
-    if (delivery->link) {
-        DEQ_REMOVE(delivery->link->deliveries, delivery);
-        delivery->link = 0;
-    }
-    if (delivery->in_fifo)
-        delivery->pending_delete = true;
-    else {
-        free_qd_router_delivery_t(delivery);
-    }
-}
-
-
-void qd_router_delivery_link_peers_LH(qd_router_delivery_t *right, qd_router_delivery_t *left)
-{
-    right->peer = left;
-    left->peer  = right;
-}
-
-
-void qd_router_delivery_unlink_LH(qd_router_delivery_t *delivery)
-{
-    if (delivery->peer) {
-        delivery->peer->peer = 0;
-        delivery->peer       = 0;
-    }
-}
-
-
-void qd_router_delivery_fifo_enter_LH(qd_router_delivery_t *delivery)
-{
-    delivery->in_fifo++;
-}
-
-
-bool qd_router_delivery_fifo_exit_LH(qd_router_delivery_t *delivery)
-{
-    delivery->in_fifo--;
-    if (delivery->in_fifo == 0 && delivery->pending_delete) {
-        free_qd_router_delivery_t(delivery);
-        return false;
-    }
-
-    return true;
-}
-
-
-void qd_router_delivery_set_context(qd_router_delivery_t *delivery, void *context)
-{
-    delivery->context = context;
-}
-
-
-void *qd_router_delivery_context(qd_router_delivery_t *delivery)
-{
-    return delivery->context;
-}
-
-
-qd_router_delivery_t *qd_router_delivery_peer(qd_router_delivery_t *delivery)
-{
-    return delivery->peer;
-}
-
-
-pn_delivery_t *qd_router_delivery_pn(qd_router_delivery_t *delivery)
-{
-    return delivery->pn_delivery;
-}
-
-
-void qd_router_delivery_settle(qd_router_delivery_t *delivery)
-{
-    if (delivery->pn_delivery) {
-        pn_delivery_set_context(delivery->pn_delivery, 0);
-        pn_delivery_settle(delivery->pn_delivery);
-        delivery->pn_delivery = 0;
-    }
-}
-
-
-bool qd_router_delivery_settled(qd_router_delivery_t *delivery)
-{
-    return pn_delivery_settled(delivery->pn_delivery);
-}
-
-
-bool qd_router_delivery_disp_changed(qd_router_delivery_t *delivery)
-{
-    return delivery->disposition != pn_delivery_remote_state(delivery->pn_delivery);
-}
-
-
-uint64_t qd_router_delivery_disp(qd_router_delivery_t *delivery)
-{
-    delivery->disposition = pn_delivery_remote_state(delivery->pn_delivery);
-    return delivery->disposition;
-}
-
-
-qd_router_link_t *qd_router_delivery_link(qd_router_delivery_t *delivery)
-{
-    return delivery->link;
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/router_forwarders.c
----------------------------------------------------------------------
diff --git a/src/router_forwarders.c b/src/router_forwarders.c
deleted file mode 100644
index 05bb9d0..0000000
--- a/src/router_forwarders.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "dispatch_private.h"
-
-/** defines a default set of forwarding behaviors based on the treatment of an
- * address.
- */
-
-
-static void forward_to_direct_subscribers_LH(qd_address_t *addr,
-                                             qd_router_delivery_t *delivery,
-                                             qd_message_t *msg,
-                                             int *fanout)
-{
-    qd_router_link_ref_t *dest_link_ref = DEQ_HEAD(addr->rlinks);
-    while (dest_link_ref) {
-        qd_routed_event_t *re = new_qd_routed_event_t();
-        DEQ_ITEM_INIT(re);
-        re->delivery    = 0;
-        re->message     = qd_message_copy(msg);
-        re->settle      = 0;
-        re->disposition = 0;
-        DEQ_INSERT_TAIL(dest_link_ref->link->msg_fifo, re);
-
-        (*fanout)++;
-        if (*fanout == 1) {
-            re->delivery = delivery;
-            qd_router_delivery_fifo_enter_LH(delivery);
-        }
-
-        addr->deliveries_egress++;
-        qd_link_activate(dest_link_ref->link->link);
-
-        //
-        // If the fanout is single, exit the loop here.  We only want to send one message copy.
-        //
-        if (QD_FANOUT(addr->treatment) == QD_FANOUT_SINGLE)
-            break;
-
-        dest_link_ref = DEQ_NEXT(dest_link_ref);
-    }
-
-    //
-    // If dest_link_ref is not null here, we exited after sending one message copy.
-    // If the number of local links is greater than one, rotate the head link to the
-    // tail so we balance the message deliveries.
-    //
-    if (dest_link_ref && DEQ_SIZE(addr->rlinks) > 1) {
-        assert(DEQ_HEAD(addr->rlinks) == dest_link_ref);
-        DEQ_REMOVE_HEAD(addr->rlinks);
-        DEQ_INSERT_TAIL(addr->rlinks, dest_link_ref);
-    }
-}
-
-
-static void forward_to_remote_subscribers_LH(qd_router_t *router,
-                                             qd_address_t *addr,
-                                             qd_router_delivery_t *delivery,
-                                             qd_message_t *msg,
-                                             int *fanout,
-                                             qd_field_iterator_t *ingress_iter)
-{
-    //
-    // Get the mask bit associated with the ingress router for the message.
-    // This will be compared against the "valid_origin" masks for each
-    // candidate destination router.
-    //
-    int origin = -1;
-    if (ingress_iter && !(addr->treatment & QD_BYPASS_VALID_ORIGINS)) {
-        qd_address_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
-        qd_address_t *origin_addr;
-        qd_hash_retrieve(router->addr_hash, ingress_iter, (void*) &origin_addr);
-        if (origin_addr && DEQ_SIZE(origin_addr->rnodes) == 1) {
-            qd_router_ref_t *rref = DEQ_HEAD(origin_addr->rnodes);
-            origin = rref->router->mask_bit;
-        }
-    } else
-        origin = 0;
-
-    //
-    // Forward to the next-hops for remote destinations.
-    //
-    if (origin >= 0) {
-        qd_router_ref_t  *dest_node_ref = DEQ_HEAD(addr->rnodes);
-        qd_router_link_t *dest_link;
-        qd_bitmask_t     *link_set = qd_bitmask(0);
-
-        //
-        // Loop over the target nodes for this address.  Build a set of outgoing links
-        // for which there are valid targets.  We do this to avoid sending more than one
-        // message down a given link.  It's possible that there are multiple destinations
-        // for this address that are all reachable over the same link.  In this case, we
-        // will send only one copy of the message over the link and allow a downstream
-        // router to fan the message out.
-        //
-        while (dest_node_ref) {
-            if (dest_node_ref->router->next_hop)
-                dest_link = dest_node_ref->router->next_hop->peer_link;
-            else
-                dest_link = dest_node_ref->router->peer_link;
-            if (dest_link && qd_bitmask_value(dest_node_ref->router->valid_origins, origin))
-                qd_bitmask_set_bit(link_set, dest_link->mask_bit);
-            dest_node_ref = DEQ_NEXT(dest_node_ref);
-        }
-
-        //
-        // Send a copy of the message outbound on each identified link.
-        //
-        int link_bit;
-        while (qd_bitmask_first_set(link_set, &link_bit)) {
-            qd_bitmask_clear_bit(link_set, link_bit);
-            dest_link = router->out_links_by_mask_bit[link_bit];
-            if (dest_link) {
-                qd_routed_event_t *re = new_qd_routed_event_t();
-                DEQ_ITEM_INIT(re);
-                re->delivery    = 0;
-                re->message     = qd_message_copy(msg);
-                re->settle      = 0;
-                re->disposition = 0;
-                DEQ_INSERT_TAIL(dest_link->msg_fifo, re);
-
-                (*fanout)++;
-                if (*fanout == 1) {
-                    re->delivery = delivery;
-                    qd_router_delivery_fifo_enter_LH(delivery);
-                }
-
-                addr->deliveries_transit++;
-                qd_link_activate(dest_link->link);
-
-                //
-                // If the fanout is single, exit the loop here.  We only want to send one message copy.
-                //
-                if (QD_FANOUT(addr->semantics) == QD_FANOUT_SINGLE)
-                    break;
-            }
-        }
-
-        qd_bitmask_free(link_set);
-    }
-}
-
-
-/** Multicast forwarder:
- */
-static bool forwarder_multicast_LH(qd_router_forwarder_t *forwarder,
-                                   qd_router_t *router,
-                                   qd_message_t *msg,
-                                   qd_router_delivery_t *delivery,
-                                   qd_address_t *addr,
-                                   qd_field_iterator_t *ingress_iter,
-                                   bool is_direct)
-{
-    int fanout = 0;
-    //
-    // Forward to all of the local links receiving this address.
-    //
-    forward_to_direct_subscribers_LH(addr, delivery, msg, &fanout);
-
-    //
-    // If the address form is direct to this router node, don't relay it on to
-    // any other part of the network.
-    //
-    if (!is_direct)
-        forward_to_remote_subscribers_LH(router, addr, delivery, msg, &fanout, ingress_iter);
-
-    return fanout != 0;
-}
-
-
-/** Forward using the 'closest' bias:
- */
-static bool forwarder_anycast_closest_LH(qd_router_forwarder_t *forwarder,
-                                         qd_router_t *router,
-                                         qd_message_t *msg,
-                                         qd_router_delivery_t *delivery,
-                                         qd_address_t *addr,
-                                         qd_field_iterator_t *ingress_iter,
-                                         bool is_direct)
-{
-    int fanout = 0;
-    //
-    // First, try to find a directly connected consumer for the address.  If
-    // there is none, then look for the closest remote consumer.
-    //
-    forward_to_direct_subscribers_LH(addr, delivery, msg, &fanout);
-    if (fanout == 0 && !is_direct)
-        forward_to_remote_subscribers_LH(router, addr, delivery, msg, &fanout, ingress_iter);
-
-    return fanout != 0;
-}
-
-
-/** Forwarding using a 'balanced' bias:
- */
-static bool forwarder_anycast_balanced_LH(qd_router_forwarder_t *forwarder,
-                                          qd_router_t *router,
-                                          qd_message_t *msg,
-                                          qd_router_delivery_t *delivery,
-                                          qd_address_t *addr,
-                                          qd_field_iterator_t *ingress_iter,
-                                          bool is_direct)
-{
-    int fanout = 0;
-    //
-    // Alternate between looking first for a local consumer and looking first
-    // for a remote consumer.
-    //
-    addr->toggle = !addr->toggle;
-    if (addr->toggle) {
-        forward_to_direct_subscribers_LH(addr, delivery, msg, &fanout);
-        if (fanout == 0 && !is_direct)
-            forward_to_remote_subscribers_LH(router, addr, delivery, msg, &fanout, ingress_iter);
-    } else {
-        if (!is_direct)
-            forward_to_remote_subscribers_LH(router, addr, delivery, msg, &fanout, ingress_iter);
-        if (fanout == 0)
-            forward_to_direct_subscribers_LH(addr, delivery, msg, &fanout);
-    }
-
-    return fanout != 0;
-}
-
-
-/* release method for default forwarders:
- */
-static void forwarder_release(qd_router_forwarder_t *forwarder)
-{
-    // no-op - they're static singletons!
-}
-
-
-/* The default forwarders:
- */
-static qd_router_forwarder_t multicast_forwarder = {
-    forwarder_multicast_LH,     /* forward method */
-    forwarder_release,
-};
-static qd_router_forwarder_t anycast_closest_forwarder = {
-    forwarder_anycast_closest_LH,     /* forward method */
-    forwarder_release,
-};
-static qd_router_forwarder_t anycast_balanced_forwarder = {
-    forwarder_anycast_balanced_LH,     /* forward method */
-    forwarder_release,
-};
-
-
-/** Get the proper default forwarder for an address of the given treatment:
- */
-qd_router_forwarder_t *qd_router_get_forwarder(qd_address_treatment_t treatment)
-{
-    switch (QD_FANOUT(treatment)) {
-    case QD_FANOUT_MULTIPLE:
-        return &multicast_forwarder;
-    case QD_FANOUT_SINGLE:
-        switch (QD_BIAS(treatment)) {
-        case QD_BIAS_CLOSEST:
-            return &anycast_closest_forwarder;
-        case QD_BIAS_SPREAD:
-            return &anycast_balanced_forwarder;
-        }
-    }
-    assert(false);  // invalid treatment? need new forwarder?
-    return 0;
-}
-
-
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index b374cd7..bf093df 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -26,7 +26,6 @@
 #include "dispatch_private.h"
 #include "entity_cache.h"
 #include "router_private.h"
-#include "waypoint_private.h"
 
 const char *QD_ROUTER_NODE_TYPE = "router.node";
 const char *QD_ROUTER_ADDRESS_TYPE = "router.address";

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/router_pynode.c
----------------------------------------------------------------------
diff --git a/src/router_pynode.c b/src/router_pynode.c
index 4d2c819..db95d9b 100644
--- a/src/router_pynode.c
+++ b/src/router_pynode.c
@@ -25,7 +25,6 @@
 #include <qpid/dispatch.h>
 #include "dispatch_private.h"
 #include "router_private.h"
-#include "waypoint_private.h"
 #include "entity_cache.h"
 
 static qd_log_source_t *log_source = 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/waypoint.c
----------------------------------------------------------------------
diff --git a/src/waypoint.c b/src/waypoint.c
deleted file mode 100644
index bfff845..0000000
--- a/src/waypoint.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "waypoint_private.h"
-#include "dispatch_private.h"
-#include "router_private.h"
-#include "entity_cache.h"
-#include <qpid/dispatch/ctools.h>
-#include <qpid/dispatch/threading.h>
-#include <qpid/dispatch/connection_manager.h>
-#include <memory.h>
-#include <stdio.h>
-
-typedef struct qd_waypoint_ref_t     qd_waypoint_ref_t;
-typedef struct qd_waypoint_context_t qd_waypoint_context_t;
-
-struct qd_waypoint_ref_t {
-    DEQ_LINKS(qd_waypoint_ref_t);
-    qd_waypoint_t *wp;
-};
-
-DEQ_DECLARE(qd_waypoint_ref_t, qd_waypoint_ref_list_t);
-
-struct qd_waypoint_context_t {
-    qd_waypoint_ref_list_t refs;
-};
-
-// Convenience for logging waypoint messages, expects qd and wp to be defined.
-#define LOG(LEVEL, MSG, ...) qd_log(qd->router->log_source, QD_LOG_##LEVEL, "waypoint=%s: " MSG, wp->address, __VA_ARGS__)
-
-static void qd_waypoint_visit_sink_LH(qd_dispatch_t *qd, qd_waypoint_t *wp)
-{
-    qd_router_t  *router = qd->router;
-    qd_address_t *addr   = wp->in_address;
-    char          unused;
-
-    //
-    // If the waypoint has no in-address, look it up in the hash table or create
-    // a new one and put it in the hash table.
-    //
-    if (!addr) {
-        //
-        // Compose the phased-address and search the routing table for the address.
-        // If it's not found, add it to the table but leave the link/router linkages empty.
-        //
-        qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
-        qd_address_iterator_set_phase(iter, wp->in_phase);
-        qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
-
-        if (!addr) {
-            addr = qd_address(router_semantics_for_addr(router, iter, wp->in_phase, &unused));
-            qd_hash_insert(router->addr_hash, iter, addr, &addr->hash_handle);
-            DEQ_INSERT_TAIL(router->addrs, addr);
-            addr->waypoint  = true;
-            qd_entity_cache_add(QD_ROUTER_ADDRESS_TYPE, addr);
-        }
-
-        wp->in_address = addr;
-        qd_field_iterator_free(iter);
-        LOG(TRACE, "Sink in-address=%s, in-phase=%c",
-            qd_address_logstr(wp->in_address), wp->in_phase);
-    }
-
-    if (!wp->connected) {
-        LOG(TRACE, "Sink start connector %s", wp->connector_name);
-        qd_connection_manager_start_on_demand(qd, wp->connector);
-    }
-    else if (!wp->out_link) {
-        wp->out_link = qd_link(router->node, wp->connection, QD_OUTGOING, wp->address);
-        pn_terminus_set_address(qd_link_target(wp->out_link), wp->address);
-
-        qd_router_link_t *rlink = 0; //qd_router_link(wp->out_link, QD_LINK_WAYPOINT, QD_OUTGOING, addr, wp, 0);
-
-        qd_entity_cache_add(QD_ROUTER_LINK_TYPE, rlink);
-        DEQ_INSERT_TAIL(router->links, rlink);
-        qd_link_set_context(wp->out_link, rlink);
-        qd_router_add_link_ref_LH(&addr->rlinks, rlink);
-
-        if (DEQ_SIZE(addr->rlinks) == 1) {
-            qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
-            qd_address_iterator_set_phase(iter, wp->in_phase);
-            //qd_router_mobile_added(router, iter);
-            qd_field_iterator_free(iter);
-        }
-
-        pn_link_open(qd_link_pn(wp->out_link));
-        qd_link_activate(wp->out_link);
-
-        LOG(TRACE, "Sink out-link '%s'", pn_link_name(qd_link_pn(wp->out_link)));
-    }
-}
-
-
-static void qd_waypoint_visit_source_LH(qd_dispatch_t *qd, qd_waypoint_t *wp)
-{
-    qd_router_t  *router = qd->router;
-    qd_address_t *addr   = wp->out_address;
-    char          unused;
-
-    //
-    // If the waypoint has no out-address, look it up in the hash table or create
-    // a new one and put it in the hash table.
-    //
-    if (!addr) {
-        //
-        // Compose the phased-address and search the routing table for the address.
-        // If it's not found, add it to the table but leave the link/router linkages empty.
-        //
-        qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
-        qd_address_iterator_set_phase(iter, wp->out_phase);
-        qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
-
-        if (!addr) {
-            addr = qd_address(router_semantics_for_addr(router, iter, wp->out_phase, &unused));
-            qd_hash_insert(router->addr_hash, iter, addr, &addr->hash_handle);
-            DEQ_INSERT_TAIL(router->addrs, addr);
-            addr->waypoint  = true;
-            qd_entity_cache_add(QD_ROUTER_ADDRESS_TYPE, addr);
-        }
-
-        wp->out_address = addr;
-        qd_field_iterator_free(iter);
-        LOG(TRACE, "Source out-address=%s, out-phase=%c",
-            qd_address_logstr(wp->out_address), wp->out_phase);
-    }
-
-    if (!wp->connected) {
-        LOG(TRACE, "Source start connector %s", wp->connector_name);
-        qd_connection_manager_start_on_demand(qd, wp->connector);
-    }
-    else if (!wp->in_link) {
-        wp->in_link = qd_link(router->node, wp->connection, QD_INCOMING, wp->address);
-        pn_terminus_set_address(qd_link_source(wp->in_link), wp->address);
-
-        qd_router_link_t *rlink = 0; //qd_router_link(wp->in_link, QD_LINK_WAYPOINT, QD_INCOMING, addr, wp, 0);
-
-        qd_entity_cache_add(QD_ROUTER_LINK_TYPE, rlink);
-        DEQ_INSERT_TAIL(router->links, rlink);
-        qd_link_set_context(wp->in_link, rlink);
-
-        pn_link_open(qd_link_pn(wp->in_link));
-        qd_link_activate(wp->in_link);
-
-        LOG(TRACE, "Source in-link '%s'", pn_link_name(qd_link_pn(wp->in_link)));
-    }
-    if (wp->in_link && (DEQ_SIZE(addr->rlinks) + DEQ_SIZE(addr->rnodes) > 0)) {
-        //
-        // CASE: This address has reachable destinations in the network.
-        //       If there is no inbound link from the waypoint source,
-        //       establish one and issue credit.
-        //
-        pn_link_flow(qd_link_pn(wp->in_link), 1);
-        qd_link_activate(wp->in_link);
-        LOG(DEBUG, "Added credit for incoming link '%s'", pn_link_name(qd_link_pn(wp->in_link)));
-    } else {
-        //
-        // CASE: This address has no reachable destinations in the network.
-        //
-    }
-}
-
-
-static void qd_waypoint_visit_LH(qd_dispatch_t *qd, qd_waypoint_t *wp)
-{
-    if (wp->in_phase)
-        qd_waypoint_visit_sink_LH(qd, wp);
-    if (wp->out_phase)
-        qd_waypoint_visit_source_LH(qd, wp);
-}
-
-
-static void qd_waypoint_activate_in_phase_LH(qd_dispatch_t *qd, qd_waypoint_t *wp)
-{
-    //
-    // Activate the "Sink" side of this waypoint.
-    //
-
-    //
-    // If the in-phase is null, then no in-phase was configured for this waypoint.
-    //
-    if (wp->in_phase == '\0')
-        return;
-
-    //
-    // Since the waypoint has an in-phase, we wish to advertise the waypoint's address
-    // for senders to send to.  We can't do this until a connection and link are set up
-    // to the waypoint.  Start the on-demand connector.
-    //
-    qd_connection_manager_start_on_demand(qd, wp->connector);
-}
-
-
-static void qd_waypoint_activate_out_phase_LH(qd_dispatch_t *qd, qd_waypoint_t *wp)
-{
-    //
-    // Activate the "Source" side of this waypoint.
-    //
-
-    // This function intentionally left blank
-}
-
-
-void qd_waypoint_activate_all(qd_dispatch_t *qd)
-{
-    qd_router_t   *router = qd->router;
-    qd_waypoint_t *wp;
-
-    sys_mutex_lock(router->lock);
-    for (wp = DEQ_HEAD(router->waypoints); wp; wp = DEQ_NEXT(wp)) {
-        //
-        // Associate the waypoint with its named on-demand connector and for every
-        // on-demand connector, create a list of associated waypoints.
-        //
-        if (!wp->connector) {
-            wp->connector = qd_connection_manager_find_on_demand(qd, wp->connector_name);
-            if (!wp->connector) {
-                LOG(ERROR, "On-demand connector '%s' not found", wp->connector_name);
-                continue;
-            }
-
-            qd_waypoint_context_t *context =
-                (qd_waypoint_context_t*) qd_config_connector_context(wp->connector);
-            if (!context) {
-                context = NEW(qd_waypoint_context_t);
-                DEQ_INIT(context->refs);
-                qd_config_connector_set_context(wp->connector, context);
-            }
-            qd_waypoint_ref_t *ref = NEW(qd_waypoint_ref_t);
-            DEQ_ITEM_INIT(ref);
-            ref->wp = wp;
-            DEQ_INSERT_TAIL(context->refs, ref);
-        }
-    }
-
-    for (wp = DEQ_HEAD(router->waypoints); wp; wp = DEQ_NEXT(wp)) {
-        qd_waypoint_activate_in_phase_LH(qd, wp);
-        qd_waypoint_activate_out_phase_LH(qd, wp);
-        qd_waypoint_visit_LH(qd, wp);
-    }
-    sys_mutex_unlock(router->lock);
-}
-
-
-void qd_waypoint_connection_opened(qd_dispatch_t *qd, qd_config_connector_t *cc, qd_connection_t *conn)
-{
-    qd_waypoint_context_t *context = (qd_waypoint_context_t*) qd_config_connector_context(cc);
-    if (!context)
-        return;
-
-    qd_log(qd->router->log_source, QD_LOG_INFO, "On-demand connector '%s' opened",
-           qd_config_connector_name(cc));
-
-    sys_mutex_lock(qd->router->lock);
-    qd_waypoint_ref_t *ref = DEQ_HEAD(context->refs);
-    while (ref) {
-        ref->wp->connected  = true;
-        ref->wp->connection = conn;
-        qd_waypoint_visit_LH(qd, ref->wp);
-        ref = DEQ_NEXT(ref);
-    }
-    sys_mutex_unlock(qd->router->lock);
-}
-
-
-void qd_waypoint_new_incoming_link(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link)
-{
-}
-
-
-void qd_waypoint_new_outgoing_link(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link)
-{
-}
-
-
-void qd_waypoint_link_closed(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link)
-{
-    if (qd_link_direction(link) == QD_INCOMING)
-        wp->in_link = 0;
-    else
-        wp->out_link = 0;
-}
-
-
-void qd_waypoint_address_updated_LH(qd_dispatch_t *qd, qd_address_t *addr)
-{
-    qd_waypoint_t *wp = DEQ_HEAD(qd->router->waypoints);
-    while (wp) {
-        LOG(TRACE, "Updated address %s", qd_address_logstr(addr));
-        if (wp->out_address == addr)
-            qd_waypoint_visit_LH(qd, wp);
-        wp = DEQ_NEXT(wp);
-    }
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2291e5cd/src/waypoint_private.h
----------------------------------------------------------------------
diff --git a/src/waypoint_private.h b/src/waypoint_private.h
deleted file mode 100644
index 4e064ea..0000000
--- a/src/waypoint_private.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef __waypoint_private_h__
-#define __waypoint_private_h__ 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <qpid/dispatch/server.h>
-#include <qpid/dispatch/connection_manager.h>
-#include "dispatch_private.h"
-
-/**
- * @file
- *
- * A waypoint sends/receives messages to/from an external entity such as a
- * broker as part of a multi-phase address.
- *
- * An address can have multiple phases. Each phase acts like a separate address,
- * but sharing the same address string.
- *
- * Phases are not visible to normal senders/receivers, they are set by
- * waypoints. Messages from normal senders go to the phase=0 address.  Normal
- * subscribers subscribe to the highest phase defined for the address.
- *
- * A waypoint takes messages for its in-phase and sends them to the external
- * entity. Messages received from the external entity are given the waypoint's
- * out-phase. Waypoints can be "chained" with the out-phase of one equal to the
- * in-phase for the next. Thus waypoints provide a way to route messages via
- * multiple external entities between a sender and a subscriber using the same
- * address.
- */
-
-void qd_waypoint_activate_all(qd_dispatch_t *qd);
-
-/** Called when the router opens a connector associated with this waypoint */
-void qd_waypoint_connection_opened(qd_dispatch_t *qd, qd_config_connector_t *cc, qd_connection_t *conn);
-
-void qd_waypoint_new_incoming_link(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link);
-
-void qd_waypoint_new_outgoing_link(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link);
-
-void qd_waypoint_link_closed(qd_dispatch_t *qd, qd_waypoint_t *wp, qd_link_t *link);
-
-void qd_waypoint_address_updated_LH(qd_dispatch_t *qd, qd_address_t *address);
-
-
-#endif


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


[06/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Include remote-container-id with open-connection indications to the router core.

Posted by tr...@apache.org.
DISPATCH-179 - Include remote-container-id with open-connection indications to the router core.


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

Branch: refs/heads/master
Commit: e51dd8c0d675a49d93889e80517c21b1fc4cab7f
Parents: cad374b
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 14:26:37 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 14:26:37 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |  1 +
 src/router_core/connections.c         | 75 ++++++++++++++++--------------
 src/router_core/router_core_private.h |  1 +
 src/router_node.c                     |  5 +-
 4 files changed, 45 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e51dd8c0/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 338c88e..3a8f2b8 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -159,6 +159,7 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
                                         bool                   incoming,
                                         qdr_connection_role_t  role,
                                         const char            *label,
+                                        const char            *remote_container_id,
                                         bool                   strip_annotations_in,
                                         bool                   strip_annotations_out);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e51dd8c0/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 37876d4..58606cf 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -65,6 +65,7 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
                                         bool                   incoming,
                                         qdr_connection_role_t  role,
                                         const char            *label,
+                                        const char            *remote_container_id,
                                         bool                   strip_annotations_in,
                                         bool                   strip_annotations_out)
 {
@@ -83,8 +84,9 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     DEQ_INIT(conn->work_list);
     conn->work_lock = sys_mutex();
 
-    action->args.connection.conn  = conn;
-    action->args.connection.label = label;
+    action->args.connection.conn         = conn;
+    action->args.connection.label        = label;
+    action->args.connection.container_id = qdr_field(remote_container_id);
     qdr_action_enqueue(core, action);
 
     return conn;
@@ -687,49 +689,50 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
 
 static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
-        return;
-
-    qdr_connection_t *conn = action->args.connection.conn;
-    DEQ_ITEM_INIT(conn);
-    DEQ_INSERT_TAIL(core->open_connections, conn);
-
-    if (conn->role == QDR_ROLE_NORMAL) {
-        //
-        // No action needed for NORMAL connections
-        //
-        return;
-    }
+    if (!discard) {
+        qdr_connection_t *conn = action->args.connection.conn;
+        DEQ_ITEM_INIT(conn);
+        DEQ_INSERT_TAIL(core->open_connections, conn);
 
-    if (conn->role == QDR_ROLE_INTER_ROUTER) {
-        //
-        // Assign a unique mask-bit to this connection as a reference to be used by
-        // the router module
-        //
-        if (qd_bitmask_first_set(core->neighbor_free_mask, &conn->mask_bit))
-            qd_bitmask_clear_bit(core->neighbor_free_mask, conn->mask_bit);
-        else {
-            qd_log(core->log, QD_LOG_CRITICAL, "Exceeded maximum inter-router connection count");
+        if (conn->role == QDR_ROLE_NORMAL) {
+            //
+            // No action needed for NORMAL connections
+            //
             return;
         }
 
-        if (!conn->incoming) {
+        if (conn->role == QDR_ROLE_INTER_ROUTER) {
             //
-            // The connector-side of inter-router connections is responsible for setting up the
-            // inter-router links:  Two (in and out) for control, two for routed-message transfer.
+            // Assign a unique mask-bit to this connection as a reference to be used by
+            // the router module
             //
-            (void) qdr_create_link_CT(core, conn, QD_LINK_CONTROL, QD_INCOMING, qdr_terminus_router_control(), qdr_terminus_router_control());
-            (void) qdr_create_link_CT(core, conn, QD_LINK_CONTROL, QD_OUTGOING, qdr_terminus_router_control(), qdr_terminus_router_control());
-            (void) qdr_create_link_CT(core, conn, QD_LINK_ROUTER,  QD_INCOMING, qdr_terminus_router_data(), qdr_terminus_router_data());
-            (void) qdr_create_link_CT(core, conn, QD_LINK_ROUTER,  QD_OUTGOING, qdr_terminus_router_data(), qdr_terminus_router_data());
+            if (qd_bitmask_first_set(core->neighbor_free_mask, &conn->mask_bit))
+                qd_bitmask_clear_bit(core->neighbor_free_mask, conn->mask_bit);
+            else {
+                qd_log(core->log, QD_LOG_CRITICAL, "Exceeded maximum inter-router connection count");
+                return;
+            }
+
+            if (!conn->incoming) {
+                //
+                // The connector-side of inter-router connections is responsible for setting up the
+                // inter-router links:  Two (in and out) for control, two for routed-message transfer.
+                //
+                (void) qdr_create_link_CT(core, conn, QD_LINK_CONTROL, QD_INCOMING, qdr_terminus_router_control(), qdr_terminus_router_control());
+                (void) qdr_create_link_CT(core, conn, QD_LINK_CONTROL, QD_OUTGOING, qdr_terminus_router_control(), qdr_terminus_router_control());
+                (void) qdr_create_link_CT(core, conn, QD_LINK_ROUTER,  QD_INCOMING, qdr_terminus_router_data(), qdr_terminus_router_data());
+                (void) qdr_create_link_CT(core, conn, QD_LINK_ROUTER,  QD_OUTGOING, qdr_terminus_router_data(), qdr_terminus_router_data());
+            }
         }
+
+        //
+        // If the role is ON_DEMAND:
+        //    Activate waypoints associated with this connection
+        //    Activate link-route destinations associated with this connection
+        //
     }
 
-    //
-    // If the role is ON_DEMAND:
-    //    Activate waypoints associated with this connection
-    //    Activate link-route destinations associated with this connection
-    //
+    qdr_field_free(action->args.connection.container_id);
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e51dd8c0/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 9eb2726..f6de278 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -84,6 +84,7 @@ struct qdr_action_t {
         struct {
             qdr_connection_t *conn;
             const char       *label;
+            qdr_field_t      *container_id;
             qdr_link_t       *link;
             qdr_delivery_t   *delivery;
             qd_message_t     *msg;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e51dd8c0/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 373f176..2b2b7b8 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -446,10 +446,13 @@ static void router_opened_handler(qd_router_t *router, qd_connection_t *conn, bo
     bool                   strip_annotations_in;
     bool                   strip_annotations_out;
     const char            *label;
+    pn_connection_t       *pn_conn = qd_connection_pn(conn);
 
-    qd_router_connection_get_config(conn, &role, &label, &strip_annotations_in, &strip_annotations_out);
+    qd_router_connection_get_config(conn, &role, &label,
+                                    &strip_annotations_in, &strip_annotations_out);
 
     qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, inbound, role, label,
+                                                   pn_connection_remote_container(pn_conn),
                                                    strip_annotations_in, strip_annotations_out);
 
     qd_connection_set_context(conn, qdrc);


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


[11/50] [abbrv] qpid-dispatch git commit: DISPATCH_179 - Added activation and deactivation logic for link routes.

Posted by tr...@apache.org.
DISPATCH_179 - Added activation and deactivation logic for link routes.


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

Branch: refs/heads/master
Commit: da00ebcd00d94122d1c59ab95c2e24944b88ea50
Parents: d53f895
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 4 10:17:04 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 4 10:17:04 2016 -0500

----------------------------------------------------------------------
 src/router_core/route_control.c       | 61 +++++++++++++++++++++++++++---
 src/router_core/router_core.c         | 23 +++++++++++
 src/router_core/router_core_private.h | 47 ++++++++++-------------
 3 files changed, 99 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/da00ebcd/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index b72c535..2f66d14 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -132,13 +132,64 @@ static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identi
 }
 
 
-static void qdr_route_activate_CT(qdr_core_t *core, qdr_route_active_t *active)
+static void qdr_route_activate_CT(qdr_core_t *core, qdr_route_active_t *active, qdr_connection_t *conn)
 {
+    qdr_route_config_t *route = active->config;
+    const char         *key;
+
+    if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
+        //
+        // Activate the address(es) for link-routed destinations.  If this is the first
+        // activation for this address, notify the router module of the added address.
+        //
+        if (route->out_addr) {
+            qdr_add_connection_ref(&route->out_addr->conns, conn);
+            if (DEQ_SIZE(route->out_addr->conns) == 1) {
+                key = (const char*) qd_hash_key_by_handle(route->out_addr->hash_handle);
+                if (key)
+                    qdr_post_mobile_added_CT(core, key);
+            }
+        }
+
+        if (route->in_addr) {
+            qdr_add_connection_ref(&route->in_addr->conns, conn);
+            if (DEQ_SIZE(route->in_addr->conns) == 1) {
+                key = (const char*) qd_hash_key_by_handle(route->in_addr->hash_handle);
+                if (key)
+                    qdr_post_mobile_added_CT(core, key);
+            }
+        }
+    }
 }
 
 
-static void qdr_route_deactivate_CT(qdr_core_t *core, qdr_route_active_t *active)
+static void qdr_route_deactivate_CT(qdr_core_t *core, qdr_route_active_t *active, qdr_connection_t *conn)
 {
+    qdr_route_config_t *route = active->config;
+    const char         *key;
+
+    if (route->treatment == QD_TREATMENT_LINK_BALANCED) {
+        //
+        // Deactivate the address(es) for link-routed destinations.
+        //
+        if (route->out_addr) {
+            qdr_del_connection_ref(&route->out_addr->conns, conn);
+            if (DEQ_IS_EMPTY(route->out_addr->conns)) {
+                key = (const char*) qd_hash_key_by_handle(route->out_addr->hash_handle);
+                if (key)
+                    qdr_post_mobile_removed_CT(core, key);
+            }
+        }
+
+        if (route->in_addr) {
+            qdr_del_connection_ref(&route->in_addr->conns, conn);
+            if (DEQ_IS_EMPTY(route->in_addr->conns)) {
+                key = (const char*) qd_hash_key_by_handle(route->in_addr->hash_handle);
+                if (key)
+                    qdr_post_mobile_removed_CT(core, key);
+            }
+        }
+    }
 }
 
 
@@ -235,7 +286,7 @@ void qdr_route_connection_add_CT(qdr_core_t         *core,
     // If the connection identifier represents an already open connection, activate the route.
     //
     if (cid->open_connection)
-        qdr_route_activate_CT(core, active);
+        qdr_route_activate_CT(core, active, cid->open_connection);
 }
 
 
@@ -274,7 +325,7 @@ void qdr_route_connection_opened_CT(qdr_core_t       *core,
     //
     qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
     while (active) {
-        qdr_route_activate_CT(core, active);
+        qdr_route_activate_CT(core, active, conn);
         active = DEQ_NEXT_N(REF, active);
     }
 }
@@ -292,7 +343,7 @@ void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
         //
         qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
         while (active) {
-            qdr_route_deactivate_CT(core, active);
+            qdr_route_deactivate_CT(core, active, conn);
             active = DEQ_NEXT_N(REF, active);
         }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/da00ebcd/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 4603555..020a91c 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,6 +30,7 @@ ALLOC_DEFINE(qdr_link_t);
 ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
+ALLOC_DEFINE(qdr_connection_ref_t);
 
 static void qdr_general_handler(void *context);
 
@@ -262,6 +263,28 @@ void qdr_del_link_ref(qdr_link_ref_list_t *ref_list, qdr_link_t *link, int cls)
 }
 
 
+void qdr_add_connection_ref(qdr_connection_ref_list_t *ref_list, qdr_connection_t *conn)
+{
+    qdr_connection_ref_t *ref = new_qdr_connection_ref_t();
+    DEQ_ITEM_INIT(ref);
+    ref->conn = conn;
+    DEQ_INSERT_TAIL(*ref_list, ref);
+}
+
+
+void qdr_del_connection_ref(qdr_connection_ref_list_t *ref_list, qdr_connection_t *conn)
+{
+    qdr_connection_ref_t *ref = DEQ_HEAD(*ref_list);
+    while (ref) {
+        if (ref->conn == conn) {
+            DEQ_REMOVE(*ref_list, ref);
+            free_qdr_connection_ref_t(ref);
+            break;
+        }
+    }
+}
+
+
 void qdr_add_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode)
 {
     qdr_router_ref_t *ref = new_qdr_router_ref_t();

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/da00ebcd/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 5caae66..0988ffa 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -30,12 +30,11 @@ typedef struct qdr_address_config_t  qdr_address_config_t;
 typedef struct qdr_node_t            qdr_node_t;
 typedef struct qdr_router_ref_t      qdr_router_ref_t;
 typedef struct qdr_link_ref_t        qdr_link_ref_t;
-typedef struct qdr_lrp_t             qdr_lrp_t;
-typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
 typedef struct qdr_route_config_t    qdr_route_config_t;
 typedef struct qdr_route_active_t    qdr_route_active_t;
 typedef struct qdr_conn_identifier_t qdr_conn_identifier_t;
+typedef struct qdr_connection_ref_t  qdr_connection_ref_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
@@ -254,23 +253,17 @@ void qdr_add_link_ref(qdr_link_ref_list_t *ref_list, qdr_link_t *link, int cls);
 void qdr_del_link_ref(qdr_link_ref_list_t *ref_list, qdr_link_t *link, int cls);
 
 
-struct qdr_lrp_t {
-    DEQ_LINKS(qdr_lrp_t);
-    char               *prefix;
-    bool                inbound;
-    bool                outbound;
-    qd_lrp_container_t *container;
+struct qdr_connection_ref_t {
+    DEQ_LINKS(qdr_connection_ref_t);
+    qdr_connection_t *conn;
 };
 
-DEQ_DECLARE(qdr_lrp_t, qdr_lrp_list_t);
+ALLOC_DECLARE(qdr_connection_ref_t);
+DEQ_DECLARE(qdr_connection_ref_t, qdr_connection_ref_list_t);
 
-struct qdr_lrp_ref_t {
-    DEQ_LINKS(qdr_lrp_ref_t);
-    qdr_lrp_t *lrp;
-};
+void qdr_add_connection_ref(qdr_connection_ref_list_t *ref_list, qdr_connection_t *conn);
+void qdr_del_connection_ref(qdr_connection_ref_list_t *ref_list, qdr_connection_t *conn);
 
-ALLOC_DECLARE(qdr_lrp_ref_t);
-DEQ_DECLARE(qdr_lrp_ref_t, qdr_lrp_ref_list_t);
 
 struct qdr_subscription_t {
     DEQ_LINKS(qdr_subscription_t);
@@ -285,18 +278,18 @@ DEQ_DECLARE(qdr_subscription_t, qdr_subscription_list_t);
 
 struct qdr_address_t {
     DEQ_LINKS(qdr_address_t);
-    qdr_subscription_list_t  subscriptions; ///< In-process message subscribers
-    qdr_lrp_ref_list_t       lrps;          ///< Local link-route destinations
-    qdr_link_ref_list_t      rlinks;        ///< Locally-Connected Consumers
-    qdr_link_ref_list_t      inlinks;       ///< Locally-Connected Producers
-    qd_bitmask_t            *rnodes;        ///< Bitmask of remote routers with connected consumers
-    qd_hash_handle_t        *hash_handle;   ///< Linkage back to the hash table entry
-    qd_address_treatment_t   treatment;
-    qdr_forwarder_t         *forwarder;
-    bool                     toggle;
-    bool                     waypoint;
-    bool                     block_deletion;
-    bool                     local;
+    qdr_subscription_list_t    subscriptions; ///< In-process message subscribers
+    qdr_connection_ref_list_t  conns;         ///< Local Connections for route-destinations
+    qdr_link_ref_list_t        rlinks;        ///< Locally-Connected Consumers
+    qdr_link_ref_list_t        inlinks;       ///< Locally-Connected Producers
+    qd_bitmask_t              *rnodes;        ///< Bitmask of remote routers with connected consumers
+    qd_hash_handle_t          *hash_handle;   ///< Linkage back to the hash table entry
+    qd_address_treatment_t     treatment;
+    qdr_forwarder_t           *forwarder;
+    bool                       toggle;
+    bool                       waypoint;
+    bool                       block_deletion;
+    bool                       local;
 
     /**@name Statistics */
     ///@{


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


[46/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Updated default configuration file to not use deprecated types

Posted by tr...@apache.org.
DISPATCH-179 - Updated default configuration file to not use deprecated types


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

Branch: refs/heads/master
Commit: d953608b0bef8dc964ab249bd9e9e5810cd7380e
Parents: 7f66a61
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 15:40:11 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 15:40:11 2016 -0400

----------------------------------------------------------------------
 etc/qdrouterd.conf | 59 +++++++++++++------------------------------------
 1 file changed, 15 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d953608b/etc/qdrouterd.conf
----------------------------------------------------------------------
diff --git a/etc/qdrouterd.conf b/etc/qdrouterd.conf
index 25ca222..67abb6a 100644
--- a/etc/qdrouterd.conf
+++ b/etc/qdrouterd.conf
@@ -36,57 +36,28 @@ listener {
     authenticatePeer: no
 }
 
-fixedAddress {
-    prefix: /closest/
-    fanout: single
-    bias: closest
+address {
+    prefix: closest
+    distribution: closest
 }
 
-fixedAddress {
-    prefix: /multicast/
-    fanout: multiple
+address {
+    prefix: multicast
+    distribution: multicast
 }
 
-fixedAddress {
-    prefix: /queue/
-    phase:  0
-    fanout: single
-    bias:   closest
+address {
+    prefix: unicast
+    distribution: closest
 }
 
-fixedAddress {
-    prefix: /queue/
-    phase:  1
-    fanout: single
-    bias:   closest
+address {
+    prefix: exclusive
+    distribution: closest
 }
 
-fixedAddress {
-    prefix: /unicast
-    fanout: single
-    bias: closest
+address {
+    prefix: broadcast
+    distribution: multicast
 }
 
-fixedAddress {
-    prefix: /exclusive
-    fanout: single
-    bias: closest
-}
-
-fixedAddress {
-    prefix: /broadcast
-    fanout: multiple
-}
-
-fixedAddress {
-    prefix: /
-    fanout: multiple
-}
-
-##
-## Temporary
-##
-log {
-    module: ROUTER_CORE
-    enable: trace+
-}


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


[08/50] [abbrv] qpid-dispatch git commit: DISPATCH-230 - Added route-container role and deprecated on-demand role.

Posted by tr...@apache.org.
DISPATCH-230 - Added route-container role and deprecated on-demand role.


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

Branch: refs/heads/master
Commit: e9da4b7ab0f89a35436ca1af50821a6f3e3b5f52
Parents: ba7ad58
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 17:33:28 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 17:33:28 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h           | 1 +
 python/qpid_dispatch/management/qdrouter.json | 1 +
 src/router_node.c                             | 6 ++++--
 3 files changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e9da4b7a/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 3a8f2b8..06669f5 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -136,6 +136,7 @@ typedef enum {
 typedef enum {
     QDR_ROLE_NORMAL,
     QDR_ROLE_INTER_ROUTER,
+    QDR_ROLE_ROUTE_CONTAINER,
     QDR_ROLE_ON_DEMAND
 } qdr_connection_role_t;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e9da4b7a/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index e1ee1b7..83d9d52 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -31,6 +31,7 @@
                     "type": [
                         "normal",
                         "inter-router",
+                        "route-container",
                         "on-demand"
                     ],
                     "default": "normal",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e9da4b7a/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 2b2b7b8..a2b6e2d 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -35,6 +35,7 @@ const char *CORE_AGENT_ADDRESS = "$management";
 
 static char *router_role    = "inter-router";
 static char *on_demand_role = "on-demand";
+static char *container_role = "route-container";
 static char *direct_prefix;
 static char *node_id;
 
@@ -57,8 +58,9 @@ static void qd_router_connection_get_config(const qd_connection_t  *conn,
             *strip_annotations_in  = false;
             *strip_annotations_out = false;
             *role = QDR_ROLE_INTER_ROUTER;
-        } else if (cf && strcmp(cf->role, on_demand_role) == 0)
-            *role = QDR_ROLE_ON_DEMAND;
+        } else if (cf && (strcmp(cf->role, container_role) == 0 ||
+                          strcmp(cf->role, on_demand_role) == 0))  // backward compat
+            *role = QDR_ROLE_ROUTE_CONTAINER;
         else
             *role = QDR_ROLE_NORMAL;
 


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


[04/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Updated agent to handle updated router.route entity definition.

Posted by tr...@apache.org.
DISPATCH-179 - Updated agent to handle updated router.route entity definition.


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

Branch: refs/heads/master
Commit: dc675a38f24907566e9c575756e6be56ec82e0ef
Parents: c72e179
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 12:19:08 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 12:19:08 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |   1 -
 src/CMakeLists.txt                    |   2 +-
 src/router_core/DESIGN                |   7 +-
 src/router_core/agent.c               |  17 +-
 src/router_core/agent_address.c       |  10 +-
 src/router_core/agent_link.c          |   2 +-
 src/router_core/agent_route.c         | 315 ++++++++++++++---------------
 src/router_core/agent_route.h         |   2 +-
 src/router_core/agent_waypoint.c      | 165 ---------------
 src/router_core/agent_waypoint.h      |  39 ----
 src/router_core/connections.c         |   4 +-
 src/router_core/management_agent.c    |  62 +++---
 src/router_core/route_control.c       | 168 +++++++++++++++
 src/router_core/route_control.h       |  50 +++++
 src/router_core/route_tables.c        |   3 +-
 src/router_core/router_core.c         |   1 -
 src/router_core/router_core_private.h |  82 +++++---
 17 files changed, 488 insertions(+), 442 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index b38022f..338c88e 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -546,7 +546,6 @@ typedef enum {
     QD_ROUTER_CONNECTION,
     QD_ROUTER_LINK,
     QD_ROUTER_ADDRESS,
-    QD_ROUTER_WAYPOINT,
     QD_ROUTER_EXCHANGE,
     QD_ROUTER_BINDING
 } qd_router_entity_type_t;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f74babe..472090d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -66,12 +66,12 @@ set(qpid_dispatch_SOURCES
   router_config.c
   router_core/agent.c
   router_core/agent_address.c
-  router_core/agent_waypoint.c
   router_core/agent_link.c
   router_core/agent_route.c
   router_core/connections.c
   router_core/error.c
   router_core/forwarder.c
+  router_core/route_control.c
   router_core/router_core.c
   router_core/router_core_thread.c
   router_core/route_tables.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index dde7cb4..8114370 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -184,7 +184,7 @@ Forwarding Treatment
 
   Transition from fanout/bias to a one-dimensional list of treatment:
 
-    MULTICAST_FLOOD
+    MULTICAST_FLOOD (not available to users)
 
         Messages are delivered to all subscribers via all unique paths.  If there is
         redundancy in the router topology, multiple copies of each message will be
@@ -257,3 +257,8 @@ org
           waypoint        (proposed)
         waypoint          (deprecated)
 
+
+============================
+Route Control Data Structure
+============================
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index b0c5381..40db041 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -20,7 +20,6 @@
 #include <qpid/dispatch/amqp.h>
 #include "agent_route.h"
 #include "agent_address.h"
-#include "agent_waypoint.h"
 #include "agent_link.h"
 #include "router_core_private.h"
 #include <stdio.h>
@@ -48,7 +47,7 @@ static void qdr_agent_response_handler(void *context)
         sys_mutex_unlock(core->query_lock);
 
         if (query) {
-            core->agent_response_handler(query->context, query->status, query->more);
+            core->agent_response_handler(query->context, &query->status, query->more);
             if (!query->more) {
                 if (query->next_key)
                     qdr_field_free(query->next_key);
@@ -70,6 +69,7 @@ void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query)
         qd_timer_schedule(core->agent_timer, 0);
 }
 
+
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,
@@ -79,14 +79,12 @@ qdr_query_t *qdr_query(qdr_core_t              *core,
     qdr_query_t *query = new_qdr_query_t();
 
     DEQ_ITEM_INIT(query);
+    ZERO(query);
     query->core        = core;
     query->entity_type = type;
     query->context     = context;
     query->body        = body;
-    query->next_key    = 0;
-    query->next_offset = 0;
     query->more        = false;
-    query->status      = 0;
 
     return query;
 }
@@ -188,9 +186,6 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
         qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT);
         break;
 
-    case QD_ROUTER_WAYPOINT:
-        break;
-
     case QD_ROUTER_EXCHANGE:
         break;
 
@@ -209,7 +204,6 @@ void qdr_query_add_attribute_names(qdr_query_t *query)
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:     qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
-    case QD_ROUTER_WAYPOINT:    break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
     }
@@ -322,7 +316,6 @@ static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
-    case QD_ROUTER_WAYPOINT:    break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -340,7 +333,6 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     break;
-    case QD_ROUTER_WAYPOINT:    qdra_waypoint_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -358,7 +350,6 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_delete_CT(core, name, identity, query); break;
-    case QD_ROUTER_WAYPOINT:    qdra_waypoint_delete_CT(core, name, identity, query); break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -378,7 +369,6 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_WAYPOINT:    break;
         case QD_ROUTER_EXCHANGE:    break;
         case QD_ROUTER_BINDING:     break;
         }
@@ -396,7 +386,6 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_next_CT(core, query); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_next_CT(core, query); break;
-        case QD_ROUTER_WAYPOINT:    break;
         case QD_ROUTER_EXCHANGE:    break;
         case QD_ROUTER_BINDING:     break;
         }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index bc008ff..1ed1614 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -185,14 +185,14 @@ void qdra_address_get_CT(qdr_core_t          *core,
 
     if (addr == 0) {
         // Send back a 404
-        query->status = &QD_AMQP_NOT_FOUND;
+        query->status = QD_AMQP_NOT_FOUND;
     }
     else {
         //
         // Write the columns of the address entity into the response body.
         //
         qdr_manage_write_address_map_CT(addr, query->body, qdr_address_columns);
-        query->status = &QD_AMQP_OK;
+        query->status = QD_AMQP_OK;
     }
 
     //
@@ -208,7 +208,7 @@ void qdra_address_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of addresses, end the query now.
@@ -302,7 +302,7 @@ void qdra_address_delete_CT(qdr_core_t          *core,
        //TOOD - do something here
     }
     else {
-        query->status = &QD_AMQP_BAD_REQUEST;
+        query->status = QD_AMQP_BAD_REQUEST;
         success = false;
     }
 
@@ -310,7 +310,7 @@ void qdra_address_delete_CT(qdr_core_t          *core,
     // TODO - Add more logic here.
     if (success) {
         // If the request was successful then the statusCode MUST be 204 (No Content).
-        query->status = &QD_AMQP_NO_CONTENT;
+        query->status = QD_AMQP_NO_CONTENT;
     }
 
     //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index 997b9e6..9eee88f 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -153,7 +153,7 @@ void qdra_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of links, end the query now.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index af042cd..a1586c0 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -17,40 +17,37 @@
  * under the License.
  */
 
-#include "agent_link.h"
+#include "agent_route.h"
+#include "route_control.h"
 #include <stdio.h>
 
-#define QDR_ROUTE_NAME               0
-#define QDR_ROUTE_IDENTITY           1
-#define QDR_ROUTE_TYPE               2
-#define QDR_ROUTE_OBJECT_TYPE        3
-#define QDR_ROUTE_ADDRESS            4
-#define QDR_ROUTE_CONNECTOR          5
-#define QDR_ROUTE_DIRECTION          6
-#define QDR_ROUTE_TREATMENT          7
-#define QDR_ROUTE_INGRESS_ADDRESS    8
-#define QDR_ROUTE_EGRESS_ADDRESS     9
-#define QDR_ROUTE_INGRESS_TREATMENT  10
-#define QDR_ROUTE_EGRESS_TREATMENT   11
+#define QDR_ROUTE_NAME          0
+#define QDR_ROUTE_IDENTITY      1
+#define QDR_ROUTE_TYPE          2
+#define QDR_ROUTE_ADDRESS       3
+#define QDR_ROUTE_PATH          4
+#define QDR_ROUTE_TREATMENT     5
+#define QDR_ROUTE_CONNECTORS    6
+#define QDR_ROUTE_CONTAINERS    7
+#define QDR_ROUTE_ROUTE_ADDRESS 8
 
 const char *qdr_route_columns[] =
     {"name",
      "identity",
      "type",
-     "objectType",
      "address",
-     "connector",
-     "direction",
+     "path",
      "treatment",
-     "ingressAddress",
-     "egressAddress",
-     "ingressTreatment",
-     "egressTreatment",
+     "connectors",
+     "containers",
+     "routeAddress",
      0};
 
 
-static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_field_t *body, bool as_map)
+static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_composed_field_t *body, bool as_map)
 {
+    const char *text = 0;
+
     if (as_map)
         qd_compose_insert_string(body, qdr_route_columns[col]);
 
@@ -62,29 +59,55 @@ static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_
         }
         // else fall into IDENTITY
 
-    case QDR_ROUTE_IDENTITY:
+    case QDR_ROUTE_IDENTITY: {
+        char id_str[100];
+        snprintf(id_str, 100, "%ld", route->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+    }
 
     case QDR_ROUTE_TYPE:
         qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.route");
         break;
 
-    case QDR_ROUTE_OBJECT_TYPE:
     case QDR_ROUTE_ADDRESS:
-    case QDR_ROUTE_CONNECTOR:
-    case QDR_ROUTE_DIRECTION:
+        if (route->addr_config)
+            qd_compose_insert_string(body, (const char*) qd_hash_key_by_handle(route->addr_config->hash_handle));
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_ROUTE_PATH:
+        switch (route->path) {
+        case QDR_ROUTE_PATH_DIRECT:   text = "direct";  break;
+        case QDR_ROUTE_PATH_SOURCE:   text = "source";  break;
+        case QDR_ROUTE_PATH_SINK:     text = "sink";    break;
+        case QDR_ROUTE_PATH_WAYPOINT: text = "waypoint"; break;
+        }
+        qd_compose_insert_string(body, text);
+        break;
+
     case QDR_ROUTE_TREATMENT:
-    case QDR_ROUTE_INGRESS_ADDRESS:
-    case QDR_ROUTE_EGRESS_ADDRESS:
-    case QDR_ROUTE_INGRESS_TREATMENT:
-    case QDR_ROUTE_EGRESS_TREATMENT:
-    default:
+        switch (route->treatment) {
+        case QD_TREATMENT_MULTICAST_FLOOD:
+        case QD_TREATMENT_MULTICAST_ONCE:   text = "multicast";    break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  text = "closest";      break;
+        case QD_TREATMENT_ANYCAST_BALANCED: text = "balanced";     break;
+        case QD_TREATMENT_LINK_BALANCED:    text = "linkBalanced"; break;
+        }
+        qd_compose_insert_string(body, text);
+        break;
+
+    case QDR_ROUTE_CONNECTORS:
+    case QDR_ROUTE_CONTAINERS:
+    case QDR_ROUTE_ROUTE_ADDRESS:
         qd_compose_insert_null(body);
         break;
     }
 }
 
 
-static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
+static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_config_t *route)
 {
     qd_composed_field_t *body = query->body;
 
@@ -97,7 +120,7 @@ static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
     qd_compose_end_list(body);
 }
 
-static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_t *route)
+static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_config_t *route)
 {
     query->next_offset++;
     route = DEQ_NEXT(route);
@@ -110,12 +133,12 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of objects, end the query now.
     //
-    if (offset >= DEQ_SIZE(core->routes)) {
+    if (offset >= DEQ_SIZE(core->route_config)) {
         query->more = false;
         qdr_agent_enqueue_response_CT(core, query);
         return;
@@ -124,7 +147,7 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Run to the object at the offset.
     //
-    qdr_route_t *route = DEQ_HEAD(core->routes);
+    qdr_route_config_t *route = DEQ_HEAD(core->route_config);
     for (int i = 0; i < offset && route; i++)
         route = DEQ_NEXT(route);
     assert(route);
@@ -149,13 +172,13 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
 
 void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
 {
-    qdr_route_t *route = 0;
+    qdr_route_config_t *route = 0;
 
-        if (query->next_offset < DEQ_SIZE(core->routes)) {
-            route = DEQ_HEAD(core->routes);
-            for (int i = 0; i < query->next_offset && route; i++)
-                route = DEQ_NEXT(route);
-        }
+    if (query->next_offset < DEQ_SIZE(core->route_config)) {
+        route = DEQ_HEAD(core->route_config);
+        for (int i = 0; i < query->next_offset && route; i++)
+            route = DEQ_NEXT(route);
+    }
 
     if (route) {
         //
@@ -181,129 +204,97 @@ static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
 {
     if (field) {
         qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_TREATMENT_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_TREATMENT_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_TREATMENT_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multicast"))    return QD_TREATMENT_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "closest"))      return QD_TREATMENT_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "balanced"))     return QD_TREATMENT_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "linkBalanced")) return QD_TREATMENT_LINK_BALANCED;
     }
     return QD_TREATMENT_ANYCAST_BALANCED;
 }
 
 
-static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_treatment_t treatment)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_config_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = new_qdr_address_config_t();
-    DEQ_ITEM_INIT(addr);
-    addr->treatment = treatment;
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addr_config, addr);
-    }
-
-    return addr;
-}
-
-
-static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_treatment_t treatment)
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
+                          qdr_query_t *query, qd_parsed_field_t *in_body)
 {
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
+    // TODO - reject duplicate names
 
-    addr = qdr_address_CT(core, treatment);
+    while (true) {
+        //
+        // Validation of the request occurs here.  Make sure the body is a map.
+        //
+        if (!qd_parse_is_map(in_body)) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
 
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addrs, addr);
-    }
+        //
+        // Extract the fields from the request
+        //
+        qd_parsed_field_t *addr_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
+        qd_parsed_field_t *path_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_PATH]);
+        qd_parsed_field_t *conn_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTORS]);
+        qd_parsed_field_t *cont_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONTAINERS]);
+        qd_parsed_field_t *treatment_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
+        qd_parsed_field_t *route_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ROUTE_ADDRESS]);
 
-    return addr;
-}
+        //
+        // Determine the path, which defaults to Direct
+        //
+        qdr_route_path_t path = QDR_ROUTE_PATH_DIRECT;
+        if (path_field) {
+            qd_field_iterator_t *path_iter = qd_parse_raw(path_field);
+            if      (qd_field_iterator_equal(path_iter, (unsigned char*) "direct"))
+                path = QDR_ROUTE_PATH_DIRECT;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "source"))
+                path = QDR_ROUTE_PATH_SOURCE;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "sink"))
+                path = QDR_ROUTE_PATH_SINK;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "waypoint"))
+                path = QDR_ROUTE_PATH_WAYPOINT;
+            else {
+                query->status = QD_AMQP_BAD_REQUEST;
+                break;
+            }
+        }
 
+        qd_address_treatment_t treatment = qdra_treatment(treatment_field);
 
-void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
-                          qdr_query_t *query, qd_parsed_field_t *in_body)
-{
-    // TODO - reject duplicate names
+        //
+        // Ask the route_control module to create the route object and put into effect any needed
+        // side effects.
+        //
+        qdr_route_config_t *route;
+        const char *error = qdr_route_create_CT(core, name, path, treatment, addr_field, route_addr_field, &route);
 
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_OBJECT_TYPE]);
-        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
-        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
-        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
-        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
-        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_TREATMENT]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_TREATMENT]);
-
-        bool still_good = true;
-        qdr_route_t *route = new_qdr_route_t();
-        ZERO(route);
-
-        route->identity = qdr_identifier(core);
-        if (name)
-            route->name = (char*) qd_field_iterator_copy(name);
-
-        if (!type_field)
-            route->object_type = QDR_ROUTE_TYPE_ADDRESS;
-        else {
-            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
-            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
-                route->object_type = QDR_ROUTE_TYPE_ADDRESS;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
-                route->object_type = QDR_ROUTE_TYPE_LINK_DEST;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
-                route->object_type = QDR_ROUTE_TYPE_WAYPOINT;
-            else
-                still_good = false;
+        if (error) {
+            query->status.status      = 400;
+            query->status.description = error;
+            break;
         }
 
-        route->treatment = qdra_treatment(sem_field);
-
-        route->direction_in  = true;
-        route->direction_out = true;
-        if (dir_field) {
-            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
-                route->direction_out = false;
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
-                route->direction_in = false;
+        //
+        // Add the initial list of connection labels to the route
+        //
+        if (conn_field && qd_parse_is_list(conn_field)) {
+            uint32_t count = qd_parse_sub_count(conn_field);
+            for (uint32_t i = 0; i < count; i++) {
+                qd_parsed_field_t *conn_label = qd_parse_sub_value(conn_field, i);
+                qdr_route_connection_add_CT(route, conn_label, false);
+            }
         }
 
-        if (conn_field) {
-            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
-            route->connector_label = (char*) qd_field_iterator_copy(conn_iter);
+        //
+        // Add the initial list of container IDs to the route
+        //
+        if (cont_field && qd_parse_is_list(cont_field)) {
+            uint32_t count = qd_parse_sub_count(cont_field);
+            for (uint32_t i = 0; i < count; i++) {
+                qd_parsed_field_t *cont_id = qd_parse_sub_value(cont_field, i);
+                qdr_route_connection_add_CT(route, cont_id, true);
+            }
         }
 
+        /*
         switch (route->object_type) {
         case QDR_ROUTE_TYPE_ADDRESS:
             route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->treatment);
@@ -319,26 +310,30 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
         case QDR_ROUTE_TYPE_WAYPOINT:
             break;
         }
+        */
 
-        if (still_good) {
-            // TODO - write response map
-            query->status = &QD_AMQP_CREATED;
-            DEQ_INSERT_TAIL(core->routes, route);
-        } else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-            if (route->name)
-                free(route->name);
-            free_qdr_route_t(route);
+        //
+        // Compose the result map for the response.
+        //
+        if (query->body) {
+            qd_compose_start_map(query->body);
+            for (int col = 0; col < QDR_ROUTE_COLUMN_COUNT; col++)
+                qdr_route_insert_column_CT(route, col, query->body, true);
+            qd_compose_end_map(query->body);
         }
+
+        query->status = QD_AMQP_CREATED;
+        break;
     }
-    else
-        query->status = &QD_AMQP_BAD_REQUEST;
 
     //
-    // Enqueue the response.
+    // Enqueue the response if there is a body. If there is no body, this is a management
+    // operation created internally by the configuration file parser.
     //
-    if (query->body)
+    if (query->body) {
+        if (query->status.status / 100 > 2)
+            qd_compose_insert_null(query->body);
         qdr_agent_enqueue_response_CT(core, query);
-    else
+    } else
         free_qdr_query_t(query);
 }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.h b/src/router_core/agent_route.h
index 86ec69c..ec8d6ba 100644
--- a/src/router_core/agent_route.h
+++ b/src/router_core/agent_route.h
@@ -28,7 +28,7 @@ void qdra_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_
 void qdra_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
                                 qd_field_iterator_t *identity);
 
-#define QDR_ROUTE_COLUMN_COUNT 12
+#define QDR_ROUTE_COLUMN_COUNT 9
 
 const char *qdr_route_columns[QDR_ROUTE_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_waypoint.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.c b/src/router_core/agent_waypoint.c
deleted file mode 100644
index aa5ec37..0000000
--- a/src/router_core/agent_waypoint.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "agent_waypoint.h"
-
-#define QDR_WAYPOINT_NAME         0
-#define QDR_WAYPOINT_ADDRESS      1
-#define QDR_WAYPOINT_CONNECTOR    2
-#define QDR_WAYPOINT_INPHASE      3
-#define QDR_WAYPOINT_OUTPHASE     4
-#define QDR_WAYPOINT_MODE         5
-
-#define QDR_WAYPOINT_COLUMN_COUNT  6
-
-static const char *qdr_waypoint_columns[] =
-    {"name",
-     "address",
-     "connector",
-     "inPhase",
-     "outPhase",
-     "mode",
-     0};
-
-static void qdr_insert_waypoint_columns_CT(qd_composed_field_t  *body,
-                                          int column_index)
-{
-    // TODO replace nulls with actual values.
-    switch(column_index) {
-        case QDR_WAYPOINT_NAME:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_ADDRESS:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_CONNECTOR:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_INPHASE:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_OUTPHASE:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_MODE:
-            qd_compose_insert_null(body);  // TEMP
-            break;
-
-        default:
-            qd_compose_insert_null(body);
-            break;
-    }
-
-}
-
-static void qdr_manage_write_response_map_CT(qd_composed_field_t *body)
-{
-    qd_compose_start_map(body);
-
-    for(int i = 0; i < QDR_WAYPOINT_COLUMN_COUNT; i++) {
-        qd_compose_insert_string(body, qdr_waypoint_columns[i]);
-        qdr_insert_waypoint_columns_CT(body, i);
-    }
-
-    qd_compose_end_map(body);
-}
-
-void qdra_waypoint_create_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query,
-                             qd_parsed_field_t   *in_body)
-{
-    // Get the map fields from the body
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *address_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[1]);
-        qd_parsed_field_t *connector_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[2]);
-        qd_parsed_field_t *inPhase_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[3]);
-        qd_parsed_field_t *outPhase_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[4]);
-        qd_parsed_field_t *mode_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[5]);
-
-        if ( address_field   &&
-             connector_field &&
-             inPhase_field   &&
-             outPhase_field  &&
-             mode_field) {
-            // TODO - Add code here that would actually create a waypoint.
-            // If the request was successful then the statusCode MUST be 201 (Created) and the body of the message
-            // MUST consist an amqp-value section that contains a Map containing the actual attributes of the entity created
-            qdr_manage_write_response_map_CT(query->body);
-            query->status = &QD_AMQP_CREATED;
-        }
-        else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-        }
-    }
-    else {
-        query->status = &QD_AMQP_BAD_REQUEST;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-
-
-}
-
-void qdra_waypoint_delete_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qd_field_iterator_t *identity,
-                             qdr_query_t          *query)
-{
-    bool success = true;
-
-    if (identity) {//If there is identity, ignore the name
-       //TOOD - do something here
-    }
-    else if (name) {
-       //TOOD - do something here
-    }
-    else {
-        query->status = &QD_AMQP_BAD_REQUEST;
-        success = false;
-    }
-
-
-    // TODO - Add more logic here.
-    if (success) {
-        // If the request was successful then the statusCode MUST be 204 (No Content).
-        query->status = &QD_AMQP_NO_CONTENT;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-void qdra_waypoint_update_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query)
-{
-
-}
-
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_waypoint.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.h b/src/router_core/agent_waypoint.h
deleted file mode 100644
index 7abc38f..0000000
--- a/src/router_core/agent_waypoint.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef qdr_agent_waypoint
-#define qdr_agent_waypoint 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "router_core_private.h"
-
-void qdra_waypoint_create_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query,
-                             qd_parsed_field_t   *in_body);
-
-void qdra_waypoint_delete_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qd_field_iterator_t *identity,
-                             qdr_query_t          *query);
-
-
-void qdra_waypoint_update_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query);
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 40e2aaf..37876d4 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -76,7 +76,6 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     conn->user_context          = 0;
     conn->incoming              = incoming;
     conn->role                  = role;
-    conn->label                 = label;
     conn->strip_annotations_in  = strip_annotations_in;
     conn->strip_annotations_out = strip_annotations_out;
     conn->mask_bit              = -1;
@@ -84,7 +83,8 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     DEQ_INIT(conn->work_list);
     conn->work_lock = sys_mutex();
 
-    action->args.connection.conn = conn;
+    action->args.connection.conn  = conn;
+    action->args.connection.label = label;
     qdr_action_enqueue(core, action);
 
     return conn;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index e8823b4..2ad0249 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -52,11 +52,14 @@ const char * const status_code = "statusCode";
 const char * MANAGEMENT_INTERNAL = "_local/$_management_internal";
 
 //TODO - Move these to amqp.h
-const unsigned char *MANAGEMENT_QUERY = (unsigned char*) "QUERY";
-const unsigned char *MANAGEMENT_CREATE = (unsigned char*) "CREATE";
-const unsigned char *MANAGEMENT_READ = (unsigned char*) "READ";
-const unsigned char *MANAGEMENT_UPDATE = (unsigned char*) "UPDATE";
-const unsigned char *MANAGEMENT_DELETE = (unsigned char*) "DELETE";
+const unsigned char *MANAGEMENT_QUERY                  = (unsigned char*) "QUERY";
+const unsigned char *MANAGEMENT_CREATE                 = (unsigned char*) "CREATE";
+const unsigned char *MANAGEMENT_READ                   = (unsigned char*) "READ";
+const unsigned char *MANAGEMENT_UPDATE                 = (unsigned char*) "UPDATE";
+const unsigned char *MANAGEMENT_DELETE                 = (unsigned char*) "DELETE";
+const unsigned char *MANAGEMENT_ADD_CONTAINER          = (unsigned char*) "ADD-CONTAINER";
+const unsigned char *MANAGEMENT_REMOVE_CONTAINER_CLEAN = (unsigned char*) "REMOVE-CONTAINER-CLEAN";
+const unsigned char *MANAGEMENT_REMOVE_CONTAINER_HARD  = (unsigned char*) "REMOVE-CONTAINER-HARD";
 
 
 typedef enum {
@@ -65,6 +68,9 @@ typedef enum {
     QD_ROUTER_OPERATION_READ,
     QD_ROUTER_OPERATION_UPDATE,
     QD_ROUTER_OPERATION_DELETE,
+    QD_ROUTER_OPERATION_ADD_CONTAINER,
+    QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN,
+    QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD
 } qd_router_operation_type_t;
 
 
@@ -153,7 +159,7 @@ static void qd_manage_response_handler(void *context, const qd_amqp_error_t *sta
     qd_management_context_t *ctx = (qd_management_context_t*) context;
 
     if (ctx->operation_type == QD_ROUTER_OPERATION_QUERY) {
-        if (status == &QD_AMQP_OK) { // There is no error, proceed to conditionally call get_next
+        if (status->status / 100 == 2) { // There is no error, proceed to conditionally call get_next
             if (more) {
                //If there are no more rows to process or the status returned is something other than
                // QD_AMQP_OK, we will close the list, send the message and
@@ -356,8 +362,6 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         *entity_type = QD_ROUTER_ADDRESS;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), link_entity_type))
         *entity_type = QD_ROUTER_LINK;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), waypoint_entity_type))
-        *entity_type = QD_ROUTER_WAYPOINT;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), route_entity_type))
         *entity_type = QD_ROUTER_ROUTE;
     else
@@ -379,6 +383,12 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         (*operation_type) = QD_ROUTER_OPERATION_UPDATE;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_DELETE))
         (*operation_type) = QD_ROUTER_OPERATION_DELETE;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_ADD_CONTAINER) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_ADD_CONTAINER;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_CLEAN) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_HARD) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD;
     else
         // This is an unknown operation type. cannot be handled, return false.
         return false;
@@ -423,22 +433,26 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
 
     if (qd_can_handle_request(app_properties_iter, &entity_type, &operation_type, &identity_iter, &name_iter, &count, &offset)) {
         switch (operation_type) {
-            case QD_ROUTER_OPERATION_QUERY:
-                qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset);
-                break;
-            case QD_ROUTER_OPERATION_CREATE:
-                qd_core_agent_create_handler(core, msg, entity_type, operation_type, name_iter);
-                break;
-            case QD_ROUTER_OPERATION_READ:
-                qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
-                break;
-            case QD_ROUTER_OPERATION_UPDATE:
-                qd_core_agent_update_handler();
-                break;
-            case QD_ROUTER_OPERATION_DELETE:
-                qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
-                break;
-       }
+        case QD_ROUTER_OPERATION_QUERY:
+            qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset);
+            break;
+        case QD_ROUTER_OPERATION_CREATE:
+            qd_core_agent_create_handler(core, msg, entity_type, operation_type, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_READ:
+            qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_UPDATE:
+            qd_core_agent_update_handler();
+            break;
+        case QD_ROUTER_OPERATION_DELETE:
+            qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_ADD_CONTAINER:
+        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN:
+        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD:
+            break;
+        }
     } else {
         //
         // The C management agent is not going to handle this request. Forward it off to Python.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
new file mode 100644
index 0000000..634c1d2
--- /dev/null
+++ b/src/router_core/route_control.c
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "route_control.h"
+
+ALLOC_DEFINE(qdr_route_active_t);
+ALLOC_DEFINE(qdr_route_config_t);
+ALLOC_DEFINE(qdr_conn_identifier_t);
+
+
+
+static const char *qdr_configure_address_prefix_CT(qdr_core_t              *core,
+                                                   qd_parsed_field_t       *addr_field,
+                                                   char                     cls,
+                                                   qd_address_treatment_t   treatment,
+                                                   qdr_address_config_t   **_addr)
+{
+    if (!addr_field)
+        return "Missing address field";
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_config_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr)
+        return "Address prefix conflicts with existing prefix";
+
+    addr = new_qdr_address_config_t();
+    DEQ_ITEM_INIT(addr);
+    addr->treatment = treatment;
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addr_config, addr);
+    }
+
+    *_addr = addr;
+    return 0;
+}
+
+/*
+static const char *qdr_configure_address_CT(qdr_core_t              *core,
+                                            qd_parsed_field_t       *addr_field,
+                                            char                     cls,
+                                            qd_address_treatment_t   treatment,
+                                            qdr_address_t          **_addr)
+{
+    if (!addr_field)
+        return "Missing address field";
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr)
+        return "Address conflicts with existing address";
+
+    addr = qdr_address_CT(core, treatment);
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addrs, addr);
+    }
+
+    *_addr = addr;
+    return 0;
+}
+*/
+
+const char *qdr_route_create_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qdr_route_path_t        path,
+                                qd_address_treatment_t  treatment,
+                                qd_parsed_field_t      *addr_field,
+                                qd_parsed_field_t      *route_addr_field,
+                                qdr_route_config_t    **_route)
+{
+    const char *error = 0;
+
+    qdr_route_config_t *route = new_qdr_route_config_t();
+    ZERO(route);
+
+    if (name)
+        route->name = (char*) qd_field_iterator_copy(name);
+    route->identity  = qdr_identifier(core);
+    route->path      = path;
+    route->treatment = treatment;
+
+    switch (path) {
+    case QDR_ROUTE_PATH_DIRECT:
+        error = qdr_configure_address_prefix_CT(core, addr_field, 'Z', treatment, &route->addr_config);
+        break;
+
+    case QDR_ROUTE_PATH_SOURCE:
+    case QDR_ROUTE_PATH_SINK:
+    case QDR_ROUTE_PATH_WAYPOINT:
+        break;
+    }
+
+    if (error) {
+        if (route->name) free(route->name);
+        free_qdr_route_config_t(route);
+    } else {
+        DEQ_INSERT_TAIL(core->route_config, route);
+        *_route = route;
+    }
+
+    return error;
+}
+
+
+void qdr_route_delete_CT(qdr_route_config_t *route)
+{
+}
+
+
+void qdr_route_connection_add_CT(qdr_route_config_t *route,
+                                 qd_parsed_field_t  *conn_id,
+                                 bool                is_container)
+{
+}
+
+
+void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+                                    qd_parsed_field_t  *conn_id,
+                                    bool                is_container)
+{
+}
+
+
+void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+                                  qd_parsed_field_t  *conn_id,
+                                  bool                is_container)
+{
+}
+
+
+void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn)
+{
+}
+
+
+void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
+{
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
new file mode 100644
index 0000000..7e86721
--- /dev/null
+++ b/src/router_core/route_control.h
@@ -0,0 +1,50 @@
+#ifndef qd_router_core_route_control
+#define qd_router_core_route_control 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+const char *qdr_route_create_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qdr_route_path_t        path,
+                                qd_address_treatment_t  treatment,
+                                qd_parsed_field_t      *addr_field,
+                                qd_parsed_field_t      *route_addr_field,
+                                qdr_route_config_t    **route);
+
+void qdr_route_delete_CT(qdr_route_config_t *route);
+
+void qdr_route_connection_add_CT(qdr_route_config_t *route,
+                                 qd_parsed_field_t  *conn_id,
+                                 bool                is_container);
+
+void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+                                    qd_parsed_field_t  *conn_id,
+                                    bool                is_container);
+
+void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+                                  qd_parsed_field_t  *conn_id,
+                                  bool                is_container);
+
+void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn);
+
+void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn);
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index db139a9..0529a84 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -171,7 +171,8 @@ void qdr_route_table_setup_CT(qdr_core_t *core)
 {
     DEQ_INIT(core->addrs);
     DEQ_INIT(core->routers);
-    core->addr_hash = qd_hash(10, 32, 0);
+    core->addr_hash    = qd_hash(12, 32, 0);
+    core->conn_id_hash = qd_hash(6, 4, 0);
 
     if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
         core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_TREATMENT_MULTICAST_FLOOD);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index d4a937d..4603555 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,7 +30,6 @@ ALLOC_DEFINE(qdr_link_t);
 ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
-ALLOC_DEFINE(qdr_route_t);
 
 static void qdr_general_handler(void *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/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 8dc2fac..e58e31d 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -33,7 +33,9 @@ typedef struct qdr_link_ref_t        qdr_link_ref_t;
 typedef struct qdr_lrp_t             qdr_lrp_t;
 typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
-typedef struct qdr_route_t           qdr_route_t;
+typedef struct qdr_route_config_t    qdr_route_config_t;
+typedef struct qdr_route_active_t    qdr_route_active_t;
+typedef struct qdr_conn_identifier_t qdr_conn_identifier_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
@@ -81,6 +83,7 @@ struct qdr_action_t {
         //
         struct {
             qdr_connection_t *conn;
+            const char       *label;
             qdr_link_t       *link;
             qdr_delivery_t   *delivery;
             qd_message_t     *msg;
@@ -147,7 +150,7 @@ struct qdr_query_t {
     qdr_field_t             *next_key;
     int                      next_offset;
     bool                     more;
-    const qd_amqp_error_t   *status;
+    qd_amqp_error_t          status;
 };
 
 ALLOC_DECLARE(qdr_query_t);
@@ -383,7 +386,7 @@ struct qdr_connection_t {
     void                       *user_context;
     bool                        incoming;
     qdr_connection_role_t       role;
-    const char                 *label;
+    qdr_conn_identifier_t      *conn_id;
     bool                        strip_annotations_in;
     bool                        strip_annotations_out;
     int                         mask_bit;
@@ -398,30 +401,55 @@ ALLOC_DECLARE(qdr_connection_t);
 DEQ_DECLARE(qdr_connection_t, qdr_connection_list_t);
 
 typedef enum {
-    QDR_ROUTE_TYPE_ADDRESS,
-    QDR_ROUTE_TYPE_LINK_DEST,
-    QDR_ROUTE_TYPE_WAYPOINT
-} qdr_route_type_t;
-
-struct qdr_route_t {
-    DEQ_LINKS(qdr_route_t);
-    char                   *name;
-    uint64_t                identity;
-    qdr_route_type_t        object_type;
-    qdr_address_config_t   *addr_config;
-    qdr_address_t          *addr;
-    qdr_address_t          *ingress_addr;
-    qdr_address_t          *egress_addr;
-    bool                    direction_in;
-    bool                    direction_out;
-    qd_address_treatment_t  treatment;
-    qd_address_treatment_t  ingress_treatment;
-    qd_address_treatment_t  egress_treatment;
-    char                   *connector_label;
+    QDR_ROUTE_PATH_DIRECT,
+    QDR_ROUTE_PATH_SOURCE,
+    QDR_ROUTE_PATH_SINK,
+    QDR_ROUTE_PATH_WAYPOINT
+} qdr_route_path_t;
+
+typedef enum {
+    QDR_ROUTE_STATE_DOWN,
+    QDR_ROUTE_STATE_UP,
+    QDR_ROUTE_STATE_QUIESCING
+} qdr_route_state_t;
+
+struct qdr_route_active_t {
+    DEQ_LINKS(qdr_route_active_t);
+    DEQ_LINKS_N(REF, qdr_route_active_t);
+    qdr_route_config_t    *config;
+    qdr_conn_identifier_t *conn_id;
+    qd_direction_t         dir;
+    qdr_route_state_t      state;
+    qdr_link_t            *link;
 };
 
-ALLOC_DECLARE(qdr_route_t);
-DEQ_DECLARE(qdr_route_t, qdr_route_list_t);
+ALLOC_DECLARE(qdr_route_active_t);
+DEQ_DECLARE(qdr_route_active_t, qdr_route_active_list_t);
+
+struct qdr_route_config_t {
+    DEQ_LINKS(qdr_route_config_t);
+    char                    *name;
+    uint64_t                 identity;
+    qdr_route_path_t         path;
+    qdr_address_config_t    *addr_config;
+    qdr_address_t           *addr;
+    qdr_address_t           *ingress_addr;
+    qdr_address_t           *egress_addr;
+    qd_address_treatment_t   treatment;
+
+    qdr_route_active_list_t  active_list;
+};
+
+ALLOC_DECLARE(qdr_route_config_t);
+DEQ_DECLARE(qdr_route_config_t, qdr_route_config_list_t);
+
+struct qdr_conn_identifier_t {
+    qd_hash_handle_t        *hash_handle;
+    qdr_connection_t        *open_connection;
+    qdr_route_active_list_t  active_refs;
+};
+
+ALLOC_DECLARE(qdr_conn_identifier_t);
 
 
 struct qdr_core_t {
@@ -437,7 +465,7 @@ struct qdr_core_t {
     qdr_general_work_list_t  work_list;
     qd_timer_t              *work_timer;
 
-    qdr_route_list_t      routes;
+    qdr_route_config_list_t  route_config;
 
     qdr_connection_list_t open_connections;
     qdr_link_list_t       open_links;
@@ -498,6 +526,8 @@ struct qdr_core_t {
     uint64_t              next_identifier;
     sys_mutex_t          *id_lock;
 
+    qd_hash_t            *conn_id_hash;
+
     qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
 };
 


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


[33/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Implemented auto-link activation, added deprecation warnings to old configs.

Posted by tr...@apache.org.
DISPATCH-179 - Implemented auto-link activation, added deprecation warnings to old configs.


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

Branch: refs/heads/master
Commit: c8f2c9df1b16a3f87991f049aed0f164477809c6
Parents: 2aa0e26
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 17:16:30 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 17:16:30 2016 -0400

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json |  12 ++-
 src/router_config.c                           |  22 ++++-
 src/router_core/agent_config_auto_link.c      |  32 ++++++-
 src/router_core/agent_config_auto_link.h      |   2 +-
 src/router_core/connections.c                 |  70 +++++++++-----
 src/router_core/route_control.c               | 102 ++++++++++++++++++---
 src/router_core/route_control.h               |  14 +--
 src/router_core/router_core_private.h         |  20 ++++
 src/router_node.c                             |   3 +
 9 files changed, 229 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 61d3642..6f70fe9 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -945,7 +945,17 @@
                 },
                 "linkRef": {
                     "type": "string",
-                    "description": "Reference to the org.apache.qpid.dispatch.router.link if the link is attached",
+                    "description": "Reference to the org.apache.qpid.dispatch.router.link if the link exists",
+                    "create": false
+                },
+                "operStatus": {
+                    "type": ["inactive", "attaching", "failed", "active", "quiescing", "idle"],
+                    "description": "The operational status of this autoLink: inactive - The remote container is not connected; attaching - the link is attaching to the remote node; failed - the link attach failed; active - the link is attached and operational; quiescing - the link is transitioning to idle state; idle - the link is attached but there are no deliveries flowing and no unsettled deliveries.",
+                    "create": false
+                },
+                "lastError": {
+                    "type": "string",
+                    "description": "The error description from the last attach failure",
                     "create": false
                 }
             }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 202ee9f..c6963e8 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -29,6 +29,12 @@
 
 qd_error_t qd_router_configure_fixed_address(qd_router_t *router, qd_entity_t *entity)
 {
+    static bool deprecate_warning = true;
+    if (deprecate_warning) {
+        deprecate_warning = false;
+        qd_log(router->log_source, QD_LOG_WARNING, "fixedAddress configuration is deprecated, switch to using address instead.");
+    }
+
     qd_error_clear();
     int                             phase  = qd_entity_opt_long(entity, "phase", -1); QD_ERROR_RET();
     qd_schema_fixedAddress_fanout_t fanout = qd_entity_get_long(entity, "fanout");    QD_ERROR_RET();
@@ -63,7 +69,7 @@ qd_error_t qd_router_configure_fixed_address(qd_router_t *router, qd_entity_t *e
     }
 
     //
-    // Formulate this configuration as a router.route and create it through the core management API.
+    // Formulate this configuration as a router.config.address and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
@@ -97,6 +103,12 @@ qd_error_t qd_router_configure_fixed_address(qd_router_t *router, qd_entity_t *e
 
 qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity)
 {
+    static bool deprecate_warning = true;
+    if (deprecate_warning) {
+        deprecate_warning = false;
+        qd_log(router->log_source, QD_LOG_WARNING, "waypoint configuration is deprecated, switch to using autoLink instead.");
+    }
+
     /*
     char *address = qd_entity_get_string(entity, "address"); QD_ERROR_RET();
     char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
@@ -131,7 +143,7 @@ qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity
 static void qd_router_add_link_route(qdr_core_t *core, const char *prefix, const char *connector, const char* dir)
 {
     //
-    // Formulate this configuration as a router.route and create it through the core management API.
+    // Formulate this configuration as a router.config.linkRoute and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
@@ -169,6 +181,12 @@ static void qd_router_add_link_route(qdr_core_t *core, const char *prefix, const
 
 qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 {
+    static bool deprecate_warning = true;
+    if (deprecate_warning) {
+        deprecate_warning = false;
+        qd_log(router->log_source, QD_LOG_WARNING, "linkRoutePrefix configuration is deprecated, switch to using linkRoute instead.");
+    }
+
     char *prefix    = qd_entity_get_string(entity, "prefix");    QD_ERROR_RET();
     char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
     char *direction = qd_entity_get_string(entity, "dir");       QD_ERROR_RET();

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_core/agent_config_auto_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.c b/src/router_core/agent_config_auto_link.c
index 6f8ef8a..b18fb90 100644
--- a/src/router_core/agent_config_auto_link.c
+++ b/src/router_core/agent_config_auto_link.c
@@ -31,6 +31,8 @@
 #define QDR_CONFIG_AUTO_LINK_CONNECTION    6
 #define QDR_CONFIG_AUTO_LINK_CONTAINER_ID  7
 #define QDR_CONFIG_AUTO_LINK_LINK_REF      8
+#define QDR_CONFIG_AUTO_LINK_OPER_STATUS   9
+#define QDR_CONFIG_AUTO_LINK_LAST_ERROR    10
 
 const char *qdr_config_auto_link_columns[] =
     {"name",
@@ -39,9 +41,11 @@ const char *qdr_config_auto_link_columns[] =
      "addr",
      "dir",
      "phase",
-     "containerId",
      "connection",
+     "containerId",
      "linkRef",
+     "operStatus",
+     "lastError",
      0};
 
 
@@ -110,6 +114,30 @@ static void qdr_config_auto_link_insert_column_CT(qdr_auto_link_t *al, int col,
             qd_compose_insert_string(body, id_str);
         } else
             qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_OPER_STATUS:
+        switch (al->state) {
+        case QDR_AUTO_LINK_STATE_INACTIVE:  text = "inactive";  break;
+        case QDR_AUTO_LINK_STATE_ATTACHING: text = "attaching"; break;
+        case QDR_AUTO_LINK_STATE_FAILED:    text = "failed";    break;
+        case QDR_AUTO_LINK_STATE_ACTIVE:    text = "active";    break;
+        case QDR_AUTO_LINK_STATE_QUIESCING: text = "quiescing"; break;
+        case QDR_AUTO_LINK_STATE_IDLE:      text = "idle";      break;
+        }
+
+        if (text)
+            qd_compose_insert_string(body, text);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_AUTO_LINK_LAST_ERROR:
+        if (al->last_error)
+            qd_compose_insert_string(body, al->last_error);
+        else
+            qd_compose_insert_null(body);
+        break;
     }
 }
 
@@ -362,7 +390,7 @@ void qdra_config_auto_link_create_CT(qdr_core_t          *core,
         bool               is_container = !!container_field;
         qd_parsed_field_t *in_use_conn  = is_container ? container_field : connection_field;
 
-        qdr_route_add_auto_link_CT(core, name, addr_field, dir, phase, in_use_conn, is_container);
+        al = qdr_route_add_auto_link_CT(core, name, addr_field, dir, phase, in_use_conn, is_container);
 
         //
         // Compose the result map for the response.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_core/agent_config_auto_link.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.h b/src/router_core/agent_config_auto_link.h
index 578d402..e1a433f 100644
--- a/src/router_core/agent_config_auto_link.h
+++ b/src/router_core/agent_config_auto_link.h
@@ -28,7 +28,7 @@ void qdra_config_auto_link_update_CT(qdr_core_t *core, qdr_query_t *query, qd_pa
 void qdra_config_auto_link_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
                                      qd_field_iterator_t *identity);
 
-#define QDR_CONFIG_AUTO_LINK_COLUMN_COUNT 9
+#define QDR_CONFIG_AUTO_LINK_COLUMN_COUNT 11
 
 const char *qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 45d7920..fbce669 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -434,12 +434,12 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, qdr_connection_t *conn, qdr_li
 }
 
 
-static qdr_link_t *qdr_create_link_CT(qdr_core_t       *core,
-                                      qdr_connection_t *conn,
-                                      qd_link_type_t    link_type,
-                                      qd_direction_t    dir,
-                                      qdr_terminus_t   *source,
-                                      qdr_terminus_t   *target)
+qdr_link_t *qdr_create_link_CT(qdr_core_t       *core,
+                               qdr_connection_t *conn,
+                               qd_link_type_t    link_type,
+                               qd_direction_t    dir,
+                               qdr_terminus_t   *source,
+                               qdr_terminus_t   *target)
 {
     //
     // Create a new link, initiated by the router core.  This will involve issuing a first-attach outbound.
@@ -530,7 +530,7 @@ static char qdr_prefix_for_dir(qd_direction_t dir)
 }
 
 
-static qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter)
+qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter)
 {
     qdr_address_config_t *addr = 0;
 
@@ -985,6 +985,17 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
         qdr_link_issue_credit_CT(core, link, link->capacity);
         switch (link->link_type) {
         case QD_LINK_ENDPOINT:
+            if (link->auto_link) {
+                //
+                // This second-attach is the completion of an auto-link.  If the attach
+                // has a valid source, transition the auto-link to the "active" state.
+                //
+                if (qdr_terminus_get_address(source)) {
+                    link->auto_link->state = QDR_AUTO_LINK_STATE_ACTIVE;
+                    qdr_add_link_ref(&link->auto_link->addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+                    link->owning_addr = link->auto_link->addr;
+                }
+            }
             break;
 
         case QD_LINK_WAYPOINT:
@@ -1002,6 +1013,22 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
         //
         switch (link->link_type) {
         case QD_LINK_ENDPOINT:
+            if (link->auto_link) {
+                //
+                // This second-attach is the completion of an auto-link.  If the attach
+                // has a valid target, transition the auto-link to the "active" state.
+                //
+                if (qdr_terminus_get_address(target)) {
+                    link->auto_link->state = QDR_AUTO_LINK_STATE_ACTIVE;
+                    qdr_add_link_ref(&link->auto_link->addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+                    link->owning_addr = link->auto_link->addr;
+                    if (DEQ_SIZE(link->auto_link->addr->rlinks) == 1) {
+                        const char *key = (const char*) qd_hash_key_by_handle(link->auto_link->addr->hash_handle);
+                        if (key && *key == 'M')
+                            qdr_post_mobile_added_CT(core, key);
+                    }
+                }
+            }
             break;
 
         case QD_LINK_WAYPOINT:
@@ -1055,13 +1082,21 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
     link->detach_count++;
 
     //
-    // TODO - For routed links, propagate the detach
+    // For routed links, propagate the detach
     //
     if (link->connected_link) {
         qdr_link_outbound_detach_CT(core, link->connected_link, error, QDR_CONDITION_NONE);
         return;
     }
 
+    //
+    // For auto links, switch the auto link to failed state and record the error
+    //
+    if (link->auto_link) {
+        link->auto_link->state = QDR_AUTO_LINK_STATE_FAILED;
+        // TODO - last_error
+    }
+
     link->owning_addr = 0;
 
     if (link->link_direction == QD_INCOMING) {
@@ -1110,6 +1145,10 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
         }
     }
 
+    //
+    // TODO - If this link is owned by an auto_link, handle the unexpected detach.
+    //
+
     if (link->detach_count == 1) {
         //
         // If the detach occurred via protocol, send a detach back.
@@ -1127,21 +1166,6 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
     //
     if (addr)
         qdr_check_addr_CT(core, addr, was_local);
-
-    //
-    // Cases to be handled:
-    //
-    // Link is link-routed:
-    //    Propagate the detach along the link-chain
-    // Link is half-detached and not link-routed:
-    //    Issue a detach back to the originating node
-    // Link is fully detached:
-    //    Free the qdr_link object
-    //    Remove any address linkages associated with this link
-    //       If the last dest for a local address is lost, notify the router (mobile_removed)
-    // Link is a router-control link:
-    //    Issue a link-lost indication to the router
-    //
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 88a1e93..54f4573 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -69,7 +69,7 @@ static void qdr_route_log_CT(qdr_core_t *core, const char *text, const char *nam
         snprintf(id_string, 64, "%ld", id);
 
     qd_log(core->log, QD_LOG_INFO, "%s '%s' on %s %s",
-           log_name, text, key[0] == 'L' ? "connection" : "container", &key[1]);
+           text, log_name, key[0] == 'L' ? "connection" : "container", &key[1]);
 }
 
 
@@ -77,7 +77,7 @@ static void qdr_link_route_activate_CT(qdr_core_t *core, qdr_link_route_t *lr, q
 {
     const char *key;
 
-    qdr_route_log_CT(core, "Activated Link Route", lr->name, lr->identity, conn);
+    qdr_route_log_CT(core, "Link Route Activated", lr->name, lr->identity, conn);
 
     //
     // Activate the address for link-routed destinations.  If this is the first
@@ -98,7 +98,7 @@ static void qdr_link_route_deactivate_CT(qdr_core_t *core, qdr_link_route_t *lr,
 {
     const char *key;
 
-    qdr_route_log_CT(core, "Deactivated Link Route", lr->name, lr->identity, conn);
+    qdr_route_log_CT(core, "Link Route Deactivated", lr->name, lr->identity, conn);
 
     //
     // Deactivate the address(es) for link-routed destinations.
@@ -114,6 +114,42 @@ static void qdr_link_route_deactivate_CT(qdr_core_t *core, qdr_link_route_t *lr,
 }
 
 
+static void qdr_auto_link_activate_CT(qdr_core_t *core, qdr_auto_link_t *al, qdr_connection_t *conn)
+{
+    const char *key;
+
+    qdr_route_log_CT(core, "Auto Link Activated", al->name, al->identity, conn);
+
+    //
+    // Activate the link for an auto_link.  If this is the first activation for this
+    // address, notify the router module of the added address.
+    //
+    if (al->addr) {
+        qdr_terminus_t *source = 0;
+        qdr_terminus_t *target = 0;
+        qdr_terminus_t *term   = qdr_terminus(0);
+
+        if (al->dir == QD_INCOMING)
+            source = term;
+        else
+            target = term;
+
+        key = (const char*) qd_hash_key_by_handle(al->addr->hash_handle);
+        if (key) {
+            qdr_terminus_set_address(term, &key[2]); // truncate the "Mp" annotation (where p = phase)
+            al->link = qdr_create_link_CT(core, conn, QD_LINK_ENDPOINT, al->dir, source, target);
+            al->link->auto_link = al;
+            al->state = QDR_AUTO_LINK_STATE_ATTACHING;
+        }
+    }
+}
+
+
+static void qdr_auto_link_deactivate_CT(qdr_core_t *core, qdr_auto_link_t *al, qdr_connection_t *conn)
+{
+}
+
+
 void qdr_route_add_link_route_CT(qdr_core_t             *core,
                                  qd_field_iterator_t    *name,
                                  qd_parsed_field_t      *prefix_field,
@@ -169,14 +205,56 @@ void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr)
 }
 
 
-void qdr_route_add_auto_link_CT(qdr_core_t             *core,
-                                qd_field_iterator_t    *name,
-                                qd_parsed_field_t      *addr_field,
-                                qd_direction_t          dir,
-                                int                     phase,
-                                qd_parsed_field_t      *conn_id,
-                                bool                    is_container)
+qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
+                                            qd_field_iterator_t *name,
+                                            qd_parsed_field_t   *addr_field,
+                                            qd_direction_t       dir,
+                                            int                  phase,
+                                            qd_parsed_field_t   *conn_id,
+                                            bool                 is_container)
 {
+    qdr_auto_link_t *al = new_qdr_auto_link_t();
+
+    //
+    // Set up the link_route structure
+    //
+    ZERO(al);
+    al->identity = qdr_identifier(core);
+    al->name     = name ? (char*) qd_field_iterator_copy(name) : 0;
+    al->dir      = dir;
+    al->phase    = phase;
+    al->state    = QDR_AUTO_LINK_STATE_INACTIVE;
+
+    //
+    // Find or create an address for the auto_link destination
+    //
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+    qd_address_iterator_set_phase(iter, (char) phase + '0');
+
+    qd_hash_retrieve(core->addr_hash, iter, (void*) &al->addr);
+    if (!al->addr) {
+        al->addr = qdr_address_CT(core, qdr_treatment_for_address_CT(core, iter));
+        DEQ_INSERT_TAIL(core->addrs, al->addr);
+        qd_hash_insert(core->addr_hash, iter, al->addr, &al->addr->hash_handle);
+    }
+
+    //
+    // Find or create a connection identifier structure for this auto_link
+    //
+    if (conn_id) {
+        al->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
+        DEQ_INSERT_TAIL_N(REF, al->conn_id->auto_link_refs, al);
+        if (al->conn_id->open_connection)
+            qdr_auto_link_activate_CT(core, al, al->conn_id->open_connection);
+    }
+
+    //
+    // Add the auto_link to the core list
+    //
+    DEQ_INSERT_TAIL(core->auto_links, al);
+
+    return al;
 }
 
 
@@ -213,7 +291,7 @@ void qdr_route_connection_opened_CT(qdr_core_t       *core,
     //
     qdr_auto_link_t *al = DEQ_HEAD(cid->auto_link_refs);
     while (al) {
-        //qdr_link_route_activate_CT(core, lr, conn);
+        qdr_auto_link_activate_CT(core, al, conn);
         al = DEQ_NEXT_N(REF, al);
     }
 }
@@ -240,7 +318,7 @@ void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
         //
         qdr_auto_link_t *al = DEQ_HEAD(cid->auto_link_refs);
         while (al) {
-            //qdr_link_route_deactivate_CT(core, lr, conn);
+            qdr_auto_link_deactivate_CT(core, al, conn);
             al = DEQ_NEXT_N(REF, al);
         }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index 7738c6d..34b8bd9 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -31,13 +31,13 @@ void qdr_route_add_link_route_CT(qdr_core_t             *core,
 
 void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr);
 
-void qdr_route_add_auto_link_CT(qdr_core_t             *core,
-                                qd_field_iterator_t    *name,
-                                qd_parsed_field_t      *addr_field,
-                                qd_direction_t          dir,
-                                int                     phase,
-                                qd_parsed_field_t      *conn_id,
-                                bool                    is_container);
+qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t             *core,
+                                            qd_field_iterator_t    *name,
+                                            qd_parsed_field_t      *addr_field,
+                                            qd_direction_t          dir,
+                                            int                     phase,
+                                            qd_parsed_field_t      *conn_id,
+                                            bool                    is_container);
 
 void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *auto_link);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/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 28e4aef..6956b67 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -228,6 +228,7 @@ struct qdr_link_t {
     qdr_address_t           *owning_addr;        ///< [ref] Address record that owns this link
     qdr_link_t              *connected_link;     ///< [ref] If this is a link-route, reference the connected link
     qdr_link_ref_t          *ref[QDR_LINK_LIST_CLASSES];  ///< Pointers to containing reference objects
+    qdr_auto_link_t         *auto_link;          ///< [ref] Auto_link that owns this link
     qdr_delivery_list_t      undelivered;        ///< Deliveries to be forwarded or sent
     qdr_delivery_list_t      unsettled;          ///< Unsettled deliveries
     qdr_delivery_ref_list_t  updated_deliveries; ///< References to deliveries (in the unsettled list) with updates.
@@ -417,6 +418,15 @@ ALLOC_DECLARE(qdr_link_route_t);
 DEQ_DECLARE(qdr_link_route_t, qdr_link_route_list_t);
 
 
+typedef enum {
+    QDR_AUTO_LINK_STATE_INACTIVE,
+    QDR_AUTO_LINK_STATE_ATTACHING,
+    QDR_AUTO_LINK_STATE_FAILED,
+    QDR_AUTO_LINK_STATE_ACTIVE,
+    QDR_AUTO_LINK_STATE_QUIESCING,
+    QDR_AUTO_LINK_STATE_IDLE
+} qdr_auto_link_state_t;
+
 struct qdr_auto_link_t {
     DEQ_LINKS(qdr_auto_link_t);
     DEQ_LINKS_N(REF, qdr_auto_link_t);
@@ -427,6 +437,8 @@ struct qdr_auto_link_t {
     qd_direction_t         dir;
     qdr_conn_identifier_t *conn_id;
     qdr_link_t            *link;
+    qdr_auto_link_state_t  state;
+    char                  *last_error;
 };
 
 ALLOC_DECLARE(qdr_auto_link_t);
@@ -550,11 +562,19 @@ void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr, bool was_local);
 qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *peer, qdr_link_t *link, qd_message_t *msg);
 void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv);
 void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
+qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter);
 
 void qdr_connection_enqueue_work_CT(qdr_core_t            *core,
                                     qdr_connection_t      *conn,
                                     qdr_connection_work_t *work);
 
+qdr_link_t *qdr_create_link_CT(qdr_core_t       *core,
+                               qdr_connection_t *conn,
+                               qd_link_type_t    link_type,
+                               qd_direction_t    dir,
+                               qdr_terminus_t   *source,
+                               qdr_terminus_t   *target);
+
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c8f2c9df/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 5d70cb9..3a9b8af 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -65,6 +65,9 @@ static void qd_router_connection_get_config(const qd_connection_t  *conn,
             *role = QDR_ROLE_NORMAL;
 
         *name = cf->name;
+        if (strncmp("listener/", *name, 9) == 0 ||
+            strncmp("connector/", *name, 10) == 0)
+            *name = 0;
     }
 }
 


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


[09/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - WIP for the route-control module.

Posted by tr...@apache.org.
DISPATCH-179 - WIP for the route-control module.


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

Branch: refs/heads/master
Commit: f5f10ba8cf787cb5722b0be26cb32faef90d84b4
Parents: e9da4b7
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 3 13:01:29 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 3 13:01:29 2016 -0500

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json |   6 +
 src/connection_manager.c                      |   9 +-
 src/router_core/agent_route.c                 |   4 +-
 src/router_core/connections.c                 |  31 +++--
 src/router_core/route_control.c               | 127 ++++++++++++++++++++-
 src/router_core/route_control.h               |  16 ++-
 src/router_core/router_core_private.h         |   2 +-
 tests/field_test.c                            |   7 +-
 8 files changed, 173 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 83d9d52..14a087a 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -37,6 +37,12 @@
                     "default": "normal",
                     "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection.  In the inter-router role, the connection is assumed to be to another router in the network.  Inter-router discovery and routing protocols can only be used over inter-router connections.",
                     "create": true
+                },
+                "label": {
+                    "type": "string",
+                    "create": true,
+                    "required": false,
+                    "description": "When the role is 'route-container', this optional label may be used to identify connections for use in routes."
                 }
             }
         },

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/src/connection_manager.c
----------------------------------------------------------------------
diff --git a/src/connection_manager.c b/src/connection_manager.c
index d432f64..31e2fad 100644
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@ -141,7 +141,7 @@ static qd_error_t load_server_config(qd_dispatch_t *qd, qd_server_config_t *conf
     memset(config, 0, sizeof(*config));
     config->host            = qd_entity_get_string(entity, "addr"); CHECK();
     config->port            = qd_entity_get_string(entity, "port"); CHECK();
-    config->label           = qd_entity_get_string(entity, "name"); CHECK();
+    config->label           = qd_entity_opt_string(entity, "label", 0); CHECK();
     config->role            = qd_entity_get_string(entity, "role"); CHECK();
     config->max_frame_size  = qd_entity_get_long(entity, "maxFrameSize"); CHECK();
     config->idle_timeout_seconds = qd_entity_get_long(entity, "idleTimeoutSeconds"); CHECK();
@@ -207,10 +207,11 @@ qd_error_t qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_entity_t *entit
     if (load_server_config(qd, &cc->configuration, entity))
         return qd_error_code();
     DEQ_ITEM_INIT(cc);
-    if (strcmp(cc->configuration.role, "on-demand") == 0) {
+    if (strcmp(cc->configuration.role, "route-container") == 0) {
         DEQ_INSERT_TAIL(cm->on_demand_connectors, cc);
-        qd_log(cm->log_source, QD_LOG_INFO, "Configured on-demand connector: %s:%s label=%s",
-               cc->configuration.host, cc->configuration.port, cc->configuration.label);
+        qd_log(cm->log_source, QD_LOG_INFO, "Configured route-container connector: %s:%s label=%s",
+               cc->configuration.host, cc->configuration.port,
+               cc->configuration.label ? cc->configuration.label : "<none>");
     } else {
         DEQ_INSERT_TAIL(cm->config_connectors, cc);
         qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index 7024a86..acf397b 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -282,7 +282,7 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
             uint32_t count = qd_parse_sub_count(conn_field);
             for (uint32_t i = 0; i < count; i++) {
                 qd_parsed_field_t *conn_label = qd_parse_sub_value(conn_field, i);
-                qdr_route_connection_add_CT(route, conn_label, false);
+                qdr_route_connection_add_CT(core, route, conn_label, false);
             }
         }
 
@@ -293,7 +293,7 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
             uint32_t count = qd_parse_sub_count(cont_field);
             for (uint32_t i = 0; i < count; i++) {
                 qd_parsed_field_t *cont_id = qd_parse_sub_value(cont_field, i);
-                qdr_route_connection_add_CT(route, cont_id, true);
+                qdr_route_connection_add_CT(core, route, cont_id, true);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 58606cf..923114f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -18,6 +18,7 @@
  */
 
 #include "router_core_private.h"
+#include "route_control.h"
 #include <qpid/dispatch/amqp.h>
 #include <stdio.h>
 
@@ -84,9 +85,9 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     DEQ_INIT(conn->work_list);
     conn->work_lock = sys_mutex();
 
-    action->args.connection.conn         = conn;
-    action->args.connection.label        = label;
-    action->args.connection.container_id = qdr_field(remote_container_id);
+    action->args.connection.conn             = conn;
+    action->args.connection.connection_label = qdr_field(label);
+    action->args.connection.container_id     = qdr_field(remote_container_id);
     qdr_action_enqueue(core, action);
 
     return conn;
@@ -725,13 +726,24 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
             }
         }
 
-        //
-        // If the role is ON_DEMAND:
-        //    Activate waypoints associated with this connection
-        //    Activate link-route destinations associated with this connection
-        //
+        if (conn->role == QDR_ROLE_ROUTE_CONTAINER) {
+            //
+            // Notify the route-control module that a route-container connection has opened.
+            // There may be routes that need to be activated due to the opening of this connection.
+            //
+
+            //
+            // If there's a connection label, use it as the identifier.  Otherwise, use the remote
+            // container id.
+            //
+            qdr_field_t *cid = action->args.connection.connection_label ?
+                action->args.connection.connection_label : action->args.connection.container_id;
+            if (cid)
+                qdr_route_connection_opened_CT(core, conn, cid, action->args.connection.connection_label == 0);
+        }
     }
 
+    qdr_field_free(action->args.connection.connection_label);
     qdr_field_free(action->args.connection.container_id);
 }
 
@@ -744,8 +756,9 @@ static void qdr_connection_closed_CT(qdr_core_t *core, qdr_action_t *action, boo
     qdr_connection_t *conn = action->args.connection.conn;
 
     //
-    // TODO - Deactivate waypoints and link-route destinations for this connection
+    // Deactivate routes associated with this connection
     //
+    qdr_route_connection_closed_CT(core, conn);
 
     //
     // TODO - Clean up links associated with this connection

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index b75f22ee..b72c535 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -18,6 +18,7 @@
  */
 
 #include "route_control.h"
+#include <stdio.h>
 
 ALLOC_DEFINE(qdr_route_active_t);
 ALLOC_DEFINE(qdr_route_config_t);
@@ -98,6 +99,49 @@ static void qdr_route_free_CT(qdr_core_t *core, qdr_route_config_t *route)
 }
 
 
+static qdr_conn_identifier_t *qdr_route_declare_id_CT(qdr_core_t          *core,
+                                                      qd_field_iterator_t *conn_id,
+                                                      bool                 is_container)
+{
+    char                   prefix = is_container ? 'C' : 'L';
+    qdr_conn_identifier_t *cid    = 0;
+
+    qd_address_iterator_reset_view(conn_id, ITER_VIEW_ADDRESS_HASH);
+    qd_address_iterator_override_prefix(conn_id, prefix);
+
+    qd_hash_retrieve(core->conn_id_hash, conn_id, (void**) &cid);
+    if (!cid) {
+        cid = new_qdr_conn_identifier_t();
+        ZERO(cid);
+        qd_hash_insert(core->conn_id_hash, conn_id, cid, &cid->hash_handle);
+    }
+
+    return cid;
+}
+
+static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identifier_t *cid)
+{
+    //
+    // If this connection identifier has no open connection and no referencing routes,
+    // it can safely be deleted and removed from the hash index.
+    //
+    if (cid->open_connection == 0 && DEQ_IS_EMPTY(cid->active_refs)) {
+        qd_hash_remove_by_handle(core->conn_id_hash, cid->hash_handle);
+        free_qdr_conn_identifier_t(cid);
+    }
+}
+
+
+static void qdr_route_activate_CT(qdr_core_t *core, qdr_route_active_t *active)
+{
+}
+
+
+static void qdr_route_deactivate_CT(qdr_core_t *core, qdr_route_active_t *active)
+{
+}
+
+
 const char *qdr_route_create_CT(qdr_core_t             *core,
                                 qd_field_iterator_t    *name,
                                 qdr_route_path_t        path,
@@ -151,38 +195,111 @@ const char *qdr_route_create_CT(qdr_core_t             *core,
 }
 
 
-void qdr_route_delete_CT(qdr_route_config_t *route)
+void qdr_route_delete_CT(qdr_core_t *core, qdr_route_config_t *route)
 {
 }
 
 
-void qdr_route_connection_add_CT(qdr_route_config_t *route,
+void qdr_route_connection_add_CT(qdr_core_t         *core,
+                                 qdr_route_config_t *route,
                                  qd_parsed_field_t  *conn_id,
                                  bool                is_container)
 {
+    //
+    // Create a new active record for this route+connection and get a connection identifier
+    // record (find and existing one or create a new one).
+    //
+    qdr_route_active_t    *active = new_qdr_route_active_t();
+    qdr_conn_identifier_t *cid    = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
+
+    //
+    // Initialize the active record in the DOWN state.
+    //
+    DEQ_ITEM_INIT(active);
+    DEQ_ITEM_INIT_N(REF, active);
+    active->in_state  = QDR_ROUTE_STATE_DOWN;
+    active->out_state = QDR_ROUTE_STATE_DOWN;
+    active->in_link   = 0;
+    active->out_link  = 0;
+
+    //
+    // Create the linkages between the route-config, active, and connection-identifier.
+    //
+    active->config  = route;
+    active->conn_id = cid;
+
+    DEQ_INSERT_TAIL(route->active_list, active);
+    DEQ_INSERT_TAIL_N(REF, cid->active_refs, active);
+
+    //
+    // If the connection identifier represents an already open connection, activate the route.
+    //
+    if (cid->open_connection)
+        qdr_route_activate_CT(core, active);
 }
 
 
-void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+void qdr_route_connection_delete_CT(qdr_core_t         *core,
+                                    qdr_route_config_t *route,
                                     qd_parsed_field_t  *conn_id,
                                     bool                is_container)
 {
 }
 
 
-void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+void qdr_route_connection_kill_CT(qdr_core_t         *core,
+                                  qdr_route_config_t *route,
                                   qd_parsed_field_t  *conn_id,
                                   bool                is_container)
 {
 }
 
 
-void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn)
+void qdr_route_connection_opened_CT(qdr_core_t       *core,
+                                    qdr_connection_t *conn,
+                                    qdr_field_t      *field,
+                                    bool              is_container)
 {
+    if (conn->role != QDR_ROLE_ROUTE_CONTAINER || !field)
+        return;
+
+    qdr_conn_identifier_t *cid = qdr_route_declare_id_CT(core, field->iterator, is_container);
+
+    assert(!cid->open_connection);
+    cid->open_connection = conn;
+    conn->conn_id        = cid;
+
+    //
+    // Activate all routes associated with this remote container.
+    //
+    qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
+    while (active) {
+        qdr_route_activate_CT(core, active);
+        active = DEQ_NEXT_N(REF, active);
+    }
 }
 
 
 void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
 {
+    if (conn->role != QDR_ROLE_ROUTE_CONTAINER)
+        return;
+
+    qdr_conn_identifier_t *cid = conn->conn_id;
+    if (cid) {
+        //
+        // De-activate all routes associated with this remote container.
+        //
+        qdr_route_active_t *active = DEQ_HEAD(cid->active_refs);
+        while (active) {
+            qdr_route_deactivate_CT(core, active);
+            active = DEQ_NEXT_N(REF, active);
+        }
+
+        cid->open_connection = 0;
+        conn->conn_id        = 0;
+
+        qdr_route_check_id_for_deletion_CT(core, cid);
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index 7e86721..53e1758 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -29,21 +29,27 @@ const char *qdr_route_create_CT(qdr_core_t             *core,
                                 qd_parsed_field_t      *route_addr_field,
                                 qdr_route_config_t    **route);
 
-void qdr_route_delete_CT(qdr_route_config_t *route);
+void qdr_route_delete_CT(qdr_core_t *core, qdr_route_config_t *route);
 
-void qdr_route_connection_add_CT(qdr_route_config_t *route,
+void qdr_route_connection_add_CT(qdr_core_t         *core,
+                                 qdr_route_config_t *route,
                                  qd_parsed_field_t  *conn_id,
                                  bool                is_container);
 
-void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+void qdr_route_connection_delete_CT(qdr_core_t         *core,
+                                    qdr_route_config_t *route,
                                     qd_parsed_field_t  *conn_id,
                                     bool                is_container);
 
-void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+void qdr_route_connection_kill_CT(qdr_core_t         *core,
+                                  qdr_route_config_t *route,
                                   qd_parsed_field_t  *conn_id,
                                   bool                is_container);
 
-void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn);
+void qdr_route_connection_opened_CT(qdr_core_t       *core,
+                                    qdr_connection_t *conn,
+                                    qdr_field_t      *field,
+                                    bool              is_container);
 
 void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/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 f6de278..84fb8d8 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -83,7 +83,7 @@ struct qdr_action_t {
         //
         struct {
             qdr_connection_t *conn;
-            const char       *label;
+            qdr_field_t      *connection_label;
             qdr_field_t      *container_id;
             qdr_link_t       *link;
             qdr_delivery_t   *delivery;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f5f10ba8/tests/field_test.c
----------------------------------------------------------------------
diff --git a/tests/field_test.c b/tests/field_test.c
index 414c84a..d320b60 100644
--- a/tests/field_test.c
+++ b/tests/field_test.c
@@ -244,9 +244,10 @@ static char* test_view_address_hash(void *context)
 static char* test_view_address_hash_override(void *context)
 {
     struct {const char *addr; const char *view;} cases[] = {
-    {"amqp:/link-target",        "Clink-target"},
-    {"amqp:/domain/link-target", "Cdomain/link-target"},
-    {"domain/link-target",       "Cdomain/link-target"},
+    {"amqp:/link-target",                    "Clink-target"},
+    {"amqp:/domain/link-target",             "Cdomain/link-target"},
+    {"domain/link-target",                   "Cdomain/link-target"},
+    {"bbc79fb3-e1fd-4a08-92b2-9a2de232b558", "Cbbc79fb3-e1fd-4a08-92b2-9a2de232b558"},
     {0, 0}
     };
     int idx;


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


[10/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Fixed memory leak of qd_message_t, qd_field_iterator and qd_composed_field_t objects when doing management requests

Posted by tr...@apache.org.
DISPATCH-179 - Fixed memory leak of qd_message_t, qd_field_iterator and qd_composed_field_t objects when doing management requests


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

Branch: refs/heads/master
Commit: d53f895c068bb0c9059e6627734f8e93c71c823a
Parents: f5f10ba
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Thu Mar 3 13:31:18 2016 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Thu Mar 3 13:31:18 2016 -0500

----------------------------------------------------------------------
 src/router_core/agent.c               | 34 ++++++++----
 src/router_core/forwarder.c           |  3 +
 src/router_core/management_agent.c    | 89 ++++++++++++++++++------------
 src/router_core/router_core_private.h |  1 -
 4 files changed, 80 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d53f895c/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 40db041..2150b43 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -49,9 +49,7 @@ static void qdr_agent_response_handler(void *context)
         if (query) {
             core->agent_response_handler(query->context, &query->status, query->more);
             if (!query->more) {
-                if (query->next_key)
-                    qdr_field_free(query->next_key);
-                free_qdr_query_t(query);
+                qdr_query_free(query);
             }
         }
     }
@@ -73,7 +71,6 @@ void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query)
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,
-                       qd_parsed_field_t       *attribute_names,
                        qd_composed_field_t     *body)
 {
     qdr_query_t *query = new_qdr_query_t();
@@ -108,7 +105,7 @@ void qdr_manage_create(qdr_core_t              *core,
     qdr_action_t *action = qdr_action(qdr_manage_create_CT, "manage_create");
 
     // Create a query object here
-    action->args.agent.query = qdr_query(core, context, type, 0, out_body);
+    action->args.agent.query = qdr_query(core, context, type, out_body);
     action->args.agent.name = name;
     action->args.agent.in_body = in_body;
 
@@ -116,7 +113,8 @@ void qdr_manage_create(qdr_core_t              *core,
 }
 
 
-void qdr_manage_delete(qdr_core_t *core, void  *context,
+void qdr_manage_delete(qdr_core_t *core,
+                       void  *context,
                        qd_router_entity_type_t  type,
                        qd_field_iterator_t     *name,
                        qd_field_iterator_t     *identity)
@@ -124,7 +122,7 @@ void qdr_manage_delete(qdr_core_t *core, void  *context,
     qdr_action_t *action = qdr_action(qdr_manage_delete_CT, "manage_delete");
 
     // Create a query object here
-    action->args.agent.query = qdr_query(core, context, type, 0, 0);
+    action->args.agent.query = qdr_query(core, context, type, 0);
     action->args.agent.name = name;
     action->args.agent.identity = identity;
 
@@ -132,7 +130,8 @@ void qdr_manage_delete(qdr_core_t *core, void  *context,
 }
 
 
-void qdr_manage_read(qdr_core_t *core, void  *context,
+void qdr_manage_read(qdr_core_t *core,
+                     void  *context,
                      qd_router_entity_type_t  entity_type,
                      qd_field_iterator_t     *name,
                      qd_field_iterator_t     *identity,
@@ -141,7 +140,7 @@ void qdr_manage_read(qdr_core_t *core, void  *context,
     qdr_action_t *action = qdr_action(qdr_manage_read_CT, "manage_read");
 
     // Create a query object here
-    action->args.agent.query = qdr_query(core, context, entity_type, 0, body);
+    action->args.agent.query = qdr_query(core, context, entity_type, body);
     action->args.agent.identity  = identity;
     action->args.agent.name = name;
 
@@ -168,7 +167,7 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
                               qd_composed_field_t     *body)
 {
 
-    qdr_query_t* query = qdr_query(core, context, type, attribute_names, body);
+    qdr_query_t* query = qdr_query(core, context, type, body);
 
     switch (query->entity_type) {
     case QD_ROUTER_ROUTE:
@@ -228,6 +227,17 @@ void qdr_query_get_next(qdr_query_t *query)
 
 void qdr_query_free(qdr_query_t *query)
 {
+    if(!query)
+        return;
+
+    if (query->next_key)
+        qdr_field_free(query->next_key);
+
+    if(query->body)
+        qd_compose_free(query->body);
+
+    free_qdr_query_t(query);
+
 }
 
 static void qdr_agent_emit_columns(qdr_query_t *query, const char *qdr_columns[], int column_count)
@@ -329,13 +339,17 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qd_parsed_field_t       *in_body    = action->args.agent.in_body;
 
     switch (query->entity_type) {
+
     case QD_ROUTER_ROUTE:       qdra_route_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
+
    }
+
+   qd_parse_free(in_body);
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d53f895c/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 678fc5d..4628e02 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -92,6 +92,7 @@ void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *
 void qdr_forward_on_message(qdr_core_t *core, qdr_general_work_t *work)
 {
     work->on_message(work->on_message_context, work->msg, work->maskbit);
+    qd_message_free(work->msg);
 }
 
 
@@ -323,6 +324,8 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
         }
     }
 
+
+
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d53f895c/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 2ad0249..72f7d70 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -28,16 +28,16 @@
 #include "dispatch_private.h"
 #include "alloc.h"
 
-const char *entity_type_key = "entityType";
-const char *type_key = "type";
-const char *count_key = "count";
-const char *offset_key = "offset";
-const char *name_key = "name";
-const char *identity_key = "identity";
+const char *ENTITY = "entityType";
+const char *TYPE = "type";
+const char *COUNT = "count";
+const char *OFFSET = "offset";
+const char *NAME = "name";
+const char *IDENTITY = "identity";
 
 
-const char *operation_type_key = "operation";
-const char *attribute_names_key = "attributeNames";
+const char *OPERATION = "operation";
+const char *ATTRIBUTE_NAMES = "attributeNames";
 
 const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.route";
 const unsigned char *waypoint_entity_type = (unsigned char*) "org.apache.qpid.dispatch.waypoint";
@@ -103,7 +103,7 @@ static qd_management_context_t* qd_management_context(qd_message_t
     ctx->count  = count;
     ctx->field  = field;
     ctx->msg    = msg;
-    ctx->source = source;
+    ctx->source = qd_message_copy(source);
     ctx->query  = query;
     ctx->current_count = 0;
     ctx->core   = core;
@@ -150,7 +150,7 @@ static void qd_set_properties(qd_message_t        *msg,
     qd_compose_insert_null(*fld);
     qd_compose_insert_typed_iterator(*fld, correlation_id);
     qd_compose_end_list(*fld);
-
+    qd_field_iterator_free(correlation_id);
 }
 
 
@@ -199,8 +199,14 @@ static void qd_manage_response_handler(void *context, const qd_amqp_error_t *sta
     // ctx->query has also been already freed
     // Just go over this with Ted to see if I freed everything.
 
+    qd_field_iterator_free(reply_to);
+    qd_compose_free(fld);
+
     if (ctx->msg)
         qd_message_free(ctx->msg);
+    if(ctx->source)
+        qd_message_free(ctx->source);
+
     free_qd_management_context_t(ctx);
 }
 
@@ -213,23 +219,28 @@ static void qd_core_agent_query_handler(qdr_core_t                 *core,
                                         int                        *offset)
 {
     //
-    // Add the Body
+    // Add the Body. This body field is freed by qdr_query_free()
     //
     qd_composed_field_t *field = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0);
 
     // Start a map in the body. Look for the end map in the callback function, qd_manage_response_handler.
     qd_compose_start_map(field);
 
-    qd_compose_insert_string(field, attribute_names_key); //add a "attributeNames" key
+    //add a "attributeNames" key
+    qd_compose_insert_string(field, ATTRIBUTE_NAMES);
 
-    // Call local function that creates and returns a qd_management_context_t containing the values passed in.
+    // Call local function that creates and returns a local qd_management_context_t object containing the values passed in.
     qd_management_context_t *ctx = qd_management_context(qd_message(), msg, field, 0, core, operation_type, (*count));
 
     // Grab the attribute names from the incoming message body. The attribute names will be used later on in the response.
     qd_parsed_field_t *attribute_names_parsed_field = 0;
-    qd_parsed_field_t *body = qd_parse(qd_message_field_iterator(msg, QD_FIELD_BODY));
-    if (body != 0 && qd_parse_is_map(body))
-        attribute_names_parsed_field = qd_parse_value_by_key(body, attribute_names_key);
+
+    qd_field_iterator_t *body_iter = qd_message_field_iterator(msg, QD_FIELD_BODY);
+
+    qd_parsed_field_t *body = qd_parse(body_iter);
+    if (body != 0 && qd_parse_is_map(body)) {
+        attribute_names_parsed_field = qd_parse_value_by_key(body, ATTRIBUTE_NAMES);
+    }
 
     // Set the callback function.
     qdr_manage_handler(core, qd_manage_response_handler);
@@ -241,6 +252,9 @@ static void qd_core_agent_query_handler(qdr_core_t                 *core,
     qd_compose_start_list(field); //start the list for results
 
     qdr_query_get_first(ctx->query, (*offset));
+
+    qd_field_iterator_free(body_iter);
+    qd_parse_free(body);
 }
 
 
@@ -284,7 +298,13 @@ static void qd_core_agent_create_handler(qdr_core_t                 *core,
     // Call local function that creates and returns a qd_management_context_t containing the values passed in.
     qd_management_context_t *ctx = qd_management_context(qd_message(), msg, out_body, 0, core, operation_type, 0);
 
-    qdr_manage_create(core, ctx, entity_type, name_iter, qd_parse(qd_message_field_iterator(msg, QD_FIELD_BODY)), out_body);
+    qd_field_iterator_t *body_iter = qd_message_field_iterator(msg, QD_FIELD_BODY);
+
+    qd_parsed_field_t *in_body = qd_parse(body_iter);
+
+    qdr_manage_create(core, ctx, entity_type, name_iter, in_body, out_body);
+
+    qd_field_iterator_free(body_iter);
 }
 
 
@@ -317,9 +337,10 @@ static void qd_core_agent_delete_handler(qdr_core_t                 *core,
 
 
 /**
- * Checks the content of the message to see if this can be handled by this agent.
+ * Checks the content of the message to see if this can be handled by the C-management agent. If this agent cannot handle it, it will be
+ * forwarded to the Python agent.
  */
-static bool qd_can_handle_request(qd_field_iterator_t         *props,
+static bool qd_can_handle_request(qd_parsed_field_t           *properties_fld,
                                   qd_router_entity_type_t     *entity_type,
                                   qd_router_operation_type_t  *operation_type,
                                   qd_field_iterator_t        **identity_iter,
@@ -327,11 +348,9 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
                                   int                         *count,
                                   int                         *offset)
 {
-    qd_parsed_field_t *fld = qd_parse(props);
-
     // The must be a property field and that property field should be a AMQP map. This is true for QUERY but I need
     // to check if it true for CREATE, UPDATE and DELETE
-    if (fld == 0 || !qd_parse_is_map(fld))
+    if (properties_fld == 0 || !qd_parse_is_map(properties_fld))
         return false;
 
     //
@@ -340,25 +359,24 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
     // 'entityType': 'org.apache.qpid.dispatch.router.link'
     // TODO - Add more entity types here. The above is not a complete list.
 
-    qd_parsed_field_t *parsed_field = qd_parse_value_by_key(fld, identity_key);
+    qd_parsed_field_t *parsed_field = qd_parse_value_by_key(properties_fld, IDENTITY);
     if (parsed_field!=0) {
         *identity_iter = qd_parse_raw(parsed_field);
     }
-    parsed_field = qd_parse_value_by_key(fld, name_key);
+    parsed_field = qd_parse_value_by_key(properties_fld, NAME);
     if (parsed_field!=0) {
         *name_iter = qd_parse_raw(parsed_field);
     }
 
-
-    parsed_field = qd_parse_value_by_key(fld, entity_type_key);
+    parsed_field = qd_parse_value_by_key(properties_fld, ENTITY);
 
     if (parsed_field == 0) { // Sometimes there is no 'entityType' but 'type' might be available.
-        parsed_field = qd_parse_value_by_key(fld, type_key);
+        parsed_field = qd_parse_value_by_key(properties_fld, TYPE);
         if (parsed_field == 0)
             return false;
     }
 
-    if      (qd_field_iterator_equal(qd_parse_raw(parsed_field), address_entity_type))
+    if (qd_field_iterator_equal(qd_parse_raw(parsed_field), address_entity_type))
         *entity_type = QD_ROUTER_ADDRESS;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), link_entity_type))
         *entity_type = QD_ROUTER_LINK;
@@ -368,7 +386,7 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         return false;
 
 
-    parsed_field = qd_parse_value_by_key(fld, operation_type_key);
+    parsed_field = qd_parse_value_by_key(properties_fld, OPERATION);
 
     if (parsed_field == 0)
         return false;
@@ -394,20 +412,18 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         return false;
 
     // Obtain the count and offset.
-    parsed_field = qd_parse_value_by_key(fld, count_key);
+    parsed_field = qd_parse_value_by_key(properties_fld, COUNT);
     if (parsed_field)
         (*count) = qd_parse_as_int(parsed_field);
     else
         (*count) = -1;
 
-    parsed_field = qd_parse_value_by_key(fld, offset_key);
+    parsed_field = qd_parse_value_by_key(properties_fld, OFFSET);
     if (parsed_field)
         (*offset) = qd_parse_as_int(parsed_field);
     else
         (*offset) = 0;
 
-    qd_parse_free(parsed_field);
-
     return true;
 }
 
@@ -431,7 +447,9 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
     int32_t count = 0;
     int32_t offset = 0;
 
-    if (qd_can_handle_request(app_properties_iter, &entity_type, &operation_type, &identity_iter, &name_iter, &count, &offset)) {
+    qd_parsed_field_t *properties_fld = qd_parse(app_properties_iter);
+
+    if (qd_can_handle_request(properties_fld, &entity_type, &operation_type, &identity_iter, &name_iter, &count, &offset)) {
         switch (operation_type) {
         case QD_ROUTER_OPERATION_QUERY:
             qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset);
@@ -461,8 +479,7 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
     }
 
     qd_field_iterator_free(app_properties_iter);
-    qd_field_iterator_free(name_iter);
-    qd_field_iterator_free(identity_iter);
+    qd_parse_free(properties_fld);
 
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d53f895c/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 84fb8d8..5caae66 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -563,6 +563,5 @@ void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn);
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,
-                       qd_parsed_field_t       *attribute_names,
                        qd_composed_field_t     *body);
 #endif


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


[43/50] [abbrv] qpid-dispatch git commit: DISPATCH-231 - Don't issue credit on targeted incoming links until there is at least one consumer for the target address.

Posted by tr...@apache.org.
DISPATCH-231 - Don't issue credit on targeted incoming links until there is at least one consumer for the target address.


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

Branch: refs/heads/master
Commit: ce66606fa25cf892f9f605aa2ad789488eefcbfe
Parents: 215b586
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 12:57:41 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 12:57:41 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c         |  1 +
 src/router_core/forwarder.c           |  2 +-
 src/router_core/route_tables.c        |  3 +++
 src/router_core/router_core_private.h |  2 ++
 src/router_core/transfer.c            | 24 ++++++++++++++++++++++++
 src/router_node.c                     |  5 -----
 6 files changed, 31 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 8ecd633..17d8591 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -969,6 +969,7 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
                     const char *key = (const char*) qd_hash_key_by_handle(addr->hash_handle);
                     if (key && *key == 'M')
                         qdr_post_mobile_added_CT(core, key);
+                    qdr_addr_start_inlinks_CT(core, addr);
                 }
                 qdr_link_outbound_second_attach_CT(core, link, source, target);
             }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index 4327636..5f24a4b 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -363,7 +363,7 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
                             bool             control,
                             qd_bitmask_t    *link_exclusion)
 {
-    return 0;
+    return qdr_forward_closest_CT(core, addr, msg, in_delivery, exclude_inprocess, control, link_exclusion);
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index 7f715a5..0e27408 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -510,6 +510,7 @@ static void qdr_map_destination_CT(qdr_core_t *core, qdr_action_t *action, bool
         qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
         qd_bitmask_set_bit(addr->rnodes, router_maskbit);
         rnode->ref_count++;
+        qdr_addr_start_inlinks_CT(core, addr);
 
         //
         // TODO - If this affects a waypoint, create the proper side effects
@@ -596,6 +597,8 @@ static void qdr_subscribe_CT(qdr_core_t *core, qdr_action_t *action, bool discar
         sub->addr = addr;
         DEQ_ITEM_INIT(sub);
         DEQ_INSERT_TAIL(addr->subscriptions, sub);
+        qdr_addr_start_inlinks_CT(core, addr);
+
     } else
         free(sub);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/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 dadebc9..74eb8c1 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -237,6 +237,7 @@ struct qdr_link_t {
     int                      capacity;
     int                      incremental_credit_CT;
     int                      incremental_credit;
+    bool                     flow_started;   ///< for incoming, true iff initial credit has been granted
     bool                     drain_mode;
     int                      credit_to_core; ///< Number of the available credits incrementally given to the core
     uint64_t                 total_deliveries;
@@ -549,6 +550,7 @@ void  qdr_forwarder_setup_CT(qdr_core_t *core);
 qdr_action_t *qdr_action(qdr_action_handler_t action_handler, const char *label);
 void qdr_action_enqueue(qdr_core_t *core, qdr_action_t *action);
 void qdr_link_issue_credit_CT(qdr_core_t *core, qdr_link_t *link, int credit);
+void qdr_addr_start_inlinks_CT(qdr_core_t *core, qdr_address_t *addr);
 void qdr_delivery_push_CT(qdr_core_t *core, qdr_delivery_t *dlv);
 void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index b05f15a..6aa2d04 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -249,6 +249,7 @@ qd_message_t *qdr_delivery_message(const qdr_delivery_t *delivery)
 void qdr_link_issue_credit_CT(qdr_core_t *core, qdr_link_t *link, int credit)
 {
     link->incremental_credit_CT += credit;
+    link->flow_started = true;
 
     if (link->incremental_credit_CT && link->incremental_credit == 0) {
         //
@@ -272,6 +273,29 @@ void qdr_link_issue_credit_CT(qdr_core_t *core, qdr_link_t *link, int credit)
 }
 
 
+/**
+ * This function should be called after adding a new destination (subscription, local link,
+ * or remote node) to an address.  If this address now has exactly one destination (i.e. it
+ * transitioned from unreachable to reachable), make sure any unstarted in-links are issued
+ * initial credit.
+ */
+void qdr_addr_start_inlinks_CT(qdr_core_t *core, qdr_address_t *addr)
+{
+    if (DEQ_SIZE(addr->inlinks) == 0)
+        return;
+
+    if (DEQ_SIZE(addr->subscriptions) + DEQ_SIZE(addr->rlinks) + qd_bitmask_cardinality(addr->rnodes) == 1) {
+        qdr_link_ref_t *ref = DEQ_HEAD(addr->inlinks);
+        while (ref) {
+            qdr_link_t *link = ref->link;
+            if (!link->flow_started)
+                qdr_link_issue_credit_CT(core, link, link->capacity);
+            ref = DEQ_NEXT(ref);
+        }
+    }
+}
+
+
 static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     if (discard)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ce66606f/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index d12eb03..b374cd7 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -508,11 +508,6 @@ static int router_closed_handler(void *type_context, qd_connection_t *conn, void
 }
 
 
-static void router_closed_handler(void *type_context, qd_connection_t *conn, void *context)
-{
-}
-
-
 static void qd_router_timer_handler(void *context)
 {
     qd_router_t *router = (qd_router_t*) context;


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


[18/50] [abbrv] qpid-dispatch git commit: DISPATCH-197 - Expose routed-link peers via management for tracing routed links.

Posted by tr...@apache.org.
DISPATCH-197 - Expose routed-link peers via management for tracing routed links.


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

Branch: refs/heads/master
Commit: 3bdc04fe8e24a686f9635745b58fa75315bc2909
Parents: a12a085
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 8 14:30:12 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 8 14:30:12 2016 -0500

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json |  4 ++++
 src/router_core/agent_link.c                  | 21 ++++++++++++++++-----
 src/router_core/agent_link.h                  |  2 +-
 tools/qdstat                                  |  4 +++-
 4 files changed, 24 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3bdc04fe/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 58e7f75..f558ee2 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -903,6 +903,10 @@
                     "type": "integer",
                     "description": "The capacity, in deliveries, for the link.  The number of undelivered plus unsettled deliveries shall not exceed the capacity.  This is enforced by link flow control."
                 },
+                "peer": {
+                    "type": "string",
+                    "description": "Identifier of the paired link if this is an attach-routed link."
+                },
                 "undeliveredCount": {
                     "type": "integer",
                     "description": "The number of undelivered messages pending for the link."

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3bdc04fe/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index 9eee88f..bfeaa89 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -28,11 +28,12 @@
 #define QDR_LINK_LINK_DIR           5
 #define QDR_LINK_OWNING_ADDR        6
 #define QDR_LINK_CAPACITY           7
-#define QDR_LINK_UNDELIVERED_COUNT  8
-#define QDR_LINK_UNSETTLED_COUNT    9
-#define QDR_LINK_DELIVERY_COUNT     10
-#define QDR_LINK_ADMIN_STATE        11
-#define QDR_LINK_OPER_STATE         12
+#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_ADMIN_STATE        12
+#define QDR_LINK_OPER_STATE         13
 
 const char *qdr_link_columns[] =
     {"name",
@@ -43,6 +44,7 @@ const char *qdr_link_columns[] =
      "linkDir",
      "owningAddr",
      "capacity",
+     "peer",
      "undeliveredCount",
      "unsettledCount",
      "deliveryCount",
@@ -112,6 +114,15 @@ static void qdr_agent_write_link_CT(qdr_query_t *query,  qdr_link_t *link)
             qd_compose_insert_uint(body, link->capacity);
             break;
 
+        case QDR_LINK_PEER:
+            if (link->connected_link) {
+                char id[100];
+                snprintf(id, 100, "link.%ld", link->connected_link->identifier);
+                qd_compose_insert_string(body, id);
+              } else
+                qd_compose_insert_null(body);
+            break;
+
         case QDR_LINK_UNDELIVERED_COUNT:
             qd_compose_insert_ulong(body, DEQ_SIZE(link->undelivered));
             break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3bdc04fe/src/router_core/agent_link.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.h b/src/router_core/agent_link.h
index fb2df25..2448aad 100644
--- a/src/router_core/agent_link.h
+++ b/src/router_core/agent_link.h
@@ -24,7 +24,7 @@
 void qdra_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
 void qdra_link_get_next_CT(qdr_core_t *core, qdr_query_t *query);
 
-#define QDR_LINK_COLUMN_COUNT  13
+#define QDR_LINK_COLUMN_COUNT  14
 
 const char *qdr_link_columns[QDR_LINK_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3bdc04fe/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index 2144b1f..5218645 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -224,6 +224,7 @@ class BusManager(Node):
         heads.append(Header("type"))
         heads.append(Header("dir"))
         heads.append(Header("id"))
+        heads.append(Header("peer"))
         heads.append(Header("addr"))
         heads.append(Header("cap"))
         heads.append(Header("undel"))
@@ -238,7 +239,8 @@ class BusManager(Node):
             row = []
             row.append(link.linkType)
             row.append(link.linkDir)
-            row.append(self._identity_clean(link.identity))
+            row.append(link.identity)
+            row.append(link.peer)
             row.append(self._addr_summary(link.owningAddr))
             row.append(link.capacity)
             row.append(link.undeliveredCount)


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


[27/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added parse_as_bool method to qd_parsed_field_t.

Posted by tr...@apache.org.
DISPATCH-179 - Added parse_as_bool method to qd_parsed_field_t.


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

Branch: refs/heads/master
Commit: 5c839b381667cf893759ae2f0c7be909ed972a69
Parents: 3ccd9db
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Mar 14 18:26:27 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 15 14:08:34 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/parse.h |  8 ++++++++
 src/parse.c                   | 21 +++++++++++++++++++++
 2 files changed, 29 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/5c839b38/include/qpid/dispatch/parse.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/parse.h b/include/qpid/dispatch/parse.h
index dfd57ac..47f3069 100644
--- a/include/qpid/dispatch/parse.h
+++ b/include/qpid/dispatch/parse.h
@@ -128,6 +128,14 @@ int32_t qd_parse_as_int(qd_parsed_field_t *field);
 int64_t qd_parse_as_long(qd_parsed_field_t *field);
 
 /**
+ * Return the raw content as a boolean value.
+ *
+ * @param field The field pointer returned by qd_parse.
+ * @return The raw content of the field cast as a bool.
+ */
+bool qd_parse_as_bool(qd_parsed_field_t *field);
+
+/**
  * Return the number of sub-field in a compound field.  If the field is
  * a list or array, this is the number of items in the list/array.  If
  * the field is a map, this is the number of key/value pairs in the map

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/5c839b38/src/parse.c
----------------------------------------------------------------------
diff --git a/src/parse.c b/src/parse.c
index 3ead3e2..55050ca 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -309,6 +309,27 @@ int64_t qd_parse_as_long(qd_parsed_field_t *field)
 }
 
 
+bool qd_parse_as_bool(qd_parsed_field_t *field)
+{
+    bool result = false;
+
+    qd_field_iterator_reset(field->raw_iter);
+
+    switch (field->tag) {
+    case QD_AMQP_BYTE:
+    case QD_AMQP_BOOLEAN:
+        result = !!qd_field_iterator_octet(field->raw_iter);
+        break;
+
+    case QD_AMQP_TRUE:
+        result = true;
+        break;
+    }
+
+    return result;
+}
+
+
 uint32_t qd_parse_sub_count(qd_parsed_field_t *field)
 {
     uint32_t count = DEQ_SIZE(field->children);


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


[16/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Fixed propagation of disposition and settlement across link-routes

Posted by tr...@apache.org.
DISPATCH-179 - Fixed propagation of disposition and settlement across link-routes


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

Branch: refs/heads/master
Commit: 9d0a8e65192e4af4f45e7555dfbd3fd26ef3c328
Parents: bb14ecf
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 8 13:40:26 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 8 13:40:26 2016 -0500

----------------------------------------------------------------------
 src/container.c               |  7 +------
 src/router_core/connections.c |  6 +++++-
 src/router_core/transfer.c    |  6 ++++--
 src/router_node.c             | 20 ++++++++++++++------
 4 files changed, 24 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index 482f33b..f6083b3 100644
--- a/src/container.c
+++ b/src/container.c
@@ -432,12 +432,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
             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);
-
-            //
-            // If the qd_link does not reference the pn_link, we have already freed the pn_link.
-            // If we attempt to free it again, proton will crash.
-            //
-            if (qd_link->pn_link == pn_link)
+            else if (qd_link->pn_link == pn_link)
                 pn_link_close(pn_link);
         }
         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index ab8f6e1..fffa4d3 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -1031,7 +1031,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
 
     qdr_connection_t *conn      = action->args.connection.conn;
     qdr_link_t       *link      = action->args.connection.link;
-    //qdr_error_t      *error     = action->args.connection.error;
+    qdr_error_t      *error     = action->args.connection.error;
     qd_detach_type_t  dt        = action->args.connection.dt;
     qdr_address_t    *addr      = link->owning_addr;
     bool              was_local = false;
@@ -1039,6 +1039,10 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
     //
     // TODO - For routed links, propagate the detach
     //
+    if (link->connected_link) {
+        qdr_link_outbound_detach_CT(core, link->connected_link, error, QDR_CONDITION_NONE);
+        return;
+    }
 
     link->owning_addr = 0;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 9484489..b05f15a 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -431,6 +431,8 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
     uint64_t        disp    = action->args.delivery.disposition;
     bool            settled = action->args.delivery.settled;
 
+    bool link_routed = dlv && dlv->link && dlv->link->connected_link;
+
     //
     // Logic:
     //
@@ -457,7 +459,7 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
             push = true;
             peer->peer = 0;
             dlv->peer  = 0;
-            if (peer->link) {
+            if (peer->link && !link_routed) {
                 sys_mutex_lock(peer->link->conn->work_lock);
                 DEQ_REMOVE(peer->link->unsettled, peer);
                 sys_mutex_unlock(peer->link->conn->work_lock);
@@ -466,7 +468,7 @@ static void qdr_update_delivery_CT(qdr_core_t *core, qdr_action_t *action, bool
             }
         }
 
-        if (dlv->link) {
+        if (dlv->link && !link_routed) {
             sys_mutex_lock(dlv->link->conn->work_lock);
             DEQ_REMOVE(dlv->link->unsettled, dlv);
             sys_mutex_unlock(dlv->link->conn->work_lock);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/9d0a8e65/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 27b54c0..100e204 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -187,10 +187,11 @@ static qd_field_iterator_t *router_annotate_message(qd_router_t       *router,
  */
 static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd)
 {
-    qd_router_t  *router  = (qd_router_t*) context;
-    pn_link_t    *pn_link = qd_link_pn(link);
-    qdr_link_t   *rlink   = (qdr_link_t*) qd_link_get_context(link);
-    qd_message_t *msg;
+    qd_router_t    *router   = (qd_router_t*) context;
+    pn_link_t      *pn_link  = qd_link_pn(link);
+    qdr_link_t     *rlink    = (qdr_link_t*) qd_link_get_context(link);
+    qdr_delivery_t *delivery = 0;
+    qd_message_t   *msg;
 
     //
     // Receive the message into a local representation.  If the returned message
@@ -222,7 +223,15 @@ static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd
     // Handle the link-routed case
     //
     if (qdr_link_is_routed(rlink)) {
-        qdr_link_deliver_to_routed_link(rlink, msg, pn_delivery_settled(pnd));
+        delivery = qdr_link_deliver_to_routed_link(rlink, msg, pn_delivery_settled(pnd));
+        if (delivery) {
+            if (pn_delivery_settled(pnd))
+                pn_delivery_settle(pnd);
+            else {
+                pn_delivery_set_context(pnd, delivery);
+                qdr_delivery_set_context(delivery, pnd);
+            }
+        }
         return;
     }
 
@@ -242,7 +251,6 @@ static void router_rx_handler(void* context, qd_link_t *link, pn_delivery_t *pnd
     //
     qd_message_depth_t  validation_depth = anonymous_link ? QD_DEPTH_PROPERTIES : QD_DEPTH_MESSAGE_ANNOTATIONS;
     bool                valid_message    = qd_message_check(msg, validation_depth);
-    qdr_delivery_t     *delivery         = 0;
 
     if (valid_message) {
         qd_parsed_field_t   *in_ma        = qd_message_message_annotations(msg);


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


[30/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added code to update router.link type Patch from Ganesh Murthy.

Posted by tr...@apache.org.
DISPATCH-179 - Added code to update router.link type
Patch from Ganesh Murthy.


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

Branch: refs/heads/master
Commit: 7c2d4e681310f362668af507d08f2127851afc5e
Parents: ab2734f
Author: Ted Ross <tr...@redhat.com>
Authored: Tue Mar 15 14:31:40 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Tue Mar 15 14:31:40 2016 -0400

----------------------------------------------------------------------
 src/router_core/agent.c            |  30 +++++-
 src/router_core/agent_link.c       | 156 ++++++++++++++++++++++++++++++--
 src/router_core/agent_link.h       |   5 +
 src/router_core/management_agent.c |  20 +++-
 4 files changed, 198 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7c2d4e68/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 5c20953..835030c 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -27,6 +27,7 @@
 static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdr_manage_update_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
 
 //==================================================================================
 // Internal Functions
@@ -154,9 +155,15 @@ void qdr_manage_update(qdr_core_t              *core,
                        qd_field_iterator_t     *name,
                        qd_field_iterator_t     *identity,
                        qd_parsed_field_t       *in_body,
-                       qd_composed_field_t      *out_body)
+                       qd_composed_field_t     *out_body)
 {
+    qdr_action_t *action = qdr_action(qdr_manage_update_CT, "manage_update");
+    action->args.agent.query = qdr_query(core, context, type, out_body);
+    action->args.agent.name = name;
+    action->args.agent.identity = identity;
+    action->args.agent.in_body = in_body;
 
+    qdr_action_enqueue(core, action);
 }
 
 
@@ -364,6 +371,27 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
    }
 }
 
+static void qdr_manage_update_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
+{
+    qd_field_iterator_t     *identity   = action->args.agent.identity;
+    qd_field_iterator_t     *name       = action->args.agent.name;
+    qdr_query_t             *query      = action->args.agent.query;
+    qd_parsed_field_t       *in_body    = action->args.agent.in_body;
+
+    switch (query->entity_type) {
+    case QD_ROUTER_CONFIG_ADDRESS:    break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_AUTO_LINK:  break;
+    case QD_ROUTER_CONNECTION:        break;
+    case QD_ROUTER_LINK:              qdra_link_update_CT(core, name, identity, query, in_body); break;
+    case QD_ROUTER_ADDRESS:           break;
+    case QD_ROUTER_EXCHANGE:          break;
+    case QD_ROUTER_BINDING:           break;
+   }
+
+    qd_parse_free(in_body);
+}
+
 
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7c2d4e68/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index bfeaa89..33ed2be 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -70,23 +70,26 @@ static const char *address_key(qdr_address_t *addr)
     return addr && addr->hash_handle ? (const char*) qd_hash_key_by_handle(addr->hash_handle) : NULL;
 }
 
-
-static void qdr_agent_write_link_CT(qdr_query_t *query,  qdr_link_t *link)
+static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_link_t *link)
 {
-    qd_composed_field_t *body = query->body;
+    switch(col) {
 
-    qd_compose_start_list(body);
-    int i = 0;
-    while (query->columns[i] >= 0) {
-        switch(query->columns[i]) {
-        case QDR_LINK_IDENTITY:
         case QDR_LINK_NAME: {
+            if (link->name)
+                qd_compose_insert_string(body, link->name);
+            else
+                qd_compose_insert_null(body);
+            break;
+        }
+
+        case QDR_LINK_IDENTITY: {
             char id[100];
-            snprintf(id, 100, "link.%ld", link->identifier);
+            snprintf(id, 100, "%ld", link->identifier);
             qd_compose_insert_string(body, id);
             break;
         }
 
+
         case QDR_LINK_TYPE:
             qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.link");
             break;
@@ -141,7 +144,17 @@ static void qdr_agent_write_link_CT(qdr_query_t *query,  qdr_link_t *link)
         default:
             qd_compose_insert_null(body);
             break;
-        }
+    }
+}
+
+static void qdr_agent_write_link_CT(qdr_query_t *query,  qdr_link_t *link)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_agent_write_column_CT(body, query->columns[i], link);
         i++;
     }
     qd_compose_end_list(body);
@@ -229,3 +242,126 @@ void qdra_link_get_next_CT(qdr_core_t *core, qdr_query_t *query)
     //
     qdr_agent_enqueue_response_CT(core, query);
 }
+
+
+static void qdr_manage_write_response_map_CT(qd_composed_field_t *body, qdr_link_t *link)
+{
+    qd_compose_start_map(body);
+
+    for(int i = 0; i < QDR_LINK_COLUMN_COUNT; i++) {
+        qd_compose_insert_string(body, qdr_link_columns[i]);
+        qdr_agent_write_column_CT(body, i, link);
+    }
+
+    qd_compose_end_map(body);
+}
+
+
+static qdr_link_t *qdr_link_find_by_identity(qdr_core_t *core, qd_field_iterator_t *identity)
+{
+    if (!identity)
+        return 0;
+
+    qdr_link_t *link = DEQ_HEAD(core->open_links);
+
+    while(link) {
+        char id[100];
+        if (link->identifier) {
+            snprintf(id, 100, "%ld", link->identifier);
+            if (qd_field_iterator_equal(identity, (const unsigned char *)id))
+                break;
+        }
+        link = DEQ_NEXT(link);
+    }
+
+    return link;
+
+}
+
+
+static qdr_link_t *qdr_link_find_by_name(qdr_core_t *core, qd_field_iterator_t *name)
+{
+    if(!name)
+        return 0;
+
+    qdr_link_t *link = DEQ_HEAD(core->open_links);
+
+    while(link) {
+        if (link->name && qd_field_iterator_equal(name, (const unsigned char *)link->name))
+            break;
+        link = DEQ_NEXT(link);
+    }
+
+    return link;
+}
+
+
+static void qdra_link_update_set_status(qdr_core_t *core, qdr_query_t *query, qdr_link_t *link)
+{
+    if (link) {
+        //link->admin_state = qd_field_iterator_copy(adm_state);
+        qdr_manage_write_response_map_CT(query->body, link);
+        query->status = QD_AMQP_OK;
+    }
+    else {
+        query->status = QD_AMQP_NOT_FOUND;
+        qd_compose_start_map(query->body);
+        qd_compose_end_map(query->body);
+    }
+}
+
+static void qdra_link_set_bad_request(qdr_query_t *query)
+{
+    query->status = QD_AMQP_BAD_REQUEST;
+    qd_compose_start_map(query->body);
+    qd_compose_end_map(query->body);
+}
+
+void qdra_link_update_CT(qdr_core_t              *core,
+                             qd_field_iterator_t *name,
+                             qd_field_iterator_t *identity,
+                             qdr_query_t         *query,
+                             qd_parsed_field_t   *in_body)
+
+{
+    // If the request was successful then the statusCode MUST contain 200 (OK) and the body of the message
+    // MUST contain a map containing the actual attributes of the entity updated. These MAY differ from those
+    // requested.
+    // A map containing attributes that are not applicable for the entity being created, or invalid values for a
+    // given attribute, MUST result in a failure response with a statusCode of 400 (Bad Request).
+    if (qd_parse_is_map(in_body)) {
+        // The absence of an attribute name implies that the entity should retain its existing value.
+        // If the map contains a key-value pair where the value is null then the updated entity should have no value
+        // for that attribute, removing any previous value.
+
+        qd_parsed_field_t *admin_state = qd_parse_value_by_key(in_body, qdr_link_columns[QDR_LINK_ADMIN_STATE]);
+        if (admin_state) { //admin state is the only field that can be updated via the update management request
+            //qd_field_iterator_t *adm_state = qd_parse_raw(admin_state);
+
+            if (identity) {
+                qdr_link_t *link = qdr_link_find_by_identity(core, identity);
+                // TODO - set the adm_state on the link
+                qdra_link_update_set_status(core, query, link);
+            }
+            else if (name) {
+                qdr_link_t *link = qdr_link_find_by_name(core, name);
+                // TODO - set the adm_state on the link
+                qdra_link_update_set_status(core, query, link);
+            }
+            else {
+                qdra_link_set_bad_request(query);
+            }
+        }
+        else
+            qdra_link_set_bad_request(query);
+
+    }
+    else
+        query->status = QD_AMQP_BAD_REQUEST;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7c2d4e68/src/router_core/agent_link.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.h b/src/router_core/agent_link.h
index 2448aad..9cdf391 100644
--- a/src/router_core/agent_link.h
+++ b/src/router_core/agent_link.h
@@ -23,6 +23,11 @@
 
 void qdra_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
 void qdra_link_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_link_update_CT(qdr_core_t          *core,
+                         qd_field_iterator_t *name,
+                         qd_field_iterator_t *identity,
+                         qdr_query_t         *query,
+                         qd_parsed_field_t   *in_body);
 
 #define QDR_LINK_COLUMN_COUNT  14
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7c2d4e68/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 6a8e1a3..4755f13 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -26,6 +26,7 @@
 #include <qpid/dispatch/dispatch.h>
 #include "router_core_private.h"
 #include "dispatch_private.h"
+#include "agent_link.h"
 #include "alloc.h"
 
 const char *ENTITY = "entityType";
@@ -303,8 +304,23 @@ static void qd_core_agent_create_handler(qdr_core_t                 *core,
 }
 
 
-static void qd_core_agent_update_handler()
+static void qd_core_agent_update_handler(qdr_core_t                 *core,
+                                         qd_message_t               *msg,
+                                         qd_router_entity_type_t     entity_type,
+                                         qd_router_operation_type_t  operation_type,
+                                         qd_field_iterator_t        *identity_iter,
+                                         qd_field_iterator_t        *name_iter)
 {
+    qd_composed_field_t *out_body = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0);
+
+    // Set the callback function.
+    qdr_manage_handler(core, qd_manage_response_handler);
+
+    qd_management_context_t *ctx = qd_management_context(qd_message(), msg, out_body, 0, core, operation_type, 0);
+
+    qd_parsed_field_t *in_body= qd_parse(qd_message_field_iterator(msg, QD_FIELD_BODY));
+
+    qdr_manage_update(core, ctx, entity_type, name_iter, identity_iter, in_body, out_body);
 
 }
 
@@ -454,7 +470,7 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
             qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
             break;
         case QD_ROUTER_OPERATION_UPDATE:
-            qd_core_agent_update_handler();
+            qd_core_agent_update_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
             break;
         case QD_ROUTER_OPERATION_DELETE:
             qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);


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


[26/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Fix failing link routes tests by removing address prefix when doing a management read operation

Posted by tr...@apache.org.
DISPATCH-179 - Fix failing link routes tests by removing address prefix when doing a management read operation


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

Branch: refs/heads/master
Commit: 3ccd9db18e84177ab2c14744659340df83d73bbd
Parents: 0a98b3a
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Tue Mar 15 08:49:54 2016 -0400
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Tue Mar 15 08:49:54 2016 -0400

----------------------------------------------------------------------
 tests/system_tests_link_routes.py | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3ccd9db1/tests/system_tests_link_routes.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_link_routes.py b/tests/system_tests_link_routes.py
index 7d4be3a..3946ab4 100644
--- a/tests/system_tests_link_routes.py
+++ b/tests/system_tests_link_routes.py
@@ -145,10 +145,10 @@ class LinkRoutePatternTest(TestCase):
                                                     attribute_names=['routerId']).results[0][0])
 
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache.dev').deliveriesEgress,
+                                            name='M0org.apache.dev').deliveriesEgress,
                          "deliveriesEgress is wrong")
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache.dev').deliveriesIngress,
+                                            name='M0org.apache.dev').deliveriesIngress,
                          "deliveriesIngress is wrong")
 
         # There should be 4 links -
@@ -192,11 +192,11 @@ class LinkRoutePatternTest(TestCase):
         # Make sure that the router node acting as the broker (QDR.A) had one message routed through it. This confirms
         # that the message was link routed
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache.dev').deliveriesEgress,
+                                            name='M0org.apache.dev').deliveriesEgress,
                          "deliveriesEgress is wrong")
 
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache.dev').deliveriesIngress,
+                                            name='M0org.apache.dev').deliveriesIngress,
                          "deliveriesIngress is wrong")
 
         #blocking_receiver.close()
@@ -236,11 +236,11 @@ class LinkRoutePatternTest(TestCase):
         # Make sure that the router node acting as the broker (QDR.A) had one message routed through it. This confirms
         # that the message was link routed
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache').deliveriesEgress,
+                                            name='M0org.apache').deliveriesEgress,
                          "deliveriesEgress is wrong")
 
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache').deliveriesIngress,
+                                            name='M0org.apache').deliveriesIngress,
                          "deliveriesIngress is wrong")
 
         #blocking_receiver.close()
@@ -276,15 +276,14 @@ class LinkRoutePatternTest(TestCase):
         # Make sure that the router node acting as the broker (QDR.A) had one message routed through it. This confirms
         # that the message was link routed
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache').deliveriesEgress,
+                                            name='M0org.apache').deliveriesEgress,
                          "deliveriesEgress is wrong")
 
         self.assertEqual(1, local_node.read(type='org.apache.qpid.dispatch.router.address',
-                                            name='router.address/M0org.apache').deliveriesIngress,
+                                            name='M0org.apache').deliveriesIngress,
                          "deliveriesIngress is wrong")
 
         #blocking_receiver.close()
         blocking_connection.close()
-
 if __name__ == '__main__':
     unittest.main(main_module())


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


[42/50] [abbrv] qpid-dispatch git commit: Merge branch 'tross-DISPATCH-179-1'

Posted by tr...@apache.org.
Merge branch 'tross-DISPATCH-179-1'

Conflicts:
	include/qpid/dispatch/container.h
	include/qpid/dispatch/ctools.h
	include/qpid/dispatch/server.h
	python/qpid_dispatch_internal/management/agent.py
	src/connection_manager.c
	src/container.c
	src/router_config.c
	src/router_node.c
	src/router_pynode.c
	tests/system_tests_qdmanage.py


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

Branch: refs/heads/master
Commit: 215b5864b778e9c1817bc05e62a7e00985fee286
Parents: c6ccf1e 620d779
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 09:43:14 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 09:43:14 2016 -0400

----------------------------------------------------------------------
 CMakeLists.txt                                  |    2 +-
 etc/qdrouterd.conf                              |    7 +
 include/qpid/dispatch.h                         |    1 +
 include/qpid/dispatch/amqp.h                    |    5 +-
 include/qpid/dispatch/bitmask.h                 |   10 +-
 include/qpid/dispatch/connection_manager.h      |   11 +
 include/qpid/dispatch/container.h               |   10 +-
 include/qpid/dispatch/ctools.h                  |    1 +
 include/qpid/dispatch/iterator.h                |    9 +
 include/qpid/dispatch/message.h                 |    2 +-
 include/qpid/dispatch/parse.h                   |    8 +
 include/qpid/dispatch/router.h                  |   78 +-
 include/qpid/dispatch/router_core.h             |  645 ++++++
 include/qpid/dispatch/server.h                  |    5 +
 include/qpid/dispatch/trace_mask.h              |   97 +
 python/qpid_dispatch/management/qdrouter.json   |  266 ++-
 python/qpid_dispatch_internal/dispatch.py       |   15 +-
 .../qpid_dispatch_internal/management/agent.py  |  105 +-
 .../qpid_dispatch_internal/management/config.py |    7 +-
 python/qpid_dispatch_internal/router/engine.py  |   11 +-
 python/qpid_dispatch_internal/router/node.py    |    5 +-
 src/CMakeLists.txt                              |   21 +-
 src/amqp.c                                      |    5 +-
 src/bitmask.c                                   |   75 +-
 src/connection_manager.c                        |  101 +-
 src/container.c                                 |   79 +-
 src/dispatch.c                                  |   22 +-
 src/dispatch_private.h                          |    5 +
 src/iterator.c                                  |   33 +-
 src/lrp.c                                       |   22 +-
 src/message.c                                   |    4 +-
 src/parse.c                                     |   21 +
 src/python_embedded.c                           |   61 +-
 src/router_agent.c                              |   76 +-
 src/router_config.c                             |  536 +++--
 src/router_core/DESIGN                          |  264 +++
 src/router_core/agent.c                         |  437 ++++
 src/router_core/agent_address.c                 |  295 +++
 src/router_core/agent_address.h                 |   38 +
 src/router_core/agent_config_address.c          |  415 ++++
 src/router_core/agent_config_address.h          |   35 +
 src/router_core/agent_config_auto_link.c        |  425 ++++
 src/router_core/agent_config_auto_link.h        |   35 +
 src/router_core/agent_config_link_route.c       |  408 ++++
 src/router_core/agent_config_link_route.h       |   35 +
 src/router_core/agent_link.c                    |  366 +++
 src/router_core/agent_link.h                    |   36 +
 src/router_core/connections.c                   | 1207 ++++++++++
 src/router_core/error.c                         |   97 +
 src/router_core/forwarder.c                     |  505 +++++
 src/router_core/management_agent.c              |  490 ++++
 src/router_core/route_control.c                 |  333 +++
 src/router_core/route_control.h                 |   51 +
 src/router_core/route_tables.c                  |  676 ++++++
 src/router_core/router_core.c                   |  380 ++++
 src/router_core/router_core_private.h           |  583 +++++
 src/router_core/router_core_thread.c            |   79 +
 src/router_core/terminus.c                      |  180 ++
 src/router_core/transfer.c                      |  507 +++++
 src/router_forwarders.c                         |   16 +-
 src/router_node.c                               | 2134 ++++--------------
 src/router_private.h                            |  277 +--
 src/router_pynode.c                             |  469 +---
 src/server.c                                    |    5 +-
 src/trace_mask.c                                |  147 ++
 src/waypoint.c                                  |    6 +-
 tests/config-2/A.conf                           |    5 +
 tests/config-2/B.conf                           |   13 +-
 tests/field_test.c                              |   46 +-
 tests/mock/dispatch.py                          |    7 +
 tests/parse_test.c                              |   82 +
 tests/system_tests_link_routes.py               |   17 +-
 tests/system_tests_management.py                |    2 +-
 tests/system_tests_qdmanage.py                  |  131 +-
 tests/system_tests_qdstat.py                    |    4 +-
 tests/tool_test.c                               |   46 +-
 tools/qdmanage                                  |    5 +-
 tools/qdstat                                    |   76 +-
 78 files changed, 10753 insertions(+), 2973 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/CMakeLists.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/include/qpid/dispatch/server.h
----------------------------------------------------------------------
diff --cc include/qpid/dispatch/server.h
index 4f39fc5,e8d92b8..e6c42ca
--- a/include/qpid/dispatch/server.h
+++ b/include/qpid/dispatch/server.h
@@@ -248,12 -248,11 +248,17 @@@ typedef struct qd_server_config_t 
      char *port;
  
      /**
 +     * Protocol family that the socket will use when binding listener or connector.
 +     * Possible values are IPv4 or IPv6. If not specified, the protocol family will be automatically determined from the address
 +     */
 +    char *protocol_family;
 +
 +    /**
+      * Connection name, used as a reference from other parts of the configuration.
+      */
+     char *name;
+ 
+     /**
       * Space-separated list of SASL mechanisms to be accepted for the connection.
       */
      char *sasl_mechanisms;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --cc python/qpid_dispatch/management/qdrouter.json
index 3c342ad,6f70fe9..e7d59d3
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@@ -645,9 -641,9 +646,9 @@@
          },
  
          "connector": {
 -            "description": "Establishes an outgoing connections from the router.",
 +            "description": "Establishes an outgoing connection from the router.",
              "extends": "configurationEntity",
-             "operations": ["CREATE"],
+             "operations": ["CREATE", "DELETE"],
              "annotations": [
                  "addrPort",
                  "connectionRole",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/python/qpid_dispatch_internal/management/agent.py
----------------------------------------------------------------------
diff --cc python/qpid_dispatch_internal/management/agent.py
index 1c1b876,a7dc4c5..1a77129
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@@ -250,10 -243,49 +250,52 @@@ class RouterEntity(EntityAdapter)
      def create(self):
          self._qd.qd_dispatch_configure_router(self._dispatch, self)
  
 +    def __str__(self):
 +        return super(RouterEntity, self).__str__().replace("Entity(", "RouterEntity(")
 +
  
+ class AddressEntity(EntityAdapter):
+     def __init__(self, agent, entity_type, attributes=None):
+         super(AddressEntity, self).__init__(agent, entity_type, attributes, validate=False)
+         # Router 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 _identifier(self): return self.attributes.get('identity')
+ 
+     def create(self):
+         self._qd.qd_dispatch_configure_address(self._dispatch, self)
+ 
+ 
+ class LinkRouteEntity(EntityAdapter):
+     def __init__(self, agent, entity_type, attributes=None):
+         super(LinkRouteEntity, self).__init__(agent, entity_type, attributes, validate=False)
+         # Router 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 _identifier(self): return self.attributes.get('identity')
+ 
+     def create(self):
+         self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
+ 
+ 
+ class AutoLinkEntity(EntityAdapter):
+     def __init__(self, agent, entity_type, attributes=None):
+         super(AutoLinkEntity, self).__init__(agent, entity_type, attributes, validate=False)
+         # Router 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 _identifier(self): return self.attributes.get('identity')
+ 
+     def create(self):
+         self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
+ 
+ 
  class LogEntity(EntityAdapter):
  
      def __init__(self, agent, entity_type, attributes=None, validate=True):
@@@ -287,54 -316,53 +329,84 @@@ def _addr_port_identifier(entity)
  
  class ListenerEntity(EntityAdapter):
      def create(self):
-         self._qd.qd_dispatch_configure_listener(self._dispatch, self)
+         config_listener = self._qd.qd_dispatch_configure_listener(self._dispatch, self)
          self._qd.qd_connection_manager_start(self._dispatch)
+         return config_listener
  
 +    def _identifier(self):
 +        return _addr_port_identifier(self)
 +
 +    def __str__(self):
 +        return super(ListenerEntity, self).__str__().replace("Entity(", "ListenerEntity(")
 +
+     def _delete(self):
+         self._qd.qd_connection_manager_delete_listener(self._dispatch, self._implementations[0].key)
+ 
+     def _identifier(self): return _addr_port_identifier(self)
  
  class ConnectorEntity(EntityAdapter):
      def create(self):
-         self._qd.qd_dispatch_configure_connector(self._dispatch, self)
+         config_connector = self._qd.qd_dispatch_configure_connector(self._dispatch, self)
          self._qd.qd_connection_manager_start(self._dispatch)
+         return config_connector
+ 
+     def _delete(self):
+         self._qd.qd_connection_manager_delete_connector(self._dispatch, self._implementations[0].key)
  
 -    def _identifier(self): return _addr_port_identifier(self)
 +    def _identifier(self):
 +        return _addr_port_identifier(self)
 +
 +    def __str__(self):
 +        return super(ConnectorEntity, self).__str__().replace("Entity(", "ConnectorEntity(")
  
  class FixedAddressEntity(EntityAdapter):
      def create(self):
-         self._qd.qd_dispatch_configure_address(self._dispatch, self)
+         self._qd.qd_dispatch_configure_fixed_address(self._dispatch, self)
  
 +    def __str__(self):
 +        return super(FixedAddressEntity, self).__str__().replace("Entity(", "FixedAddressEntity(")
 +
  
  class WaypointEntity(EntityAdapter):
      def create(self):
          self._qd.qd_dispatch_configure_waypoint(self._dispatch, self)
-         self._qd.qd_waypoint_activate_all(self._dispatch)
+         #self._qd.qd_waypoint_activate_all(self._dispatch)
  
 +    def __str__(self):
 +        return super(WaypointEntity, self).__str__().replace("Entity(", "WaypointEntity(")
 +
  class LinkRoutePatternEntity(EntityAdapter):
      def create(self):
          self._qd.qd_dispatch_configure_lrp(self._dispatch, self)
  
 +    def __str__(self):
 +        return super(LinkRoutePatternEntity, self).__str__().replace("Entity(", "LinkRoutePatternEntity(")
 +
+ class AddressEntity(EntityAdapter):
+     def create(self):
+         self._qd.qd_dispatch_configure_address(self._dispatch, self)
+ 
++    def __str__(self):
++        return super(AddressEntity, self).__str__().replace("Entity(", "AddressEntity(")
++
+ class LinkRouteEntity(EntityAdapter):
+     def create(self):
+         self._qd.qd_dispatch_configure_link_route(self._dispatch, self)
+ 
++    def __str__(self):
++        return super(LinkRouteEntity, self).__str__().replace("Entity(", "LinkRouteEntity(")
++
+ class AutoLinkEntity(EntityAdapter):
+     def create(self):
+         self._qd.qd_dispatch_configure_auto_link(self._dispatch, self)
+ 
++    def __str__(self):
++        return super(AutoLinkEntity, self).__str__().replace("Entity(", "AutoLinkEntity(")
++
  class ConsoleEntity(EntityAdapter):
 +    def __str__(self):
 +        return super(ConsoleEntity, self).__str__().replace("Entity(", "ConsoleEntity(")
 +
      def create(self):
          # if a named listener is present, use its addr:port 
          name = self.attributes.get('listener')

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/src/connection_manager.c
----------------------------------------------------------------------
diff --cc src/connection_manager.c
index 038ac63,07c7d1e..34c833d
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@@ -139,16 -139,14 +139,17 @@@ static qd_error_t load_server_config(qd
      bool depAllowUnsecured  = qd_entity_opt_bool(entity, "allowUnsecured", !requireSsl); CHECK();
  
      memset(config, 0, sizeof(*config));
 -    config->host            = qd_entity_get_string(entity, "addr"); CHECK();
 -    config->port            = qd_entity_get_string(entity, "port"); CHECK();
 -    config->name            = qd_entity_opt_string(entity, "name", 0); CHECK();
 -    config->role            = qd_entity_get_string(entity, "role"); CHECK();
 -    config->max_frame_size  = qd_entity_get_long(entity, "maxFrameSize"); CHECK();
 +    config->host                 = qd_entity_get_string(entity, "addr"); CHECK();
 +    config->port                 = qd_entity_get_string(entity, "port"); CHECK();
++    config->name                 = qd_entity_opt_string(entity, "name", 0); CHECK();
 +    config->role                 = qd_entity_get_string(entity, "role"); CHECK();
 +    config->protocol_family      = qd_entity_opt_string(entity, "protocolFamily", 0); CHECK();
 +    config->max_frame_size       = qd_entity_get_long(entity, "maxFrameSize"); CHECK();
      config->idle_timeout_seconds = qd_entity_get_long(entity, "idleTimeoutSeconds"); CHECK();
 -    config->sasl_mechanisms = qd_entity_opt_string(entity, "saslMechanisms", 0); CHECK();
 -    config->ssl_enabled = has_attrs(entity, ssl_attributes, ssl_attributes_count);
 +    config->sasl_username        = qd_entity_opt_string(entity, "saslUsername", 0); CHECK();
 +    config->sasl_password        = qd_entity_opt_string(entity, "saslPassword", 0); CHECK();
 +    config->sasl_mechanisms      = qd_entity_opt_string(entity, "saslMechanisms", 0); CHECK();
 +    config->ssl_enabled          = has_attrs(entity, ssl_attributes, ssl_attributes_count);
  
      //
      // For now we are hardwiring this attribute to true.  If there's an outcry from the
@@@ -191,13 -190,23 +193,25 @@@ qd_config_listener_t *qd_dispatch_confi
      qd_config_listener_t *cl = NEW(qd_config_listener_t);
      cl->is_connector = false;
      cl->listener = 0;
-     load_server_config(qd, &cl->configuration, entity);
+     if (load_server_config(qd, &cl->configuration, entity) != QD_ERROR_NONE) {
+         qd_log(cm->log_source, QD_LOG_ERROR, "Unable to create config listener: %s", qd_error_message());
+         qd_config_listener_free(cl);
+         return 0;
+     }
      DEQ_ITEM_INIT(cl);
      DEQ_INSERT_TAIL(cm->config_listeners, cl);
 -    qd_log(cm->log_source, QD_LOG_INFO, "Configured Listener: %s:%s role=%s",
 -           cl->configuration.host, cl->configuration.port, cl->configuration.role);
 +    qd_log(cm->log_source, QD_LOG_INFO, "Configured Listener: %s:%s proto=%s role=%s",
 +           cl->configuration.host, cl->configuration.port,
 +           cl->configuration.protocol_family ? cl->configuration.protocol_family : "any",
 +           cl->configuration.role);
+ 
+     return cl;
+ }
+ 
+ 
+ qd_error_t qd_entity_refresh_listener(qd_entity_t* entity, void *impl)
+ {
+     return QD_ERROR_NONE;
  }
  
  
@@@ -206,24 -221,21 +226,22 @@@ qd_config_connector_t *qd_dispatch_conf
      qd_error_clear();
      qd_connection_manager_t *cm = qd->connection_manager;
      qd_config_connector_t *cc = NEW(qd_config_connector_t);
--    memset(cc, 0, sizeof(*cc));
++    ZERO(cc);
++
      cc->is_connector = true;
-     if (load_server_config(qd, &cc->configuration, entity))
-         return qd_error_code();
+     if (load_server_config(qd, &cc->configuration, entity) != QD_ERROR_NONE) {
+         qd_log(cm->log_source, QD_LOG_ERROR, "Unable to create config connector: %s", qd_error_message());
+         qd_config_connector_free(cc);
+         return 0;
 -    }
      DEQ_ITEM_INIT(cc);
-     if (strcmp(cc->configuration.role, "on-demand") == 0) {
-         cc->connector_name = qd_entity_get_string(entity, "name"); QD_ERROR_RET();
-         DEQ_INSERT_TAIL(cm->on_demand_connectors, cc);
-         qd_log(cm->log_source, QD_LOG_INFO, "Configured on-demand connector: %s:%s name=%s",
-                cc->configuration.host, cc->configuration.port, cc->connector_name);
-     } else {
-         DEQ_INSERT_TAIL(cm->config_connectors, cc);
-         qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s proto=%s role=%s",
-                cc->configuration.host, cc->configuration.port,
-                cc->configuration.protocol_family ? cc->configuration.protocol_family : "any",
-                cc->configuration.role);
 -
+     DEQ_INSERT_TAIL(cm->config_connectors, cc);
 -    qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s role=%s, name=%s",
 -           cc->configuration.host, cc->configuration.port, cc->configuration.role,
 -           cc->configuration.name ? cc->configuration.name : "<none>");
++    qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s proto=%s role=%s",
++           cc->configuration.host, cc->configuration.port,
++           cc->configuration.protocol_family ? cc->configuration.protocol_family : "any",
++           cc->configuration.role);
 +    }
-     return QD_ERROR_NONE;
+ 
+     return cc;
  }
  
  

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/src/message.c
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/src/router_forwarders.c
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/src/router_node.c
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/src/server.c
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/tests/system_tests_qdmanage.py
----------------------------------------------------------------------
diff --cc tests/system_tests_qdmanage.py
index 041a325,f11bec4..96d5821
--- a/tests/system_tests_qdmanage.py
+++ b/tests/system_tests_qdmanage.py
@@@ -163,23 -179,31 +179,47 @@@ class QdmanageTest(TestCase)
          actual = self.run_qdmanage("GET-JSON-SCHEMA")
          self.assertEquals(schema, dictify(json.loads(actual)))
  
 +    def test_update(self):
 +        exception = False
 +        try:
 +            # Try to not set 'output'
 +            json.loads(self.run_qdmanage("UPDATE --type org.apache.qpid.dispatch.log --name log/DEFAULT output="))
 +        except Exception as e:
 +            exception = True
 +            self.assertTrue("InternalServerErrorStatus: CError: Configuration: Failed to open log file ''" in e.message)
 +        self.assertTrue(exception)
 +
 +        # Set a valid 'output'
 +        output = json.loads(self.run_qdmanage("UPDATE --type org.apache.qpid.dispatch.log --name log/DEFAULT "
 +                                              "enable=trace+ output=A.log"))
 +        self.assertEqual("A.log", output['output'])
 +        self.assertEqual("trace+", output['enable'])
 +
-     def test_add_connector(self):
+     def create(self, type, name, port):
+         create_command = 'CREATE --type=' + type + ' --name=' + name + ' addr=0.0.0.0 port=' + port
+         connector = json.loads(self.run_qdmanage(create_command))
+         return connector
+ 
+     def test_create_delete_connector(self):
+         long_type = 'org.apache.qpid.dispatch.connector'
+         query_command = 'QUERY --type=' + long_type
+         output = json.loads(self.run_qdmanage(query_command))
+         name = output[0]['name']
+ 
+         # Delete an existing connector
+         delete_command = 'DELETE --type=' + long_type + ' --name=' + name
+         self.run_qdmanage(delete_command)
+         output = json.loads(self.run_qdmanage(query_command))
+         self.assertEqual(output, [])
+ 
+         # Re-create the connector and then try wait_connectors
+         self.create(long_type, name, str(QdmanageTest.inter_router_port))
+         full_name = 'connection/0.0.0.0:' + str(QdmanageTest.inter_router_port)
+         output = json.loads(self.run_qdmanage('READ --type=org.apache.qpid.dispatch.connection --name ' + full_name))
+ 
+         self.assertEquals(full_name, output['name'])
+ 
+     def test_zzz_add_connector(self):
          port = self.get_port()
          # dont provide role and make sure that role is defaulted to 'normal'
          command = "CREATE --type=connector --name=eaconn1 port=" + str(port) + " addr=0.0.0.0"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/215b5864/tests/system_tests_qdstat.py
----------------------------------------------------------------------


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


[37/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Fixed crash in link-route create via management protocol.

Posted by tr...@apache.org.
DISPATCH-179 - Fixed crash in link-route create via management protocol.


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

Branch: refs/heads/master
Commit: b3e011e3fb82630f7df68bb97228f587541e3fca
Parents: 8fb13f5
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Mar 17 07:11:18 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Mar 17 07:11:18 2016 -0400

----------------------------------------------------------------------
 src/router_core/agent_config_auto_link.c  |  2 +-
 src/router_core/agent_config_link_route.c |  2 +-
 src/router_core/route_control.c           | 16 ++++++++-------
 src/router_core/route_control.h           | 28 +++++++++++++-------------
 4 files changed, 25 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b3e011e3/src/router_core/agent_config_auto_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_auto_link.c b/src/router_core/agent_config_auto_link.c
index b18fb90..d81c6a4 100644
--- a/src/router_core/agent_config_auto_link.c
+++ b/src/router_core/agent_config_auto_link.c
@@ -78,7 +78,7 @@ static void qdr_config_auto_link_insert_column_CT(qdr_auto_link_t *al, int col,
     case QDR_CONFIG_AUTO_LINK_ADDR:
         key = (const char*) qd_hash_key_by_handle(al->addr->hash_handle);
         if (key && key[0] == 'M')
-            qd_compose_insert_string(body, &key[1]);
+            qd_compose_insert_string(body, &key[2]);
         else
             qd_compose_insert_null(body);
         break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b3e011e3/src/router_core/agent_config_link_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_link_route.c b/src/router_core/agent_config_link_route.c
index bfdc70f..b3397db 100644
--- a/src/router_core/agent_config_link_route.c
+++ b/src/router_core/agent_config_link_route.c
@@ -373,7 +373,7 @@ void qdra_config_link_route_create_CT(qdr_core_t          *core,
         bool               is_container = !!container_field;
         qd_parsed_field_t *in_use_conn  = is_container ? container_field : connection_field;
 
-        qdr_route_add_link_route_CT(core, name, prefix_field, in_use_conn, is_container, trt, dir);
+        lr = qdr_route_add_link_route_CT(core, name, prefix_field, in_use_conn, is_container, trt, dir);
 
         //
         // Compose the result map for the response.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b3e011e3/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 9ddad29..23bda17 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -150,13 +150,13 @@ static void qdr_auto_link_deactivate_CT(qdr_core_t *core, qdr_auto_link_t *al, q
 }
 
 
-void qdr_route_add_link_route_CT(qdr_core_t             *core,
-                                 qd_field_iterator_t    *name,
-                                 qd_parsed_field_t      *prefix_field,
-                                 qd_parsed_field_t      *conn_id,
-                                 bool                    is_container,
-                                 qd_address_treatment_t  treatment,
-                                 qd_direction_t          dir)
+qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t             *core,
+                                              qd_field_iterator_t    *name,
+                                              qd_parsed_field_t      *prefix_field,
+                                              qd_parsed_field_t      *conn_id,
+                                              bool                    is_container,
+                                              qd_address_treatment_t  treatment,
+                                              qd_direction_t          dir)
 {
     qdr_link_route_t *lr = new_qdr_link_route_t();
 
@@ -197,6 +197,8 @@ void qdr_route_add_link_route_CT(qdr_core_t             *core,
     // Add the link route to the core list
     //
     DEQ_INSERT_TAIL(core->link_routes, lr);
+
+    return lr;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/b3e011e3/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index 34b8bd9..f5a8359 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -21,23 +21,23 @@
 
 #include "router_core_private.h"
 
-void qdr_route_add_link_route_CT(qdr_core_t             *core,
-                                 qd_field_iterator_t    *name,
-                                 qd_parsed_field_t      *prefix_field,
-                                 qd_parsed_field_t      *conn_id,
-                                 bool                    is_container,
-                                 qd_address_treatment_t  treatment,
-                                 qd_direction_t          dir);
+qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t             *core,
+                                              qd_field_iterator_t    *name,
+                                              qd_parsed_field_t      *prefix_field,
+                                              qd_parsed_field_t      *conn_id,
+                                              bool                    is_container,
+                                              qd_address_treatment_t  treatment,
+                                              qd_direction_t          dir);
 
 void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr);
 
-qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t             *core,
-                                            qd_field_iterator_t    *name,
-                                            qd_parsed_field_t      *addr_field,
-                                            qd_direction_t          dir,
-                                            int                     phase,
-                                            qd_parsed_field_t      *conn_id,
-                                            bool                    is_container);
+qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
+                                            qd_field_iterator_t *name,
+                                            qd_parsed_field_t   *addr_field,
+                                            qd_direction_t       dir,
+                                            int                  phase,
+                                            qd_parsed_field_t   *conn_id,
+                                            bool                 is_container);
 
 void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *auto_link);
 


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


[47/50] [abbrv] qpid-dispatch git commit: Fixed a merge-conflict resolution error.

Posted by tr...@apache.org.
Fixed a merge-conflict resolution error.


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

Branch: refs/heads/master
Commit: 8c19dd10c673d8cbb3da0b5bd075338a175a08c2
Parents: d953608
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Mar 18 16:00:50 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Mar 18 16:00:50 2016 -0400

----------------------------------------------------------------------
 src/connection_manager.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/8c19dd10/src/connection_manager.c
----------------------------------------------------------------------
diff --git a/src/connection_manager.c b/src/connection_manager.c
index 34c833d..c5b12e4 100644
--- a/src/connection_manager.c
+++ b/src/connection_manager.c
@@ -233,13 +233,14 @@ qd_config_connector_t *qd_dispatch_configure_connector(qd_dispatch_t *qd, qd_ent
         qd_log(cm->log_source, QD_LOG_ERROR, "Unable to create config connector: %s", qd_error_message());
         qd_config_connector_free(cc);
         return 0;
+    }
+
     DEQ_ITEM_INIT(cc);
     DEQ_INSERT_TAIL(cm->config_connectors, cc);
     qd_log(cm->log_source, QD_LOG_INFO, "Configured Connector: %s:%s proto=%s role=%s",
            cc->configuration.host, cc->configuration.port,
            cc->configuration.protocol_family ? cc->configuration.protocol_family : "any",
            cc->configuration.role);
-    }
 
     return cc;
 }


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


[31/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added configuration and management hooks for config.linkRoute

Posted by tr...@apache.org.
DISPATCH-179 - Added configuration and management hooks for config.linkRoute


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

Branch: refs/heads/master
Commit: 56c5a93fa9af2d4d7f219a268a1cacb67ce7a085
Parents: 7c2d4e6
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 16 09:36:34 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 16 09:36:34 2016 -0400

----------------------------------------------------------------------
 python/qpid_dispatch/management/qdrouter.json |   7 +-
 src/CMakeLists.txt                            |   1 +
 src/router_config.c                           |  54 +--
 src/router_core/agent.c                       |  17 +-
 src/router_core/agent_config_link_route.c     | 408 +++++++++++++++++++++
 src/router_core/agent_config_link_route.h     |  35 ++
 src/router_core/route_control.c               |   7 +-
 src/router_core/route_control.h               |   2 +-
 8 files changed, 495 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index 40f3e19..61d3642 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -886,7 +886,7 @@
                     "create": true,
                     "required": false
                 },
-                "connectionName": {
+                "connection": {
                     "type": "string",
                     "description": "The name from a connector or listener",
                     "create": true,
@@ -903,8 +903,7 @@
                     "type": ["in", "out"],
                     "description": "The permitted direction of links: 'in' means client senders; 'out' means client receivers",
                     "create": true,
-                    "required": false,
-                    "default": "both"
+                    "required": true
                 }
             }
         },
@@ -938,7 +937,7 @@
                     "create": true,
                     "required": false
                 },
-                "connectionName": {
+                "connection": {
                     "type": "string",
                     "description": "The name from a connector or listener",
                     "create": true,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9ae6d08..fbcbd6e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -67,6 +67,7 @@ set(qpid_dispatch_SOURCES
   router_core/agent.c
   router_core/agent_address.c
   router_core/agent_config_address.c
+  router_core/agent_config_link_route.c
   router_core/agent_link.c
   router_core/connections.c
   router_core/error.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index d22f8c1..202ee9f 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -128,12 +128,8 @@ qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity
 }
 
 
-qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
+static void qd_router_add_link_route(qdr_core_t *core, const char *prefix, const char *connector, const char* dir)
 {
-    char *prefix    = qd_entity_get_string(entity, "prefix");    QD_ERROR_RET();
-    char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
-    char *direction = qd_entity_get_string(entity, "dir");       QD_ERROR_RET();
-
     //
     // Formulate this configuration as a router.route and create it through the core management API.
     //
@@ -143,10 +139,10 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
     qd_compose_insert_string(body, prefix);
 
     qd_compose_insert_string(body, "dir");
-    qd_compose_insert_string(body, direction);
+    qd_compose_insert_string(body, dir);
 
     if (connector) {
-        qd_compose_insert_string(body, "connectionName");
+        qd_compose_insert_string(body, "connection");
         qd_compose_insert_string(body, connector);
     }
 
@@ -167,7 +163,21 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_CONFIG_LINK_ROUTE, 0, in_body, 0);
+    qdr_manage_create(core, 0, QD_ROUTER_CONFIG_LINK_ROUTE, 0, in_body, 0);
+}
+
+
+qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
+{
+    char *prefix    = qd_entity_get_string(entity, "prefix");    QD_ERROR_RET();
+    char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
+    char *direction = qd_entity_get_string(entity, "dir");       QD_ERROR_RET();
+
+    if (strcmp("in", direction) == 0 || strcmp("both", direction) == 0)
+        qd_router_add_link_route(router->router_core, prefix, connector, "in");
+
+    if (strcmp("out", direction) == 0 || strcmp("both", direction) == 0)
+        qd_router_add_link_route(router->router_core, prefix, connector, "out");
 
     free(prefix);
     free(connector);
@@ -248,12 +258,12 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
 
 qd_error_t qd_router_configure_link_route(qd_router_t *router, qd_entity_t *entity)
 {
-    char *name      = qd_entity_opt_string(entity, "name", 0);           QD_ERROR_RET();
-    char *prefix    = qd_entity_get_string(entity, "prefix");            QD_ERROR_RET();
-    char *container = qd_entity_opt_string(entity, "containerId", 0);    QD_ERROR_RET();
-    char *c_name    = qd_entity_opt_string(entity, "connectionName", 0); QD_ERROR_RET();
-    char *distrib   = qd_entity_opt_string(entity, "distribution", 0);   QD_ERROR_RET();
-    char *dir       = qd_entity_opt_string(entity, "dir", 0);            QD_ERROR_RET();
+    char *name      = qd_entity_opt_string(entity, "name", 0);         QD_ERROR_RET();
+    char *prefix    = qd_entity_get_string(entity, "prefix");          QD_ERROR_RET();
+    char *container = qd_entity_opt_string(entity, "containerId", 0);  QD_ERROR_RET();
+    char *c_name    = qd_entity_opt_string(entity, "connection", 0);   QD_ERROR_RET();
+    char *distrib   = qd_entity_opt_string(entity, "distribution", 0); QD_ERROR_RET();
+    char *dir       = qd_entity_opt_string(entity, "dir", 0);          QD_ERROR_RET();
 
     //
     // Formulate this configuration as a route and create it through the core management API.
@@ -277,7 +287,7 @@ qd_error_t qd_router_configure_link_route(qd_router_t *router, qd_entity_t *enti
     }
 
     if (c_name) {
-        qd_compose_insert_string(body, "connectionName");
+        qd_compose_insert_string(body, "connection");
         qd_compose_insert_string(body, c_name);
     }
 
@@ -323,12 +333,12 @@ qd_error_t qd_router_configure_link_route(qd_router_t *router, qd_entity_t *enti
 
 qd_error_t qd_router_configure_auto_link(qd_router_t *router, qd_entity_t *entity)
 {
-    char *name      = qd_entity_opt_string(entity, "name", 0);           QD_ERROR_RET();
-    char *addr      = qd_entity_get_string(entity, "addr");              QD_ERROR_RET();
-    char *dir       = qd_entity_get_string(entity, "dir");               QD_ERROR_RET();
-    long  phase     = qd_entity_opt_long(entity, "phase", -1);           QD_ERROR_RET();
-    char *container = qd_entity_opt_string(entity, "containerId", 0);    QD_ERROR_RET();
-    char *c_name    = qd_entity_opt_string(entity, "connectionName", 0); QD_ERROR_RET();
+    char *name      = qd_entity_opt_string(entity, "name", 0);        QD_ERROR_RET();
+    char *addr      = qd_entity_get_string(entity, "addr");           QD_ERROR_RET();
+    char *dir       = qd_entity_get_string(entity, "dir");            QD_ERROR_RET();
+    long  phase     = qd_entity_opt_long(entity, "phase", -1);        QD_ERROR_RET();
+    char *container = qd_entity_opt_string(entity, "containerId", 0); QD_ERROR_RET();
+    char *c_name    = qd_entity_opt_string(entity, "connection", 0);  QD_ERROR_RET();
 
     //
     // Formulate this configuration as a route and create it through the core management API.
@@ -362,7 +372,7 @@ qd_error_t qd_router_configure_auto_link(qd_router_t *router, qd_entity_t *entit
     }
 
     if (c_name) {
-        qd_compose_insert_string(body, "connectionName");
+        qd_compose_insert_string(body, "connection");
         qd_compose_insert_string(body, c_name);
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index 835030c..450293a 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -19,6 +19,7 @@
 
 #include <qpid/dispatch/amqp.h>
 #include "agent_config_address.h"
+#include "agent_config_link_route.h"
 #include "agent_address.h"
 #include "agent_link.h"
 #include "router_core_private.h"
@@ -177,8 +178,8 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     qdr_query_t* query = qdr_query(core, context, type, body);
 
     switch (query->entity_type) {
-    case QD_ROUTER_CONFIG_ADDRESS:    break;
-    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_set_columns(query, attribute_names, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT);  break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_set_columns(query, attribute_names, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT);  break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              qdr_agent_set_columns(query, attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT);  break;
@@ -194,8 +195,8 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
 void qdr_query_add_attribute_names(qdr_query_t *query)
 {
     switch (query->entity_type) {
-    case QD_ROUTER_CONFIG_ADDRESS:    break;
-    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_ADDRESS:    qdr_agent_emit_columns(query, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT); break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_emit_columns(query, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT); break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
@@ -339,7 +340,7 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
 
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_create_CT(core, name, query, in_body); break;
-    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              break;
@@ -361,7 +362,7 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
 
     switch (query->entity_type) {
     case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_delete_CT(core, query, name, identity); break;
-    case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+    case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_delete_CT(core, query, name, identity); break;
     case QD_ROUTER_CONFIG_AUTO_LINK:  break;
     case QD_ROUTER_CONNECTION:        break;
     case QD_ROUTER_LINK:              break;
@@ -403,7 +404,7 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
     if (!discard) {
         switch (query->entity_type) {
         case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+        case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONFIG_AUTO_LINK:  break;
         case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_LINK:              qdra_link_get_first_CT(core, query, offset); break;
@@ -422,7 +423,7 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
     if (!discard) {
         switch (query->entity_type) {
         case QD_ROUTER_CONFIG_ADDRESS:    qdra_config_address_get_next_CT(core, query); break;
-        case QD_ROUTER_CONFIG_LINK_ROUTE: break;
+        case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_next_CT(core, query); break;
         case QD_ROUTER_CONFIG_AUTO_LINK:  break;
         case QD_ROUTER_CONNECTION:        break;
         case QD_ROUTER_LINK:              qdra_link_get_next_CT(core, query); break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_core/agent_config_link_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_link_route.c b/src/router_core/agent_config_link_route.c
new file mode 100644
index 0000000..839dab7
--- /dev/null
+++ b/src/router_core/agent_config_link_route.c
@@ -0,0 +1,408 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <qpid/dispatch/ctools.h>
+#include "agent_config_link_route.h"
+#include "route_control.h"
+#include <stdio.h>
+
+#define QDR_CONFIG_LINK_ROUTE_NAME          0
+#define QDR_CONFIG_LINK_ROUTE_IDENTITY      1
+#define QDR_CONFIG_LINK_ROUTE_TYPE          2
+#define QDR_CONFIG_LINK_ROUTE_PREFIX        3
+#define QDR_CONFIG_LINK_ROUTE_DISTRIBUTION  4
+#define QDR_CONFIG_LINK_ROUTE_CONNECTION    5
+#define QDR_CONFIG_LINK_ROUTE_CONTAINER_ID  6
+#define QDR_CONFIG_LINK_ROUTE_DIR           7
+
+const char *qdr_config_link_route_columns[] =
+    {"name",
+     "identity",
+     "type",
+     "prefix",
+     "distribution",
+     "connection",
+     "containerId",
+     "dir",
+     0};
+
+
+static void qdr_config_link_route_insert_column_CT(qdr_link_route_t *lr, int col, qd_composed_field_t *body, bool as_map)
+{
+    const char *text = 0;
+    const char *key;
+
+    if (as_map)
+        qd_compose_insert_string(body, qdr_config_link_route_columns[col]);
+
+    switch(col) {
+    case QDR_CONFIG_LINK_ROUTE_NAME:
+        if (lr->name)
+            qd_compose_insert_string(body, lr->name);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_LINK_ROUTE_IDENTITY: {
+        char id_str[100];
+        snprintf(id_str, 100, "%ld", lr->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+    }
+
+    case QDR_CONFIG_LINK_ROUTE_TYPE:
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.config.link_route");
+        break;
+
+    case QDR_CONFIG_LINK_ROUTE_PREFIX:
+        key = (const char*) qd_hash_key_by_handle(lr->addr->hash_handle);
+        if (key && (key[0] == 'C' || key[0] == 'D'))
+            qd_compose_insert_string(body, &key[1]);
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_LINK_ROUTE_DISTRIBUTION:
+        switch (lr->treatment) {
+        case QD_TREATMENT_LINK_BALANCED: text = "linkBalanced"; break;
+        default:
+            text = 0;
+        }
+
+        if (text)
+            qd_compose_insert_string(body, text);
+        else
+            qd_compose_insert_null(body);
+
+        break;
+
+    case QDR_CONFIG_LINK_ROUTE_CONNECTION:
+    case QDR_CONFIG_LINK_ROUTE_CONTAINER_ID:
+        if (lr->conn_id) {
+            key = (const char*) qd_hash_key_by_handle(lr->conn_id->hash_handle);
+            if (key && key[0] == 'L' && col == QDR_CONFIG_LINK_ROUTE_CONNECTION) {
+                qd_compose_insert_string(body, &key[1]);
+                break;
+            }
+            if (key && key[0] == 'C' && col == QDR_CONFIG_LINK_ROUTE_CONTAINER_ID) {
+                qd_compose_insert_string(body, &key[1]);
+                break;
+            }
+        }
+        qd_compose_insert_null(body);
+        break;
+
+    case QDR_CONFIG_LINK_ROUTE_DIR:
+        text = lr->dir == QD_INCOMING ? "in" : "out";
+        qd_compose_insert_string(body, text);
+        break;
+    }
+}
+
+
+static void qdr_agent_write_config_link_route_CT(qdr_query_t *query,  qdr_link_route_t *lr)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_config_link_route_insert_column_CT(lr, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+
+static void qdr_manage_advance_config_link_route_CT(qdr_query_t *query, qdr_link_route_t *lr)
+{
+    query->next_offset++;
+    lr = DEQ_NEXT(lr);
+    query->more = !!lr;
+}
+
+
+void qdra_config_link_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->link_routes)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_link_route_t *lr = DEQ_HEAD(core->link_routes);
+    for (int i = 0; i < offset && lr; i++)
+        lr = DEQ_NEXT(lr);
+    assert(lr);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_config_link_route_CT(query, lr);
+
+    //
+    // Advance to the next link_route
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_config_link_route_CT(query, lr);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_config_link_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_link_route_t *lr = 0;
+
+    if (query->next_offset < DEQ_SIZE(core->link_routes)) {
+        lr = DEQ_HEAD(core->link_routes);
+        for (int i = 0; i < query->next_offset && lr; i++)
+            lr = DEQ_NEXT(lr);
+    }
+
+    if (lr) {
+        //
+        // Write the columns of the addr entity into the response body.
+        //
+        qdr_agent_write_config_link_route_CT(query, lr);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_config_link_route_CT(query, lr);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+static const char *qdra_link_route_treatment_CT(qd_parsed_field_t *field, qd_address_treatment_t *trt)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "linkBalanced")) {
+            *trt = QD_TREATMENT_LINK_BALANCED;
+            return 0;
+        }
+        return "Invalid value for 'distribution'";
+    }
+
+    *trt = QD_TREATMENT_LINK_BALANCED;
+    return 0;
+}
+
+
+static const char *qdra_link_route_direction_CT(qd_parsed_field_t *field, qd_direction_t *dir)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "in")) {
+            *dir = QD_INCOMING;
+            return 0;
+        } else if (qd_field_iterator_equal(iter, (unsigned char*) "out")) {
+            *dir = QD_OUTGOING;
+            return 0;
+        }
+        return "Invalid value for 'dir'";
+    }
+    return "Missing value for 'dir'";
+}
+
+
+static qdr_link_route_t *qdr_link_route_config_find_by_identity_CT(qdr_core_t *core, qd_field_iterator_t *identity)
+{
+    if (!identity)
+        return 0;
+
+    qdr_link_route_t *rc = DEQ_HEAD(core->link_routes);
+    while (rc) {
+        // Convert the passed in identity to a char*
+        char id[100];
+        snprintf(id, 100, "%ld", rc->identity);
+        if (qd_field_iterator_equal(identity, (const unsigned char*) id))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+
+}
+
+
+static qdr_link_route_t *qdr_link_route_config_find_by_name_CT(qdr_core_t *core, qd_field_iterator_t *name)
+{
+    if (!name)
+        return 0;
+
+    qdr_link_route_t *rc = DEQ_HEAD(core->link_routes);
+    while (rc) { // Sometimes the name can be null
+        if (rc->name && qd_field_iterator_equal(name, (const unsigned char*) rc->name))
+            break;
+        rc = DEQ_NEXT(rc);
+    }
+
+    return rc;
+}
+
+
+void qdra_config_link_route_delete_CT(qdr_core_t          *core,
+                                      qdr_query_t         *query,
+                                      qd_field_iterator_t *name,
+                                      qd_field_iterator_t *identity)
+{
+    qdr_link_route_t *lr = 0;
+
+    if (!name && !identity)
+        query->status = QD_AMQP_BAD_REQUEST;
+    else {
+        if (identity)
+            lr = qdr_link_route_config_find_by_identity_CT(core, identity);
+        else if (name)
+            lr = qdr_link_route_config_find_by_name_CT(core, name);
+
+        if (lr) {
+            qdr_route_del_link_route_CT(core, lr);
+            query->status = QD_AMQP_NO_CONTENT;
+        } else
+            query->status = QD_AMQP_NOT_FOUND;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+void qdra_config_link_route_create_CT(qdr_core_t          *core,
+                                      qd_field_iterator_t *name,
+                                      qdr_query_t         *query,
+                                      qd_parsed_field_t   *in_body)
+{
+    while (true) {
+        //
+        // Ensure there isn't a duplicate name and that the body is a map
+        //
+        qdr_link_route_t *lr = DEQ_HEAD(core->link_routes);
+        while (lr) {
+            if (name && lr->name && qd_field_iterator_equal(name, (const unsigned char*) lr->name))
+                break;
+            lr = DEQ_NEXT(lr);
+        }
+
+        if (!!lr) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Name conflicts with an existing entity";
+            break;
+        }
+
+        if (!qd_parse_is_map(in_body)) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        //
+        // Extract the fields from the request
+        //
+        qd_parsed_field_t *prefix_field     = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_PREFIX]);
+        qd_parsed_field_t *distrib_field    = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_DISTRIBUTION]);
+        qd_parsed_field_t *connection_field = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_CONNECTION]);
+        qd_parsed_field_t *container_field  = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_CONTAINER_ID]);
+        qd_parsed_field_t *dir_field        = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_DIR]);
+
+        //
+        // Prefix and dir fields are mandatory.  Fail if they're not both here.
+        //
+        if (!prefix_field || !dir_field) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
+
+        qd_direction_t dir;
+        const char *error = qdra_link_route_direction_CT(dir_field, &dir);
+        if (error) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = error;
+            break;
+        }
+
+        qd_address_treatment_t trt;
+        error = qdra_link_route_treatment_CT(distrib_field, &trt);
+        if (error) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = error;
+            break;
+        }
+
+        //
+        // The request is good.  Create the entity.
+        //
+        bool               is_container = !!container_field;
+        qd_parsed_field_t *in_use_conn  = is_container ? container_field : connection_field;
+
+        qdr_route_add_link_route_CT(core, name, prefix_field, in_use_conn, is_container, trt, dir);
+
+        //
+        // Compose the result map for the response.
+        //
+        if (query->body) {
+            qd_compose_start_map(query->body);
+            for (int col = 0; col < QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT; col++)
+                qdr_config_link_route_insert_column_CT(lr, col, query->body, true);
+            qd_compose_end_map(query->body);
+        }
+
+        query->status = QD_AMQP_CREATED;
+        break;
+    }
+
+    //
+    // Enqueue the response if there is a body. If there is no body, this is a management
+    // operation created internally by the configuration file parser.
+    //
+    if (query->body) {
+        //
+        // If there was an error in processing the create, insert a NULL value into the body.
+        //
+        if (query->status.status / 100 > 2)
+            qd_compose_insert_null(query->body);
+        qdr_agent_enqueue_response_CT(core, query);
+    } else {
+        if (query->status.status / 100 > 2)
+            qd_log(core->log, QD_LOG_ERROR, "Error configuring linkRoute: %s", query->status.description);
+        free_qdr_query_t(query);
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_core/agent_config_link_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_config_link_route.h b/src/router_core/agent_config_link_route.h
new file mode 100644
index 0000000..b470de8
--- /dev/null
+++ b/src/router_core/agent_config_link_route.h
@@ -0,0 +1,35 @@
+#ifndef qdr_agent_config_link_route
+#define qdr_agent_config_link_route 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_config_link_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
+void qdra_config_link_route_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_config_link_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_link_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_config_link_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
+                                qd_field_iterator_t *identity);
+
+#define QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT 8
+
+const char *qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 4e1c57c..a421802 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -156,10 +156,15 @@ void qdr_route_add_link_route_CT(qdr_core_t             *core,
         if (lr->conn_id->open_connection)
             qdr_link_route_activate_CT(core, lr, lr->conn_id->open_connection);
     }
+
+    //
+    // Add the link route to the core list
+    //
+    DEQ_INSERT_TAIL(core->link_routes, lr);
 }
 
 
-void qdr_route_del_link_route_CT(qdr_core_t *core)
+void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr)
 {
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56c5a93f/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index 5fe8202..f725a3d 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -29,7 +29,7 @@ void qdr_route_add_link_route_CT(qdr_core_t             *core,
                                  qd_address_treatment_t  treatment,
                                  qd_direction_t          dir);
 
-void qdr_route_del_link_route_CT(qdr_core_t *core);
+void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr);
 
 void qdr_route_add_auto_link_CT(qdr_core_t             *core,
                                 qd_field_iterator_t    *name,


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


[05/50] [abbrv] qpid-dispatch git commit: DISPATCH-179 - Added control setup for link-routed routes.

Posted by tr...@apache.org.
DISPATCH-179 - Added control setup for link-routed routes.


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

Branch: refs/heads/master
Commit: cad374b1b03adf73bfe9c6793a280231e0e0164f
Parents: dc675a3
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 14:04:03 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 14:04:03 2016 -0500

----------------------------------------------------------------------
 src/router_core/agent_route.c         | 31 ++++++--------------
 src/router_core/route_control.c       | 46 +++++++++++++++++++++---------
 src/router_core/router_core_private.h | 11 +++----
 3 files changed, 47 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/cad374b1/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index a1586c0..7024a86 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -53,11 +53,11 @@ static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_co
 
     switch(col) {
     case QDR_ROUTE_NAME:
-        if (route->name) {
+        if (route->name)
             qd_compose_insert_string(body, route->name);
-            break;
-        }
-        // else fall into IDENTITY
+        else
+            qd_compose_insert_null(body);
+        break;
 
     case QDR_ROUTE_IDENTITY: {
         char id_str[100];
@@ -216,7 +216,10 @@ static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
 void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
                           qdr_query_t *query, qd_parsed_field_t *in_body)
 {
-    // TODO - reject duplicate names
+    // TODO - Validation
+    //    - No duplicate names
+    //    - For "direct" path, no containers or connections
+    //    - For "direct" path, no link-* treatments
 
     while (true) {
         //
@@ -294,24 +297,6 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
             }
         }
 
-        /*
-        switch (route->object_type) {
-        case QDR_ROUTE_TYPE_ADDRESS:
-            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->treatment);
-            break;
-
-        case QDR_ROUTE_TYPE_LINK_DEST:
-            if (route->direction_in)
-                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->treatment);
-            if (route->direction_out)
-                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->treatment);
-            break;
-
-        case QDR_ROUTE_TYPE_WAYPOINT:
-            break;
-        }
-        */
-
         //
         // Compose the result map for the response.
         //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/cad374b1/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 634c1d2..b75f22ee 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -57,7 +57,7 @@ static const char *qdr_configure_address_prefix_CT(qdr_core_t              *core
     return 0;
 }
 
-/*
+
 static const char *qdr_configure_address_CT(qdr_core_t              *core,
                                             qd_parsed_field_t       *addr_field,
                                             char                     cls,
@@ -87,7 +87,16 @@ static const char *qdr_configure_address_CT(qdr_core_t              *core,
     *_addr = addr;
     return 0;
 }
-*/
+
+
+static void qdr_route_free_CT(qdr_core_t *core, qdr_route_config_t *route)
+{
+    if (route->name)
+        free(route->name);
+    // TODO - Clean up address records
+    free_qdr_route_config_t(route);
+}
+
 
 const char *qdr_route_create_CT(qdr_core_t             *core,
                                 qd_field_iterator_t    *name,
@@ -108,21 +117,32 @@ const char *qdr_route_create_CT(qdr_core_t             *core,
     route->path      = path;
     route->treatment = treatment;
 
-    switch (path) {
-    case QDR_ROUTE_PATH_DIRECT:
+    //
+    // Direct message routing - Create a address prefix with the provided treatment.
+    //
+    if (path == QDR_ROUTE_PATH_DIRECT)
         error = qdr_configure_address_prefix_CT(core, addr_field, 'Z', treatment, &route->addr_config);
-        break;
 
-    case QDR_ROUTE_PATH_SOURCE:
-    case QDR_ROUTE_PATH_SINK:
-    case QDR_ROUTE_PATH_WAYPOINT:
-        break;
+    //
+    // Link routing - Create inbound and outbound link-route addresses based on the path.
+    //
+    else if (treatment == QD_TREATMENT_LINK_BALANCED) {
+        if (path == QDR_ROUTE_PATH_SOURCE || path == QDR_ROUTE_PATH_WAYPOINT)
+            error = qdr_configure_address_CT(core, addr_field, 'D', treatment, &route->out_addr);
+        if (path == QDR_ROUTE_PATH_SINK   || path == QDR_ROUTE_PATH_WAYPOINT)
+            error = qdr_configure_address_CT(core, addr_field, 'C', treatment, &route->in_addr);
+    }
+
+    //
+    // Indirect message routing cases - Create a normal address with the provided treatment.
+    //
+    else {
+        error = qdr_configure_address_CT(core, addr_field, '\0', treatment, &route->addr);
     }
 
-    if (error) {
-        if (route->name) free(route->name);
-        free_qdr_route_config_t(route);
-    } else {
+    if (error)
+        qdr_route_free_CT(core, route);
+    else {
         DEQ_INSERT_TAIL(core->route_config, route);
         *_route = route;
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/cad374b1/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 e58e31d..9eb2726 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -418,9 +418,10 @@ struct qdr_route_active_t {
     DEQ_LINKS_N(REF, qdr_route_active_t);
     qdr_route_config_t    *config;
     qdr_conn_identifier_t *conn_id;
-    qd_direction_t         dir;
-    qdr_route_state_t      state;
-    qdr_link_t            *link;
+    qdr_route_state_t      in_state;
+    qdr_route_state_t      out_state;
+    qdr_link_t            *in_link;
+    qdr_link_t            *out_link;
 };
 
 ALLOC_DECLARE(qdr_route_active_t);
@@ -433,8 +434,8 @@ struct qdr_route_config_t {
     qdr_route_path_t         path;
     qdr_address_config_t    *addr_config;
     qdr_address_t           *addr;
-    qdr_address_t           *ingress_addr;
-    qdr_address_t           *egress_addr;
+    qdr_address_t           *in_addr;
+    qdr_address_t           *out_addr;
     qd_address_treatment_t   treatment;
 
     qdr_route_active_list_t  active_list;


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