You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gm...@apache.org on 2017/03/01 18:06:25 UTC

qpid-dispatch git commit: DISPATCH-640 - Added code to enable the same connection object to be obtained using a containerId and a connectionId

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 9dc17c697 -> 656653aec


DISPATCH-640 - Added code to enable the same connection object to be obtained using a containerId and a connectionId

(cherry picked from commit 04c5bbe480b8447111cebf37086f8e0646dfb89e)


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

Branch: refs/heads/master
Commit: 656653aec898d38ed92ce53deb6125f9dd0edaa9
Parents: 9dc17c6
Author: Ganesh Murthy <gm...@redhat.com>
Authored: Mon Feb 27 09:55:22 2017 -0500
Committer: Ganesh Murthy <gm...@redhat.com>
Committed: Wed Mar 1 12:59:52 2017 -0500

----------------------------------------------------------------------
 src/parse.c                               |  3 +
 src/router_core/agent_config_auto_link.c  | 18 ++++--
 src/router_core/agent_config_link_route.c | 21 ++++--
 src/router_core/connections.c             |  2 +-
 src/router_core/route_control.c           | 88 +++++++++++++++++++-------
 src/router_core/route_control.h           | 12 ++--
 src/router_core/router_core_private.h     |  3 +-
 tests/system_tests_link_routes.py         |  9 +--
 8 files changed, 110 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/src/parse.c
----------------------------------------------------------------------
diff --git a/src/parse.c b/src/parse.c
index dcb4645..48c6a90 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -245,6 +245,9 @@ uint8_t qd_parse_tag(qd_parsed_field_t *field)
 
 qd_iterator_t *qd_parse_raw(qd_parsed_field_t *field)
 {
+    if (!field)
+        return 0;
+
     return field->raw_iter;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/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 cd67d5b..4754623 100644
--- a/src/router_core/agent_config_auto_link.c
+++ b/src/router_core/agent_config_auto_link.c
@@ -99,7 +99,10 @@ static void qdr_config_auto_link_insert_column_CT(qdr_auto_link_t *al, int col,
     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);
+            key = (const char*) qd_hash_key_by_handle(al->conn_id->connection_hash_handle);
+            if (!key)
+                key = (const char*) qd_hash_key_by_handle(al->conn_id->container_hash_handle);
+
             if (key && key[0] == 'L' && col == QDR_CONFIG_AUTO_LINK_CONNECTION) {
                 qd_compose_insert_string(body, &key[1]);
                 break;
@@ -371,6 +374,14 @@ void qdra_config_auto_link_create_CT(qdr_core_t        *core,
         qd_parsed_field_t *container_field  = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_CONTAINER_ID]);
         qd_parsed_field_t *external_addr    = qd_parse_value_by_key(in_body, qdr_config_auto_link_columns[QDR_CONFIG_AUTO_LINK_EXT_ADDR]);
 
+        if (connection_field && container_field) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Both connection and containerId cannot be specified. Specify only one";
+            qd_log(core->agent_log, QD_LOG_ERROR, "Error performing CREATE of %s: %s", CONFIG_AUTOLINK_TYPE, query->status.description);
+            break;
+        }
+
+
         //
         // Addr and dir fields are mandatory.  Fail if they're not both here.
         //
