You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2020/07/08 18:16:01 UTC

[qpid-dispatch] branch master updated: DISPATCH-1693: Fix calculation of when to raise QDRC_EVENTs

This is an automated email from the ASF dual-hosted git repository.

chug pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/master by this push:
     new bb89cc7  DISPATCH-1693: Fix calculation of when to raise QDRC_EVENTs
bb89cc7 is described below

commit bb89cc702d5c72fedd09c4043710a7abf91a6ea3
Author: Chuck Rolke <ch...@apache.org>
AuthorDate: Wed Jul 8 14:11:32 2020 -0400

    DISPATCH-1693: Fix calculation of when to raise QDRC_EVENTs
    
    In qdr_core_bind_address_link_CT and qdr_core_unbind_address_link_CT
    the events were raised at the wrong times for edge routers. This
    effectively closed links to valid fallback receivers in the core network.
---
 src/router_core/router_core.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index c4ceae1..d2d24d9 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -575,14 +575,20 @@ void qdr_core_bind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, qdr_li
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_DEST, addr);
     } else {  // link->link_direction == QD_INCOMING
         qdr_add_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
-        if (DEQ_SIZE(addr->inlinks) == 1) {
+        qdr_address_t *fallback_for = addr->fallback_for;
+
+        if (DEQ_SIZE(addr->inlinks) + (!!fallback_for ? DEQ_SIZE(fallback_for->inlinks) : 0) == 1)
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_SOURCE, addr);
-            if (!!addr->fallback && !link->fallback)
-                qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_SOURCE, addr->fallback);
-        } else if (DEQ_SIZE(addr->inlinks) == 2) {
+        else if (DEQ_SIZE(addr->inlinks) + (!!fallback_for ? DEQ_SIZE(fallback_for->inlinks) : 0) == 2)
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_SOURCE, addr);
-            if (!!addr->fallback && !link->fallback)
-                qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_SOURCE, addr->fallback);
+
+        qdr_address_t *fallback = addr->fallback;
+        if (!!fallback) {
+            size_t combined_in = DEQ_SIZE(addr->inlinks) + DEQ_SIZE(fallback->inlinks);
+            if (combined_in == 1)
+                qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_SOURCE, fallback);
+            else if (combined_in == 2)
+                qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_SOURCE, fallback);
         }
     }
 }
@@ -598,17 +604,22 @@ void qdr_core_unbind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, qdr_
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST, addr);
         } else if (DEQ_SIZE(addr->rlinks) == 1 && qd_bitmask_cardinality(addr->rnodes) == 0)
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_LOCAL_DEST, addr);
-    } else {
+    } else {  // link->link_direction == QD_INCOMING
         bool removed = qdr_del_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
         if (removed) {
-            if (DEQ_SIZE(addr->inlinks) == 0) {
+            qdr_address_t *fallback_for = addr->fallback_for;
+            if (DEQ_SIZE(addr->inlinks) + (!!fallback_for ? DEQ_SIZE(fallback_for->inlinks) : 0) == 0)
                 qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_SOURCE, addr);
-                if (!!addr->fallback && !link->fallback)
-                    qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_SOURCE, addr->fallback);
-            } else if (DEQ_SIZE(addr->inlinks) == 1) {
+            else if (DEQ_SIZE(addr->inlinks) + (!!fallback_for ? DEQ_SIZE(fallback_for->inlinks) : 0) == 1)
                 qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_SOURCE, addr);
-                if (!!addr->fallback && !link->fallback)
-                    qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_SOURCE, addr->fallback);
+
+            qdr_address_t *fallback = addr->fallback;
+            if (!!fallback) {
+                size_t combined_in = DEQ_SIZE(addr->inlinks) + DEQ_SIZE(fallback->inlinks);
+                if (combined_in == 0)
+                    qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_SOURCE, fallback);
+                else if (combined_in == 1)
+                    ; // Don't do anything in this case.  Raising the event will cause the fallback uplink to be dropped
             }
         }
     }


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