From 19a3a5142a0f34d1eba29250c9787e69f3d2cbbf Mon Sep 17 00:00:00 2001 From: Milos Fabian Date: Tue, 26 Jul 2016 16:04:52 +0200 Subject: [PATCH] Bug 5061 - introduce peer restarting When RIB configuration is modified all related peer are supposed to be restart with modified RIB. Introduce such function for BgpPeer/App, preserve current Neighbor configuration internally. Change-Id: I608a564a956f255bdb89603e736dd78cd60fef62 Signed-off-by: Milos Fabian --- .../protocol/bgp/rib/impl/config/AppPeer.java | 9 ++++++++ .../bgp/rib/impl/config/BgpDeployerImpl.java | 17 ++++++++++++++ .../protocol/bgp/rib/impl/config/BgpPeer.java | 22 ++++++++++++------- .../bgp/rib/impl/config/PeerBean.java | 2 ++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java index bd66144458..0481d9d719 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.bgp.rib.impl.config; +import com.google.common.base.Preconditions; import com.google.common.base.Strings; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; @@ -29,9 +30,11 @@ public class AppPeer implements PeerBean { private ApplicationPeer applicationPeer; private ListenerRegistration registration; + private Neighbor currentConfiguration; @Override public void start(final RIB rib, final Neighbor neighbor, final BGPOpenConfigMappingService mappingService) { + this.currentConfiguration = Preconditions.checkNotNull(neighbor); final ApplicationRibId appRibId = createAppRibId(neighbor); this.applicationPeer = new ApplicationPeer(appRibId, neighbor.getNeighborAddress().getIpv4Address(), rib); final YangInstanceIdentifier yangIId = YangInstanceIdentifier.builder().node(ApplicationRib.QNAME) @@ -40,6 +43,12 @@ public class AppPeer implements PeerBean { this.applicationPeer); } + @Override + public void restart(final RIB rib, final BGPOpenConfigMappingService mappingService) { + Preconditions.checkState(this.currentConfiguration != null); + start(rib, this.currentConfiguration, mappingService); + } + @Override public void close() { if (this.applicationPeer != null) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java index 12741051b1..0804d72c58 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java @@ -17,11 +17,14 @@ import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; import java.util.Collection; import java.util.Dictionary; import java.util.HashMap; import java.util.Hashtable; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -165,12 +168,26 @@ public final class BgpDeployerImpl implements BgpDeployer, ClusteredDataTreeChan //if not exists, create a new instance onGlobalCreated(rootIdentifier, global, null); } else if (!ribImpl.isGlobalEqual(global)) { + final List closedPeers = closeAllBindedPeers(rootIdentifier); ribImpl.close(); initiateRibInstance(rootIdentifier, global, ribImpl, null); + closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService)); } LOG.debug("RIB instance modified {}", ribImpl); } + private List closeAllBindedPeers(final InstanceIdentifier rootIdentifier) { + final List filtered = new ArrayList<>(); + for (final Entry, PeerBean> entry : this.peers.entrySet()) { + if (entry.getKey().contains(rootIdentifier)) { + final PeerBean peer = entry.getValue(); + peer.close(); + filtered.add(peer); + } + } + return filtered; + } + @Override public synchronized void onGlobalCreated(final InstanceIdentifier rootIdentifier, final Global global, final WriteConfiguration configurationWriter) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java index a80b5de4b9..19279574d9 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java @@ -61,11 +61,10 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean { private final BGPPeerRegistry peerRegistry; private BGPPeer bgpPeer; - private IpAddress neighborAddress; - private Future connection; private ServiceRegistration serviceRegistration; + private Neighbor currentConfiguration; public BgpPeer(final RpcProviderRegistry rpcRegistry, final BGPPeerRegistry peerRegistry) { this.rpcRegistry = rpcRegistry; @@ -75,22 +74,29 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean { @Override public void start(final RIB rib, final Neighbor neighbor, final BGPOpenConfigMappingService mappingService) { Preconditions.checkState(this.bgpPeer == null, "Previous peer instance {} was not closed."); - this.neighborAddress = neighbor.getNeighborAddress(); - this.bgpPeer = new BGPPeer(Ipv4Util.toStringIP(this.neighborAddress), rib, + this.currentConfiguration = Preconditions.checkNotNull(neighbor); + final IpAddress neighborAddress = neighbor.getNeighborAddress(); + this.bgpPeer = new BGPPeer(Ipv4Util.toStringIP(neighborAddress), rib, mappingService.toPeerRole(neighbor), this.rpcRegistry); final List bgpParameters = getBgpParameters(neighbor, rib, mappingService); final KeyMapping key = OpenConfigMappingUtil.getNeighborKey(neighbor); final BGPSessionPreferences prefs = new BGPSessionPreferences(rib.getLocalAs(), getHoldTimer(neighbor), rib.getBgpIdentifier(), getPeerAs(neighbor, rib), bgpParameters, getPassword(key)); - this.peerRegistry.addPeer(this.neighborAddress, this.bgpPeer, prefs); + this.peerRegistry.addPeer(neighborAddress, this.bgpPeer, prefs); if (OpenConfigMappingUtil.isActive(neighbor)) { this.connection = rib.getDispatcher().createReconnectingClient( - Ipv4Util.toInetSocketAddress(this.neighborAddress, PORT), this.peerRegistry, + Ipv4Util.toInetSocketAddress(neighborAddress, PORT), this.peerRegistry, OpenConfigMappingUtil.getRetryTimer(neighbor), Optional.fromNullable(key)); } } + @Override + public void restart(final RIB rib, final BGPOpenConfigMappingService mappingService) { + Preconditions.checkState(this.currentConfiguration != null); + start(rib, this.currentConfiguration, mappingService); + } + @Override public void close() { if (this.bgpPeer != null) { @@ -100,8 +106,8 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean { } this.bgpPeer.close(); this.bgpPeer = null; - this.peerRegistry.removePeer(this.neighborAddress); - this.neighborAddress = null; + this.peerRegistry.removePeer(this.currentConfiguration.getNeighborAddress()); + this.currentConfiguration = null; if (this.serviceRegistration != null) { this.serviceRegistration.unregister(); this.serviceRegistration = null; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java index 64034e0fb2..2ebf98c524 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java @@ -20,6 +20,8 @@ public interface PeerBean extends AutoCloseable { void start(RIB rib, Neighbor neighbor, BGPOpenConfigMappingService mappingService); + void restart(RIB rib, BGPOpenConfigMappingService mappingService); + @Override void close(); -- 2.36.6