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