Reduces the dependency of the link providers on the ClusterMetadataService.
Provivers threads can be stuck on getting the cluster metadata.
Keep a local copy and update when receving the events
Change-Id: I5c83e5bbf166a003261dc15c0544b0bca23419d8
diff --git a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
index e73163c..30608e4 100644
--- a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
+++ b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
@@ -17,6 +17,9 @@
import org.onlab.packet.Ethernet;
import org.onlab.packet.ONOSLLDP;
+import org.onosproject.cluster.ClusterMetadata;
+import org.onosproject.cluster.ClusterMetadataEvent;
+import org.onosproject.cluster.ClusterMetadataEventListener;
import org.onosproject.cluster.ClusterMetadataService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
@@ -64,6 +67,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
import static org.onlab.packet.Ethernet.TYPE_BSN;
import static org.onlab.packet.Ethernet.TYPE_LLDP;
@@ -106,7 +110,7 @@
protected CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
- protected ClusterMetadataService metadataService;
+ protected ClusterMetadataService clusterMetadataService;
/** LLDP and BDDP probe rate specified in millis. */
private int probeRate = PROBE_RATE_DEFAULT;
@@ -132,12 +136,15 @@
protected Set<LinkKey> configuredLinks = new HashSet<>();
+ // Cache for clustermetadata
+ private AtomicReference<ClusterMetadata> clusterMetadata = new AtomicReference<>();
+
public NetworkConfigLinksProvider() {
super(new ProviderId("lldp", PROVIDER_NAME));
}
private String buildSrcMac() {
- String srcMac = ProbedLinkProvider.fingerprintMac(metadataService.getClusterMetadata());
+ String srcMac = ProbedLinkProvider.fingerprintMac(clusterMetadata.get());
String defMac = ProbedLinkProvider.defaultMac();
if (srcMac.equals(defMac)) {
log.warn("Couldn't generate fingerprint. Using default value {}", defMac);
@@ -152,6 +159,8 @@
.forEach(linkKey -> configuredLinks.add(linkKey));
}
+ private final ClusterMetadataEventListener metadataListener = new InternalClusterMetadataListener();
+
@Activate
protected void activate() {
log.info("Activated");
@@ -160,6 +169,8 @@
providerService = providerRegistry.register(this);
deviceService.addListener(deviceListener);
netCfgService.addListener(cfgListener);
+ clusterMetadataService.addListener(metadataListener);
+ clusterMetadata.set(clusterMetadataService.getClusterMetadata());
requestIntercepts();
loadDevices();
createLinks();
@@ -171,6 +182,7 @@
providerRegistry.unregister(this);
deviceService.removeListener(deviceListener);
netCfgService.removeListener(cfgListener);
+ clusterMetadataService.removeListener(metadataListener);
packetService.removeProcessor(packetProcessor);
disable();
log.info("Deactivated");
@@ -279,7 +291,8 @@
@Override
public String lldpSecret() {
- return metadataService.getClusterMetadata().getClusterSecret();
+ return clusterMetadata.get() != null ?
+ clusterMetadata.get().getClusterSecret() : null;
}
@Override
@@ -533,4 +546,11 @@
}
}
+ private class InternalClusterMetadataListener implements ClusterMetadataEventListener {
+ @Override
+ public void event(ClusterMetadataEvent event) {
+ clusterMetadata.set(event.subject());
+ }
+ }
+
}