You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2018/12/06 22:08:22 UTC
qpid-dispatch git commit: DISPATCH-1194 - Wired in the link-route
attach forwarding based on address lookup result.
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 58567f979 -> 7a9378d58
DISPATCH-1194 - Wired in the link-route attach forwarding based on address lookup result.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/7a9378d5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/7a9378d5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/7a9378d5
Branch: refs/heads/master
Commit: 7a9378d588edeb66f96770f03a87f05f182b74a2
Parents: 58567f9
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Dec 6 17:07:43 2018 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Dec 6 17:07:43 2018 -0500
----------------------------------------------------------------------
src/router_core/forwarder.c | 79 +++++++++++---------
.../address_lookup_client/lookup_client.c | 27 ++++++-
src/router_core/router_core_private.h | 7 ++
src/router_node.c | 3 -
4 files changed, 77 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7a9378d5/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index e14c70c..0cddb19 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -885,48 +885,59 @@ bool qdr_forward_link_balanced_CT(qdr_core_t *core,
}
if (conn) {
- qdr_link_t *out_link = new_qdr_link_t();
- ZERO(out_link);
- out_link->core = 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;
- out_link->admin_enabled = true;
- out_link->terminus_addr = 0;
-
- if (strip) {
- out_link->strip_prefix = strip;
- }
- if (insert) {
- out_link->insert_prefix = insert;
- }
+ qdr_forward_link_direct_CT(core, conn, in_link, source, target, strip, insert);
+ return true;
+ }
+
+ free(insert);
+ free(strip);
+ return false;
+}
- out_link->oper_status = QDR_LINK_OPER_DOWN;
- out_link->name = strdup(in_link->disambiguated_name ? in_link->disambiguated_name : in_link->name);
+void qdr_forward_link_direct_CT(qdr_core_t *core,
+ qdr_connection_t *conn,
+ qdr_link_t *in_link,
+ qdr_terminus_t *source,
+ qdr_terminus_t *target,
+ char *strip,
+ char *insert)
+{
+ qdr_link_t *out_link = new_qdr_link_t();
+ ZERO(out_link);
+ out_link->core = 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;
+ out_link->admin_enabled = true;
+ out_link->terminus_addr = 0;
+
+ if (strip) {
+ out_link->strip_prefix = strip;
+ }
+ if (insert) {
+ out_link->insert_prefix = insert;
+ }
- out_link->connected_link = in_link;
- in_link->connected_link = out_link;
+ out_link->oper_status = QDR_LINK_OPER_DOWN;
- DEQ_INSERT_TAIL(core->open_links, out_link);
- qdr_add_link_ref(&conn->links, out_link, QDR_LINK_LIST_CLASS_CONNECTION);
+ out_link->name = strdup(in_link->disambiguated_name ? in_link->disambiguated_name : in_link->name);
- 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;
+ out_link->connected_link = in_link;
+ in_link->connected_link = out_link;
- qdr_connection_enqueue_work_CT(core, conn, work);
+ DEQ_INSERT_TAIL(core->open_links, out_link);
+ qdr_add_link_ref(&conn->links, out_link, QDR_LINK_LIST_CLASS_CONNECTION);
- return true;
- }
+ 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;
- free(insert);
- free(strip);
- return false;
+ qdr_connection_enqueue_work_CT(core, conn, work);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7a9378d5/src/router_core/modules/address_lookup_client/lookup_client.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/address_lookup_client/lookup_client.c b/src/router_core/modules/address_lookup_client/lookup_client.c
index 2b575db..9786f6e 100644
--- a/src/router_core/modules/address_lookup_client/lookup_client.c
+++ b/src/router_core/modules/address_lookup_client/lookup_client.c
@@ -472,6 +472,7 @@ static void qcm_addr_lookup_CT(void *context,
if (client->core->router_mode == QD_ROUTER_MODE_EDGE
&& client->client_api_active
+ && conn != client->edge_conn
&& qdr_terminus_get_address(term) != 0) {
//
// We are in edge mode, there is an active edge connection, and the terminus has an address.
@@ -522,6 +523,8 @@ static void on_state(qdr_core_t *core,
while (request) {
DEQ_REMOVE_HEAD(client->pending_requests);
qcm_addr_lookup_local_search(client, request);
+ qdr_terminus_free(request->source);
+ qdr_terminus_free(request->target);
free_qcm_addr_lookup_request_t(request);
request = DEQ_HEAD(client->pending_requests);
}
@@ -566,10 +569,30 @@ static uint64_t on_reply(qdr_core_t *core,
status = qcm_link_route_lookup_decode(app_properties, body, &is_link_route, &has_destinations);
if (status == QCM_ADDR_LOOKUP_OK) {
//
- // TODO - Add resolution using the received data
+ // The lookup decode is of a valid service response.
//
- qcm_addr_lookup_local_search(client, request);
+ if (!is_link_route)
+ //
+ // The address is not for a link route. Use the local search.
+ //
+ qcm_addr_lookup_local_search(client, request);
+
+ else if (!has_destinations)
+ //
+ // The address is for a link route, but there are no destinations upstream. Fail with no-route.
+ //
+ qdr_link_outbound_detach_CT(core, request->link, 0, QDR_CONDITION_NO_ROUTE_TO_DESTINATION, true);
+
+ else
+ //
+ // The address is for a link route and there are destinations upstream. Directly forward the attach.
+ //
+ qdr_forward_link_direct_CT(core, client->edge_conn, request->link, request->source, request->target, 0, 0);
+
} else {
+ //
+ // The reply was not a valid server response. Fall back to the local search.
+ //
qcm_addr_lookup_local_search(client, request);
}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7a9378d5/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 82f6c5e..f191fad 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -50,6 +50,13 @@ int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *
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);
+void qdr_forward_link_direct_CT(qdr_core_t *core,
+ qdr_connection_t *conn,
+ qdr_link_t *in_link,
+ qdr_terminus_t *source,
+ qdr_terminus_t *target,
+ char *strip,
+ char *insert);
typedef enum {
QDR_CONDITION_NO_ROUTE_TO_DESTINATION,
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7a9378d5/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 597b845..3c304b5 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -1262,9 +1262,6 @@ qd_router_t *qd_router(qd_dispatch_t *qd, qd_router_mode_t mode, const char *are
case QD_ROUTER_MODE_ENDPOINT: qd_log(router->log_source, QD_LOG_INFO, "Router started in Endpoint mode"); break;
}
- if (router->router_mode == QD_ROUTER_MODE_EDGE)
- qd_log(router->log_source, QD_LOG_WARNING, "Edge mode is not fully implemented");
-
qd_log(router->log_source, QD_LOG_INFO, "Version: %s", QPID_DISPATCH_VERSION);
return router;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org