Fix for ONOS Jira Bug 8060
Change-Id: I4d5cf5af4adf343a66d1b752c8d9459dd30e8cdd
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
index c66b6e4..edbe75c 100644
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
@@ -13,6 +13,7 @@
package org.onosproject.bgp.controller.impl;
+import com.google.common.collect.Maps;
import com.google.common.base.MoreObjects;
import org.onosproject.bgp.controller.BgpController;
import org.onosproject.bgp.controller.BgpId;
@@ -37,7 +38,6 @@
import java.util.Map;
import java.util.Set;
-import java.util.TreeMap;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -49,16 +49,16 @@
private static final Logger log = LoggerFactory.getLogger(BgpLocalRibImpl.class);
private BgpController bgpController;
- private Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> nodeTree = new TreeMap<>();
- private Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib> linkTree = new TreeMap<>();
- private Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib> prefixTree = new TreeMap<>();
+ private final Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> nodeTree = Maps.newConcurrentMap();
+ private final Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib> linkTree = Maps.newConcurrentMap();
+ private final Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib> prefixTree = Maps.newConcurrentMap();
- private Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnNodeTree
- = new TreeMap<>();
- private Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnLinkTree
- = new TreeMap<>();
- private Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnPrefixTree
- = new TreeMap<>();
+ private final Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnNodeTree
+ = Maps.newConcurrentMap();
+ private final Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnLinkTree
+ = Maps.newConcurrentMap();
+ private final Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnPrefixTree
+ = Maps.newConcurrentMap();
public BgpLocalRibImpl(BgpController bgpController) {
this.bgpController = bgpController;
@@ -270,13 +270,12 @@
boolean containsKey;
BgpNodeLSIdentifier nodeLsIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
-
+ /* Here, we are checking if the given node is contained in the AdjacencyRib of any peer
+ or not. If none of the peer's AdjacencyRib has it, node can be marked for deletion.
+ */
+ boolean shouldDeleteNode = false;
if (nodeTree.containsKey(nodeLsIdentifier)) {
- for (BgpNodeListener l : bgpController.listener()) {
- l.deleteNode((BgpNodeLSNlriVer4) nlri);
- }
- log.debug("Local RIB delete node: {}", nodeLsIdentifier.toString());
- nodeTree.remove(nodeLsIdentifier);
+ shouldDeleteNode = true;
}
for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
@@ -306,21 +305,19 @@
nodeTree.replace(nodeLsIdentifier, detailsLocRib);
log.debug("Local RIB node updated: {}", detailsLocRib.toString());
}
- } else {
- if (!isVpnRib) {
- if (peer.adjacencyRib().nodeTree().containsKey(nodeLsIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.adjacencyRib().nodeTree().get(nodeLsIdentifier));
- }
- } else {
- if (peer.vpnAdjacencyRib().nodeTree().containsKey(nodeLsIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().nodeTree().get(nodeLsIdentifier));
- }
- }
+ shouldDeleteNode = false;
}
}
+ if (shouldDeleteNode) {
+ log.debug("Local RIB delete node: {}", nodeLsIdentifier.toString());
+ for (BgpNodeListener l : bgpController.listener()) {
+ l.deleteNode((BgpNodeLSNlriVer4) nlri);
+ }
+ nodeTree.remove(nodeLsIdentifier);
+ }
}
- /**
+ /**
* Selection process for local RIB link.
*
* @param nlri NLRI to update
@@ -334,13 +331,12 @@
boolean containsKey;
BgpLinkLSIdentifier linkLsIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
-
+ /* Here, we are checking if the given link is contained in the AdjacencyRib of any peer
+ or not. If none of the peer's AdjacencyRib has it, link can be marked for deletion.
+ */
+ boolean shouldDeleteLink = false;
if (linkTree.containsKey(linkLsIdentifier)) {
- log.debug("Local RIB remove link: {}", linkLsIdentifier.toString());
- for (BgpLinkListener l : bgpController.linkListener()) {
- l.deleteLink((BgpLinkLsNlriVer4) nlri);
- }
- linkTree.remove(linkLsIdentifier);
+ shouldDeleteLink = true;
}
for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
@@ -373,21 +369,21 @@
linkTree.replace(linkLsIdentifier, detailsLocRib);
log.debug("Local RIB link updated: {}", detailsLocRib.toString());
}
- } else {
- if (!isVpnRib) {
- if (peer.adjacencyRib().linkTree().containsKey(linkLsIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.adjacencyRib().linkTree().get(linkLsIdentifier));
- }
- } else {
- if (peer.vpnAdjacencyRib().linkTree().containsKey(linkLsIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().linkTree().get(linkLsIdentifier));
- }
- }
+ shouldDeleteLink = false;
}
}
+
+ if (shouldDeleteLink) {
+ log.debug("Local RIB remove link: {}", linkLsIdentifier.toString());
+ for (BgpLinkListener l : bgpController.linkListener()) {
+ l.deleteLink((BgpLinkLsNlriVer4) nlri);
+ }
+ linkTree.remove(linkLsIdentifier);
+
+ }
}
- /**
+ /**
* Selection process for local RIB prefix.
*
* @param nlri NLRI to update
@@ -401,12 +397,12 @@
boolean containsKey;
BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+ /* Here, we are checking if the given prefix is contained in the AdjacencyRib of any peer
+ or not. If none of the peer's AdjacencyRib has it, prefix can be marked for deletion.
+ */
+ boolean shouldDeletePrefix = false;
if (prefixTree.containsKey(prefixIdentifier)) {
- log.debug("Local RIB remove prefix: {}", prefixIdentifier.toString());
- for (BgpPrefixListener l : bgpController.prefixListener()) {
- l.deletePrefix((BgpPrefixIPv4LSNlriVer4) nlri);
- }
- prefixTree.remove(prefixIdentifier);
+ shouldDeletePrefix = true;
}
for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
@@ -438,16 +434,14 @@
prefixTree.replace(prefixIdentifier, detailsLocRib);
log.debug("Local RIB prefix updated: {}", detailsLocRib.toString());
}
- } else {
- if (!isVpnRib) {
- if (peer.adjacencyRib().prefixTree().containsKey(prefixIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.adjacencyRib().prefixTree().get(prefixIdentifier));
- } else {
- if (peer.vpnAdjacencyRib().prefixTree().containsKey(prefixIdentifier)) {
- add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().prefixTree().get(prefixIdentifier));
- }
- }
+ shouldDeletePrefix = false;
+ }
+ if (shouldDeletePrefix) {
+ log.debug("Local RIB remove prefix: {}", prefixIdentifier.toString());
+ for (BgpPrefixListener l : bgpController.prefixListener()) {
+ l.deletePrefix((BgpPrefixIPv4LSNlriVer4) nlri);
}
+ prefixTree.remove(prefixIdentifier);
}
}
}