@@ -409,10 +420,7 @@ void qdra_config_auto_link_create_CT(qdr_core_t        *core,
         //
         // 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;
-
-        al = qdr_route_add_auto_link_CT(core, name, addr_field, dir, phase, in_use_conn, is_container, external_addr);
+        al = qdr_route_add_auto_link_CT(core, name, addr_field, dir, phase, container_field, connection_field, external_addr);
 
         //
         // Compose the result map for the response.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/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 c0c79b1..ab2a333 100644
--- a/src/router_core/agent_config_link_route.c
+++ b/src/router_core/agent_config_link_route.c
@@ -101,7 +101,10 @@ static void qdr_config_link_route_insert_column_CT(qdr_link_route_t *lr, int col
     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);
+            key = (const char*) qd_hash_key_by_handle(lr->conn_id->connection_hash_handle);
+            if (!key)
+                key = (const char*) qd_hash_key_by_handle(lr->conn_id->container_hash_handle);
+
             if (key && key[0] == 'L' && col == QDR_CONFIG_LINK_ROUTE_CONNECTION) {
                 qd_compose_insert_string(body, &key[1]);
                 break;
@@ -378,6 +381,17 @@ void qdra_config_link_route_create_CT(qdr_core_t        *core,
         qd_parsed_field_t *dir_field        = qd_parse_value_by_key(in_body, qdr_config_link_route_columns[QDR_CONFIG_LINK_ROUTE_DIR]);
 
         //
+        // Both connection and containerId cannot be specified because both can represent different connections. Only one those
+        // can be specified.
+        //
+        if (connection_field && container_field) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            query->status.description = "Both connection and containerId cannot be specified. Specify only one";
+            qd_log(core->agent_log, QD_LOG_ERROR, "Error performing CREATE of %s: %s", CONFIG_LINKROUTE_TYPE, query->status.description);
+            break;
+        }
+
+        //
         // Prefix and dir fields are mandatory.  Fail if they're not both here.
         //
         if (!prefix_field || !dir_field) {
@@ -408,10 +422,7 @@ void qdra_config_link_route_create_CT(qdr_core_t        *core,
         //
         // 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;
-
-        lr = 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, container_field, connection_field, trt, dir);
 
         //
         // Compose the result map for the response.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 2abb7fc..96cbd52 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -1093,7 +1093,7 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
             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_route_connection_opened_CT(core, conn, action->args.connection.container_id, action->args.connection.connection_label);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
index 022aebb..7101ca4 100644
--- a/src/router_core/route_control.c
+++ b/src/router_core/route_control.c
@@ -20,27 +20,63 @@
 #include "route_control.h"
 #include <inttypes.h>
 #include <stdio.h>
+#include <qpid/dispatch/iterator.h>
 
 ALLOC_DEFINE(qdr_link_route_t);
 ALLOC_DEFINE(qdr_auto_link_t);
 ALLOC_DEFINE(qdr_conn_identifier_t);
 
+const char CONTAINER_PREFIX = 'C';
+const char CONNECTION_PREFIX = 'L';
+
 
 static qdr_conn_identifier_t *qdr_route_declare_id_CT(qdr_core_t    *core,
-                                                      qd_iterator_t *conn_id,
-                                                      bool           is_container)
+                                                      qd_iterator_t *container,
+                                                      qd_iterator_t *connection)
 {
-    char                   prefix = is_container ? 'C' : 'L';
     qdr_conn_identifier_t *cid    = 0;
 
-    qd_iterator_reset_view(conn_id, ITER_VIEW_ADDRESS_HASH);
-    qd_iterator_annotate_prefix(conn_id, prefix);
+    if (container && connection) {
+        qd_iterator_reset_view(container, ITER_VIEW_ADDRESS_HASH);
+        qd_iterator_annotate_prefix(container, CONTAINER_PREFIX);
+        qd_hash_retrieve(core->conn_id_hash, container, (void**) &cid);
+
+        if (!cid) {
+            qd_iterator_reset_view(connection, ITER_VIEW_ADDRESS_HASH);
+            qd_iterator_annotate_prefix(connection, CONNECTION_PREFIX);
+            qd_hash_retrieve(core->conn_id_hash, connection, (void**) &cid);
+        }
+
+        if (!cid) {
+            cid = new_qdr_conn_identifier_t();
+            ZERO(cid);
+            //
+            // The container and the connection will represent the same connection.
+            //
+            qd_hash_insert(core->conn_id_hash, container, cid, &cid->container_hash_handle);
+            qd_hash_insert(core->conn_id_hash, connection, cid, &cid->connection_hash_handle);
+        }
+    }
+    else if (container) {
+        qd_iterator_reset_view(container, ITER_VIEW_ADDRESS_HASH);
+        qd_iterator_annotate_prefix(container, CONTAINER_PREFIX);
+        qd_hash_retrieve(core->conn_id_hash, container, (void**) &cid);
+        if (!cid) {
+            cid = new_qdr_conn_identifier_t();
+            ZERO(cid);
+            qd_hash_insert(core->conn_id_hash, container, cid, &cid->container_hash_handle);
+        }
+    }
+    else if (connection) {
+        qd_iterator_reset_view(connection, ITER_VIEW_ADDRESS_HASH);
+        qd_iterator_annotate_prefix(connection, CONNECTION_PREFIX);
+        qd_hash_retrieve(core->conn_id_hash, connection, (void**) &cid);
+        if (!cid) {
+            cid = new_qdr_conn_identifier_t();
+            ZERO(cid);
+            qd_hash_insert(core->conn_id_hash, connection, cid, &cid->connection_hash_handle);
+        }
 
-    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;
@@ -54,7 +90,8 @@ static void qdr_route_check_id_for_deletion_CT(qdr_core_t *core, qdr_conn_identi
     // it can safely be deleted and removed from the hash index.
     //
     if (DEQ_IS_EMPTY(cid->connection_refs) && 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);
+        qd_hash_remove_by_handle(core->conn_id_hash, cid->connection_hash_handle);
+        qd_hash_remove_by_handle(core->conn_id_hash, cid->container_hash_handle);
         free_qdr_conn_identifier_t(cid);
     }
 }
@@ -62,7 +99,9 @@ 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, 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);
+    const char *key = (const char*) qd_hash_key_by_handle(conn->conn_id->connection_hash_handle);
+    if (!key)
+        key = (const char*) qd_hash_key_by_handle(conn->conn_id->container_hash_handle);
     char  id_string[64];
     const char *log_name = name ? name : id_string;
 
@@ -166,8 +205,8 @@ static void qdr_auto_link_deactivate_CT(qdr_core_t *core, qdr_auto_link_t *al, q
 qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t             *core,
                                               qd_iterator_t          *name,
                                               qd_parsed_field_t      *prefix_field,
-                                              qd_parsed_field_t      *conn_id,
-                                              bool                    is_container,
+                                              qd_parsed_field_t      *container_field,
+                                              qd_parsed_field_t      *connection_field,
                                               qd_address_treatment_t  treatment,
                                               qd_direction_t          dir)
 {
@@ -201,8 +240,8 @@ qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t             *core,
     //
     // Find or create a connection identifier structure for this link route
     //
-    if (conn_id) {
-        lr->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(conn_id), is_container);
+    if (container_field || connection_field) {
+        lr->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(container_field), qd_parse_raw(connection_field));
         DEQ_INSERT_TAIL_N(REF, lr->conn_id->link_route_refs, lr);
         qdr_connection_ref_t * cref = DEQ_HEAD(lr->conn_id->connection_refs);
         while (cref) {
@@ -259,8 +298,8 @@ qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
                                             qd_parsed_field_t   *addr_field,
                                             qd_direction_t       dir,
                                             int                  phase,
-                                            qd_parsed_field_t   *conn_id,
-                                            bool                 is_container,
+                                            qd_parsed_field_t   *container_field,
+                                            qd_parsed_field_t   *connection_field,
                                             qd_parsed_field_t   *external_addr)
 {
     qdr_auto_link_t *al = new_qdr_auto_link_t();
@@ -295,8 +334,8 @@ qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
     //
     // 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);
+    if (container_field || connection_field) {
+        al->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(container_field), qd_parse_raw(connection_field));
         DEQ_INSERT_TAIL_N(REF, al->conn_id->auto_link_refs, al);
         qdr_connection_ref_t * cref = DEQ_HEAD(al->conn_id->connection_refs);
         while (cref) {
@@ -351,13 +390,14 @@ void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *al)
 
 void qdr_route_connection_opened_CT(qdr_core_t       *core,
                                     qdr_connection_t *conn,
-                                    qdr_field_t      *field,
-                                    bool              is_container)
+                                    qdr_field_t      *container_field,
+                                    qdr_field_t      *connection_field)
 {
-    if (conn->role != QDR_ROLE_ROUTE_CONTAINER || !field)
+    if (conn->role != QDR_ROLE_ROUTE_CONTAINER)
         return;
 
-    qdr_conn_identifier_t *cid = qdr_route_declare_id_CT(core, field->iterator, is_container);
+    qdr_conn_identifier_t *cid = qdr_route_declare_id_CT(core,
+            container_field?container_field->iterator:0, connection_field?connection_field->iterator:0);
 
     qdr_add_connection_ref(&cid->connection_refs, conn);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
index a09a756..39bb32c 100644
--- a/src/router_core/route_control.h
+++ b/src/router_core/route_control.h
@@ -24,8 +24,8 @@
 qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t             *core,
                                               qd_iterator_t          *name,
                                               qd_parsed_field_t      *prefix_field,
-                                              qd_parsed_field_t      *conn_id,
-                                              bool                    is_container,
+                                              qd_parsed_field_t      *container_field,
+                                              qd_parsed_field_t      *connection_field,
                                               qd_address_treatment_t  treatment,
                                               qd_direction_t          dir);
 
@@ -36,16 +36,16 @@ qdr_auto_link_t *qdr_route_add_auto_link_CT(qdr_core_t          *core,
                                             qd_parsed_field_t   *addr_field,
                                             qd_direction_t       dir,
                                             int                  phase,
-                                            qd_parsed_field_t   *conn_id,
-                                            bool                 is_container,
+                                            qd_parsed_field_t      *container_field,
+                                            qd_parsed_field_t      *connection_field,
                                             qd_parsed_field_t   *external_addr);
 
 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,
-                                    qdr_field_t      *field,
-                                    bool              is_container);
+                                    qdr_field_t      *container_field,
+                                    qdr_field_t      *connection_field);
 
 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/656653ae/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 639605e..c657391 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -536,7 +536,8 @@ DEQ_DECLARE(qdr_auto_link_t, qdr_auto_link_list_t);
 
 
 struct qdr_conn_identifier_t {
-    qd_hash_handle_t          *hash_handle;
+    qd_hash_handle_t          *connection_hash_handle;
+    qd_hash_handle_t          *container_hash_handle;
     qdr_connection_ref_list_t  connection_refs;
     qdr_link_route_list_t      link_route_refs;
     qdr_auto_link_list_t       auto_link_refs;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/656653ae/tests/system_tests_link_routes.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_link_routes.py b/tests/system_tests_link_routes.py
index c74a629..5648920 100644
--- a/tests/system_tests_link_routes.py
+++ b/tests/system_tests_link_routes.py
@@ -89,8 +89,9 @@ class LinkRouteTest(TestCase):
                    # a connection from the router B's ephemeral port to c_listener_port
                    ('connector', {'name': 'routerC', 'role': 'inter-router', 'host': '0.0.0.0', 'port': c_listener_port}),
 
-                   ('linkRoute', {'prefix': 'org.apache', 'connection': 'broker', 'dir': 'in'}),
-                   ('linkRoute', {'prefix': 'org.apache', 'connection': 'broker', 'dir': 'out'}),
+                   #('linkRoute', {'prefix': 'org.apache', 'connection': 'broker', 'dir': 'in'}),
+                   ('linkRoute', {'prefix': 'org.apache', 'containerId': 'QDR.A', 'dir': 'in'}),
+                   ('linkRoute', {'prefix': 'org.apache', 'containerId': 'QDR.A', 'dir': 'out'}),
 
                    ('linkRoute', {'prefix': 'pulp.task', 'connection': 'test-tag', 'dir': 'in'}),
                    ('linkRoute', {'prefix': 'pulp.task', 'connection': 'test-tag', 'dir': 'out'})
@@ -153,7 +154,7 @@ class LinkRouteTest(TestCase):
         # Make sure there is a dir of in and out.
         self.assertTrue('"dir": "in"' in out)
         self.assertTrue('"dir": "out"' in out)
-        self.assertTrue('"connection": "broker"' in out)
+        self.assertTrue('"containerId": "QDR.A"' in out)
 
         # Use the long type and make sure that qdmanage does not mess up the long type
         cmd = 'QUERY --type=org.apache.qpid.dispatch.router.config.linkRoute'
@@ -162,7 +163,7 @@ class LinkRouteTest(TestCase):
         # Make sure there is a dir of in and out.
         self.assertTrue('"dir": "in"' in out)
         self.assertTrue('"dir": "out"' in out)
-        self.assertTrue('"connection": "broker"' in out)
+        self.assertTrue('"containerId": "QDR.A"' in out)
 
         identity = out[out.find("identity") + 12: out.find("identity") + 13]
         cmd = 'READ --type=linkRoute --identity=' + identity


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