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