From d8ac9d574f9ea9813782d01f44fc2ca4bde3c1b8 Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Tue, 26 Dec 2017 11:40:23 -0500 Subject: [PATCH] Refactor ElanUtil interface maps to a non-static singleton Created an ElanInterfaceCache class to replace the static elanInterfaceLocalCache and elanInstanceToInterfacesCache Maps in ElanUtils. Change-Id: I0f362fe749e1ab9e13ac2f0a92667d4336d43e72 Signed-off-by: Tom Pantelis --- .../elan/cache/ElanInterfaceCache.java | 86 +++++++++++++ .../elan/internal/ElanInstanceManager.java | 9 +- .../internal/ElanInterfaceConfigListener.java | 10 +- .../elan/internal/ElanInterfaceManager.java | 12 +- .../ElanInterfaceStateChangeListener.java | 19 +-- .../ElanLearntVpnVipToPortListener.java | 21 ++-- .../elan/internal/ElanServiceProvider.java | 40 +++--- .../elan/statisitcs/ElanStatisticsImpl.java | 17 +-- .../utils/CacheElanInterfaceListener.java | 86 ------------- .../netvirt/elan/utils/ElanDmacUtils.java | 29 +++-- .../netvirt/elan/utils/ElanUtils.java | 115 +++++------------- 11 files changed, 204 insertions(+), 240 deletions(-) create mode 100644 elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java delete mode 100644 elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java new file mode 100644 index 0000000000..546d238ea3 --- /dev/null +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017 Inocybe Technologies and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.netvirt.elan.cache; + +import com.google.common.base.Optional; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nonnull; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.genius.mdsalutil.cache.DataObjectCache; +import org.opendaylight.infrautils.caches.CacheProvider; +import org.opendaylight.netvirt.elan.utils.ElanUtils; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Caches ElanInterface instances by name and the set of ElanInterfacenames by elen instance name. + * + * @author Thomas Pantelis + */ +@Singleton +public class ElanInterfaceCache extends DataObjectCache { + private static final Logger LOG = LoggerFactory.getLogger(ElanInterface.class); + + private final Map> elanInstanceToInterfacesCache = new ConcurrentHashMap<>(); + + @Inject + public ElanInterfaceCache(DataBroker dataBroker, CacheProvider cacheProvider) { + super(ElanInterface.class, dataBroker, LogicalDatastoreType.CONFIGURATION, + InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class), cacheProvider); + } + + @Nonnull + public Optional get(@Nonnull String interfaceName) { + try { + return get(ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName)); + } catch (ReadFailedException e) { + LOG.warn("Error reading ElanInterface {}", interfaceName, e); + return Optional.absent(); + } + } + + @Nonnull + public Optional getEtreeInterface(@Nonnull String interfaceName) { + Optional elanInterface = get(interfaceName); + return elanInterface.isPresent() ? Optional.fromNullable( + elanInterface.get().getAugmentation(EtreeInterface.class)) : Optional.absent(); + } + + @Nonnull + public Collection getInterfaceNames(@Nonnull String elanInstanceName) { + Set removed = elanInstanceToInterfacesCache.remove(elanInstanceName); + return removed != null ? Collections.unmodifiableCollection(removed) : Collections.emptySet(); + } + + @Override + protected void added(InstanceIdentifier path, ElanInterface elanInterface) { + elanInstanceToInterfacesCache.computeIfAbsent(elanInterface.getElanInstanceName(), + key -> ConcurrentHashMap.newKeySet()).add(elanInterface.getName()); + } + + @Override + protected void removed(InstanceIdentifier path, ElanInterface elanInterface) { + String elanInstanceName = elanInterface.getElanInstanceName(); + elanInstanceToInterfacesCache.computeIfPresent(elanInstanceName , (key, prevInterfacesSet) -> { + prevInterfacesSet.remove(elanInterface.getName()); + return !prevInterfacesSet.isEmpty() ? prevInterfacesSet : null; + }); + } +} diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java index 5a55dd6219..c155057cdf 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java @@ -26,6 +26,7 @@ import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; import org.opendaylight.genius.mdsalutil.MDSALUtil; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.netvirt.elan.ElanException; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; @@ -52,17 +53,20 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase { + elanInterfaceCache.getInterfaceNames(elanName).forEach(elanInterfaceName -> { jobCoordinator.enqueueJob(ElanUtils.getElanInterfaceJobKey(elanInterfaceName), () -> { WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction(); LOG.info("Deleting the elanInterface present under ConfigDS:{}", elanInterfaceName); ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION, ElanUtils.getElanInterfaceConfigurationDataPathId(elanInterfaceName)); elanInterfaceManager.unbindService(elanInterfaceName, writeConfigTxn); - ElanUtils.removeElanInterfaceToElanInstanceCache(elanName, elanInterfaceName); LOG.info("unbind the Interface:{} service bounded to Elan:{}", elanInterfaceName, elanName); return Collections.singletonList(writeConfigTxn.submit()); }, ElanConstants.JOB_MAX_RETRIES); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java index c5ab4442ab..868617c967 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.internal; +import com.google.common.base.Optional; import java.util.Collections; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -16,6 +17,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; @@ -35,14 +37,16 @@ public class ElanInterfaceConfigListener private final DataBroker dataBroker; private final ElanInterfaceManager elanInterfaceManager; private final JobCoordinator jobCoordinator; + private final ElanInterfaceCache elanInterfaceCache; @Inject public ElanInterfaceConfigListener(DataBroker dataBroker, ElanInterfaceManager elanInterfaceManager, - JobCoordinator jobCoordinator) { + JobCoordinator jobCoordinator, ElanInterfaceCache elanInterfaceCache) { super(Interface.class, ElanInterfaceConfigListener.class); this.dataBroker = dataBroker; this.elanInterfaceManager = elanInterfaceManager; this.jobCoordinator = jobCoordinator; + this.elanInterfaceCache = elanInterfaceCache; } @Override @@ -68,8 +72,8 @@ public class ElanInterfaceConfigListener } String interfaceName = intrf.getName(); - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(dataBroker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { LOG.debug("There is no ELAN service for interface {}. Ignoring it", interfaceName); return; } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index 8b77a03a00..65ad1ae979 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -60,6 +60,7 @@ import org.opendaylight.genius.utils.ServiceIndex; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.netvirt.elan.ElanException; import org.opendaylight.netvirt.elan.cache.ElanInstanceCache; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils; import org.opendaylight.netvirt.elan.utils.ElanConstants; @@ -146,6 +147,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase> unProcessedElanInterfaces = new ConcurrentHashMap<>(); @@ -158,7 +160,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase listBucket, InterfaceInfo ifInfo) { - EtreeInterface etreeInterface = ElanUtils.getEtreeInterfaceByElanInterfaceName(broker, ifName); - if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { + Optional etreeInterface = elanInterfaceCache.getEtreeInterface(ifName); + if (etreeInterface.isPresent() && etreeInterface.get().getEtreeInterfaceType() == EtreeInterfaceType.Root) { listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); bucketId++; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java index a4dfd14649..19d3a27924 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.internal; +import com.google.common.base.Optional; import java.math.BigInteger; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -18,6 +19,7 @@ import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; import org.opendaylight.genius.mdsalutil.MDSALUtil; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.netvirt.elan.cache.ElanInstanceCache; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; @@ -40,15 +42,18 @@ public class ElanInterfaceStateChangeListener private final ElanInterfaceManager elanInterfaceManager; private final JobCoordinator jobCoordinator; private final ElanInstanceCache elanInstanceCache; + private final ElanInterfaceCache elanInterfaceCache; @Inject public ElanInterfaceStateChangeListener(final DataBroker db, final ElanInterfaceManager ifManager, - final JobCoordinator jobCoordinator, final ElanInstanceCache elanInstanceCache) { + final JobCoordinator jobCoordinator, final ElanInstanceCache elanInstanceCache, + final ElanInterfaceCache elanInterfaceCache) { super(Interface.class, ElanInterfaceStateChangeListener.class); broker = db; elanInterfaceManager = ifManager; this.jobCoordinator = jobCoordinator; this.elanInstanceCache = elanInstanceCache; + this.elanInterfaceCache = elanInterfaceCache; } @Override @@ -64,8 +69,8 @@ public class ElanInterfaceStateChangeListener } LOG.trace("Received interface {} Down event", delIf); String interfaceName = delIf.getName(); - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { LOG.debug("No Elan Interface is created for the interface:{} ", interfaceName); return; } @@ -75,7 +80,7 @@ public class ElanInterfaceStateChangeListener interfaceInfo.setInterfaceName(interfaceName); interfaceInfo.setInterfaceType(InterfaceInfo.InterfaceType.VLAN_INTERFACE); interfaceInfo.setInterfaceTag(delIf.getIfIndex()); - String elanInstanceName = elanInterface.getElanInstanceName(); + String elanInstanceName = elanInterface.get().getElanInstanceName(); ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull(); if (elanInstance == null) { LOG.debug("No Elan instance is available for the interface:{} ", interfaceName); @@ -97,13 +102,13 @@ public class ElanInterfaceStateChangeListener } LOG.trace("Received interface {} up event", intrf); String interfaceName = intrf.getName(); - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { return; } InstanceIdentifier elanInterfaceId = ElanUtils .getElanInterfaceConfigurationDataPathId(interfaceName); - elanInterfaceManager.add(elanInterfaceId, elanInterface); + elanInterfaceManager.add(elanInterfaceId, elanInterface.get()); } @Override diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java index 96882d4072..60c36eb3bb 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.internal; +import com.google.common.base.Optional; import com.google.common.util.concurrent.ListenableFuture; import java.math.BigInteger; import java.util.ArrayList; @@ -25,6 +26,7 @@ import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.netvirt.elan.ElanException; import org.opendaylight.netvirt.elan.cache.ElanInstanceCache; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress; @@ -48,16 +50,18 @@ public class ElanLearntVpnVipToPortListener extends private final ElanUtils elanUtils; private final JobCoordinator jobCoordinator; private final ElanInstanceCache elanInstanceCache; + private final ElanInterfaceCache elanInterfaceCache; @Inject public ElanLearntVpnVipToPortListener(DataBroker broker, IInterfaceManager interfaceManager, ElanUtils elanUtils, - JobCoordinator jobCoordinator, ElanInstanceCache elanInstanceCache) { + JobCoordinator jobCoordinator, ElanInstanceCache elanInstanceCache, ElanInterfaceCache elanInterfaceCache) { super(LearntVpnVipToPort.class, ElanLearntVpnVipToPortListener.class); this.broker = broker; this.interfaceManager = interfaceManager; this.elanUtils = elanUtils; this.jobCoordinator = jobCoordinator; this.elanInstanceCache = elanInstanceCache; + this.elanInterfaceCache = elanInterfaceCache; } @Override @@ -110,15 +114,15 @@ public class ElanLearntVpnVipToPortListener extends @Override public List> call() throws Exception { - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { LOG.debug("ElanInterface Not present for interfaceName {} for add event", interfaceName); return Collections.emptyList(); } WriteTransaction interfaceTx = broker.newWriteOnlyTransaction(); WriteTransaction flowTx = broker.newWriteOnlyTransaction(); - addMacEntryToDsAndSetupFlows(elanInterface.getElanInstanceName(), interfaceTx, - flowTx, ElanConstants.STATIC_MAC_TIMEOUT); + addMacEntryToDsAndSetupFlows(elanInterface.get().getElanInstanceName(), interfaceTx, flowTx, + ElanConstants.STATIC_MAC_TIMEOUT); List> futures = new ArrayList<>(); futures.add(interfaceTx.submit()); futures.add(flowTx.submit()); @@ -157,15 +161,14 @@ public class ElanLearntVpnVipToPortListener extends @Override public List> call() throws Exception { - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { LOG.debug("ElanInterface Not present for interfaceName {} for delete event", interfaceName); return Collections.emptyList(); } WriteTransaction interfaceTx = broker.newWriteOnlyTransaction(); WriteTransaction flowTx = broker.newWriteOnlyTransaction(); - deleteMacEntryFromDsAndRemoveFlows(elanInterface.getElanInstanceName(), interfaceTx, - flowTx); + deleteMacEntryFromDsAndRemoveFlows(elanInterface.get().getElanInstanceName(), interfaceTx, flowTx); List> futures = new ArrayList<>(); futures.add(interfaceTx.submit()); futures.add(flowTx.submit()); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java index d696419ea5..924ea32f3d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java @@ -44,6 +44,7 @@ import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput; import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil; import org.opendaylight.netvirt.elan.cache.ElanInstanceCache; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.netvirt.elanmanager.api.ElanHelper; @@ -97,6 +98,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi private final SouthboundUtils southboundUtils; private final IMdsalApiManager mdsalManager; private final ElanInstanceCache elanInstanceCache; + private final ElanInterfaceCache elanInterfaceCache; private boolean isL2BeforeL3; private final EntityOwnershipCandidateRegistration candidateRegistration; @@ -109,7 +111,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi ElanUtils elanUtils, EntityOwnershipService entityOwnershipService, SouthboundUtils southboundUtils, ElanInstanceCache elanInstanceCache, - IMdsalApiManager mdsalManager) { + ElanInterfaceCache elanInterfaceCache, IMdsalApiManager mdsalManager) { this.idManager = idManager; this.interfaceManager = interfaceManager; this.elanInstanceManager = elanInstanceManager; @@ -118,6 +120,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi this.elanUtils = elanUtils; this.southboundUtils = southboundUtils; this.elanInstanceCache = elanInstanceCache; + this.elanInterfaceCache = elanInterfaceCache; this.mdsalManager = mdsalManager; candidateRegistration = registerCandidate(entityOwnershipService); @@ -228,7 +231,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public EtreeInterface getEtreeInterfaceByElanInterfaceName(String elanInterface) { - return ElanUtils.getEtreeInterfaceByElanInterfaceName(broker, elanInterface); + return elanInterfaceCache.getEtreeInterface(elanInterface).orNull(); } public static boolean compareWithExistingElanInstance(ElanInstance existingElanInstance, long macTimeOut, @@ -314,8 +317,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public void updateElanInterface(String elanInstanceName, String interfaceName, List updatedStaticMacAddresses, String newDescription) { - ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (existingElanInterface == null) { + Optional existingElanInterface = elanInterfaceCache.get(interfaceName); + if (!existingElanInterface.isPresent()) { return; } @@ -336,8 +339,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public void deleteElanInterface(String elanInstanceName, String interfaceName) { - ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (existingElanInterface != null) { + Optional existingElanInterface = elanInterfaceCache.get(interfaceName); + if (existingElanInterface.isPresent()) { ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION, ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName)); LOG.debug("deleting the Elan Interface {}", existingElanInterface); @@ -346,26 +349,22 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public void addStaticMacAddress(String elanInstanceName, String interfaceName, String macAddress) { - ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - PhysAddress updateStaticMacAddress = new PhysAddress(macAddress); - if (existingElanInterface != null) { + Optional existingElanInterface = elanInterfaceCache.get(interfaceName); + if (existingElanInterface.isPresent()) { StaticMacEntriesBuilder staticMacEntriesBuilder = new StaticMacEntriesBuilder(); - StaticMacEntries staticMacEntry = staticMacEntriesBuilder.setMacAddress(updateStaticMacAddress).build(); + StaticMacEntries staticMacEntry = staticMacEntriesBuilder.setMacAddress( + new PhysAddress(macAddress)).build(); InstanceIdentifier staticMacEntriesIdentifier = - ElanUtils.getStaticMacEntriesCfgDataPathIdentifier(interfaceName, - macAddress); + ElanUtils.getStaticMacEntriesCfgDataPathIdentifier(interfaceName, macAddress); MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, staticMacEntriesIdentifier, staticMacEntry); - return; } - - return; } @Override public void deleteStaticMacAddress(String elanInstanceName, String interfaceName, String macAddress) throws MacNotFoundException { - ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); - if (existingElanInterface != null) { + Optional existingElanInterface = elanInterfaceCache.get(interfaceName); + if (existingElanInterface.isPresent()) { InstanceIdentifier staticMacEntriesIdentifier = ElanUtils.getStaticMacEntriesCfgDataPathIdentifier(interfaceName, macAddress); @@ -662,7 +661,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public ElanInterface getElanInterfaceByElanInterfaceName(String interfaceName) { - return ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName); + return elanInterfaceCache.get(interfaceName).orNull(); } @Override @@ -865,8 +864,9 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi LOG.info("Installing the ARP responder flow on DPN {} for Interface {} with MAC {} & IP {}", dpnId, ingressInterfaceName, macAddress, ipAddress); - ElanInterface elanIface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, ingressInterfaceName); - ElanInstance elanInstance = elanInstanceCache.get(elanIface.getElanInstanceName()).orNull(); + Optional elanIface = elanInterfaceCache.get(ingressInterfaceName); + ElanInstance elanInstance = elanIface.isPresent() + ? elanInstanceCache.get(elanIface.get().getElanInstanceName()).orNull() : null; if (elanInstance == null) { LOG.debug("addArpResponderFlow: elanInstance is null, Failed to install arp responder flow for Interface {}" + " with MAC {} & IP {}", dpnId, diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java index 6c6a081a95..e080e0082f 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java @@ -7,14 +7,14 @@ */ package org.opendaylight.netvirt.elan.statisitcs; +import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; import java.util.concurrent.Future; import javax.inject.Inject; import javax.inject.Singleton; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; -import org.opendaylight.netvirt.elan.utils.ElanUtils; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius._interface.statistics.rev150824.ResultCode; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.statistics.rev150824.ElanStatisticsService; @@ -32,13 +32,14 @@ import org.slf4j.LoggerFactory; public class ElanStatisticsImpl implements ElanStatisticsService { private static final Logger LOG = LoggerFactory.getLogger(ElanStatisticsImpl.class); - private final DataBroker dataBroker; private final IInterfaceManager interfaceManager; + private final ElanInterfaceCache elanInterfaceCache; @Inject - public ElanStatisticsImpl(DataBroker dataBroker, IInterfaceManager interfaceManager) { - this.dataBroker = dataBroker; + public ElanStatisticsImpl(IInterfaceManager interfaceManager, + ElanInterfaceCache elanInterfaceCache) { this.interfaceManager = interfaceManager; + this.elanInterfaceCache = elanInterfaceCache; } @Override @@ -51,13 +52,13 @@ public class ElanStatisticsImpl implements ElanStatisticsService { rpcResultBuilder = RpcResultBuilder.failed(); return getFutureWithAppErrorMessage(rpcResultBuilder, "Interface name is not provided"); } - ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(dataBroker, interfaceName); - if (elanInterface == null) { + Optional elanInterface = elanInterfaceCache.get(interfaceName); + if (!elanInterface.isPresent()) { rpcResultBuilder = RpcResultBuilder.failed(); return getFutureWithAppErrorMessage(rpcResultBuilder, String.format("Interface %s is not a ELAN interface", interfaceName)); } - String elanInstanceName = elanInterface.getElanInstanceName(); + String elanInstanceName = elanInterface.get().getElanInstanceName(); InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName); //FIXME [ELANBE] Get this API Later short tableId = 0; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java deleted file mode 100644 index 5e1733768f..0000000000 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.netvirt.elan.utils; - -import java.util.Collection; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.inject.Inject; -import javax.inject.Singleton; -import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; -import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Singleton -public class CacheElanInterfaceListener implements ClusteredDataTreeChangeListener { - - private ListenerRegistration registration; - private static final Logger LOG = LoggerFactory.getLogger(CacheElanInterfaceListener.class); - private final DataBroker broker; - - @Inject - public CacheElanInterfaceListener(DataBroker dataBroker) { - this.broker = dataBroker; - } - - @PostConstruct - public void init() { - registerListener(); - } - - private void registerListener() { - final DataTreeIdentifier treeId = - new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildcardPath()); - LOG.trace("Registering on path: {}", treeId); - registration = broker.registerDataTreeChangeListener(treeId, CacheElanInterfaceListener.this); - } - - protected InstanceIdentifier getWildcardPath() { - return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class); - } - - @PreDestroy - public void close() throws Exception { - if (registration != null) { - registration.close(); - } - } - - @Override - public void onDataTreeChanged(Collection> changes) { - for (DataTreeModification change : changes) { - DataObjectModification mod = change.getRootNode(); - switch (mod.getModificationType()) { - case DELETE: - ElanUtils.removeElanInterfaceFromCache(mod.getDataBefore().getName()); - ElanUtils.removeElanInterfaceToElanInstanceCache(mod.getDataBefore().getElanInstanceName(), - mod.getDataBefore().getName()); - break; - case SUBTREE_MODIFIED: - case WRITE: - ElanInterface elanInterface = mod.getDataAfter(); - ElanUtils.addElanInterfaceIntoCache(elanInterface.getName(), elanInterface); - ElanUtils.addElanInterfaceToElanInstanceCache(elanInterface.getElanInstanceName(), - elanInterface.getName()); - break; - default: - throw new IllegalArgumentException("Unhandled modification type " + mod.getModificationType()); - } - } - } - -} diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java index cdf3487fe6..67081547d8 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.utils; +import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -22,6 +23,7 @@ import org.opendaylight.genius.mdsalutil.MatchInfo; import org.opendaylight.genius.mdsalutil.NwConstants; import org.opendaylight.genius.utils.batching.ResourceBatchingManager; import org.opendaylight.netvirt.elan.ElanException; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -43,12 +45,15 @@ public class ElanDmacUtils { private final DataBroker broker; private final ElanItmUtils elanItmUtils; private final ElanEtreeUtils elanEtreeUtils; + private final ElanInterfaceCache elanInterfaceCache; @Inject - public ElanDmacUtils(DataBroker broker, ElanItmUtils elanItmUtils, ElanEtreeUtils elanEtreeUtils) { + public ElanDmacUtils(DataBroker broker, ElanItmUtils elanItmUtils, ElanEtreeUtils elanEtreeUtils, + ElanInterfaceCache elanInterfaceCache) { this.broker = broker; this.elanItmUtils = elanItmUtils; this.elanEtreeUtils = elanEtreeUtils; + this.elanInterfaceCache = elanInterfaceCache; } /** @@ -246,16 +251,13 @@ public class ElanDmacUtils { BigInteger dpnId, String extDeviceNodeId, Long vni, String macAddress, String displayName, String interfaceName, EtreeLeafTagName etreeLeafTag) throws ElanException { - boolean isRoot = false; + boolean isRoot; if (interfaceName == null) { isRoot = true; } else { - EtreeInterface etreeInterface = ElanUtils.getEtreeInterfaceByElanInterfaceName(broker, interfaceName); - if (etreeInterface != null) { - if (etreeInterface.getEtreeInterfaceType() == EtreeInterface.EtreeInterfaceType.Root) { - isRoot = true; - } - } + Optional etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName); + isRoot = etreeInterface.isPresent() ? etreeInterface.get().getEtreeInterfaceType() + == EtreeInterface.EtreeInterfaceType.Root : false; } if (isRoot) { Flow flow = buildDmacFlowForExternalRemoteMac(dpnId, extDeviceNodeId, @@ -310,16 +312,13 @@ public class ElanDmacUtils { BigInteger dpnId, String extDeviceNodeId, Long vni, String macAddress, String displayName, String interfaceName, EtreeLeafTagName etreeLeafTag)throws ElanException { - boolean isRoot = false; + boolean isRoot; if (interfaceName == null) { isRoot = true; } else { - EtreeInterface etreeInterface = ElanUtils.getEtreeInterfaceByElanInterfaceName(broker, interfaceName); - if (etreeInterface != null) { - if (etreeInterface.getEtreeInterfaceType() == EtreeInterface.EtreeInterfaceType.Root) { - isRoot = true; - } - } + Optional etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName); + isRoot = etreeInterface.isPresent() ? etreeInterface.get().getEtreeInterfaceType() + == EtreeInterface.EtreeInterfaceType.Root : false; } if (isRoot) { Flow flow = buildDmacFlowForExternalRemoteMac(dpnId, extDeviceNodeId, diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index ed092f23ad..3c1f3d5792 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -21,11 +21,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import javax.annotation.Nonnull; @@ -66,6 +62,7 @@ import org.opendaylight.genius.mdsalutil.packet.IPv4; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.netvirt.elan.ElanException; import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil; +import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache; import org.opendaylight.netvirt.elanmanager.api.ElanHelper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder; @@ -176,9 +173,6 @@ public class ElanUtils { private static final Logger LOG = LoggerFactory.getLogger(ElanUtils.class); - private static Map elanInterfaceLocalCache = new ConcurrentHashMap<>(); - private static Map> elanInstanceToInterfacesCache = new ConcurrentHashMap<>(); - private final DataBroker broker; private final IMdsalApiManager mdsalManager; private final OdlInterfaceRpcService interfaceManagerRpcService; @@ -187,6 +181,7 @@ public class ElanUtils { private final ElanConfig elanConfig; private final ElanItmUtils elanItmUtils; private final ElanEtreeUtils elanEtreeUtils; + private final ElanInterfaceCache elanInterfaceCache; public static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { @Override @@ -203,7 +198,8 @@ public class ElanUtils { @Inject public ElanUtils(DataBroker dataBroker, IMdsalApiManager mdsalManager, OdlInterfaceRpcService interfaceManagerRpcService, ItmRpcService itmRpcService, ElanConfig elanConfig, - IInterfaceManager interfaceManager, ElanEtreeUtils elanEtreeUtils, ElanItmUtils elanItmUtils) { + IInterfaceManager interfaceManager, ElanEtreeUtils elanEtreeUtils, ElanItmUtils elanItmUtils, + ElanInterfaceCache elanInterfaceCache) { this.broker = dataBroker; this.mdsalManager = mdsalManager; this.interfaceManagerRpcService = interfaceManagerRpcService; @@ -212,6 +208,7 @@ public class ElanUtils { this.elanConfig = elanConfig; this.elanEtreeUtils = elanEtreeUtils; this.elanItmUtils = elanItmUtils; + this.elanInterfaceCache = elanInterfaceCache; } public final Boolean isOpenstackVniSemanticsEnforced() { @@ -219,18 +216,6 @@ public class ElanUtils { ? elanConfig.isOpenstackVniSemanticsEnforced() : false; } - public static void addElanInterfaceIntoCache(String interfaceName, ElanInterface elanInterface) { - elanInterfaceLocalCache.put(interfaceName, elanInterface); - } - - public static void removeElanInterfaceFromCache(String interfaceName) { - elanInterfaceLocalCache.remove(interfaceName); - } - - public static ElanInterface getElanInterfaceFromCache(String interfaceName) { - return elanInterfaceLocalCache.get(interfaceName); - } - /** * Uses the IdManager to retrieve a brand new ElanTag. * @@ -312,25 +297,6 @@ public class ElanUtils { return InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class).build(); } - // elan-interfaces Config Container - public static ElanInterface getElanInterfaceByElanInterfaceName(DataBroker broker, String elanInterfaceName) { - ElanInterface elanInterfaceObj = getElanInterfaceFromCache(elanInterfaceName); - if (elanInterfaceObj != null) { - return elanInterfaceObj; - } - InstanceIdentifier elanInterfaceId = getElanInterfaceConfigurationDataPathId(elanInterfaceName); - return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orNull(); - } - - public static EtreeInterface getEtreeInterfaceByElanInterfaceName(DataBroker broker, String elanInterfaceName) { - ElanInterface elanInterface = getElanInterfaceByElanInterfaceName(broker, elanInterfaceName); - if (elanInterface == null) { - return null; - } else { - return elanInterface.getAugmentation(EtreeInterface.class); - } - } - public static InstanceIdentifier getElanInterfaceConfigurationDataPathId(String interfaceName) { return InstanceIdentifier.builder(ElanInterfaces.class) .child(ElanInterface.class, new ElanInterfaceKey(interfaceName)).build(); @@ -662,7 +628,7 @@ public class ElanUtils { List mkInstructions = new ArrayList<>(); mkInstructions.add(new InstructionGotoTable(NwConstants.ELAN_DMAC_TABLE)); BigInteger dpId = interfaceInfo.getDpId(); - long elanTag = getElanTag(broker, elanInfo, interfaceInfo); + long elanTag = getElanTag(elanInfo, interfaceInfo); return new FlowEntityBuilder() .setDpnId(dpId) .setTableId(NwConstants.ELAN_SMAC_TABLE) @@ -680,8 +646,8 @@ public class ElanUtils { .build(); } - private static Long getElanTag(DataBroker broker, ElanInstance elanInfo, InterfaceInfo interfaceInfo) { - EtreeInterface etreeInterface = getEtreeInterfaceByElanInterfaceName(broker, interfaceInfo.getInterfaceName()); + private Long getElanTag(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceInfo.getInterfaceName()).orNull(); if (etreeInterface == null || etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { return elanInfo.getElanTag(); } else { // Leaf @@ -870,23 +836,21 @@ public class ElanUtils { Flow flowEntity = buildLocalDmacFlowEntry(elanTag, dpId, ifName, macAddress, elanInfo, ifTag); mdsalApiManager.addFlowToTx(dpId, flowEntity, writeFlowGroupTx); installEtreeLocalDmacFlow(elanTag, dpId, ifName, macAddress, elanInfo, - mdsalApiManager, ifTag, writeFlowGroupTx); + ifTag, writeFlowGroupTx); } private void installEtreeLocalDmacFlow(long elanTag, BigInteger dpId, String ifName, String macAddress, - ElanInstance elanInfo, IMdsalApiManager mdsalApiManager, long ifTag, WriteTransaction writeFlowGroupTx) { - EtreeInterface etreeInterface = getEtreeInterfaceByElanInterfaceName(broker, ifName); - if (etreeInterface != null) { - if (etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { - EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag); - if (etreeTagName == null) { - LOG.warn("Interface {} seems like it belongs to Etree but etreeTagName from elanTag {} is null", - ifName, elanTag); - } else { - Flow flowEntity = buildLocalDmacFlowEntry(etreeTagName.getEtreeLeafTag().getValue(), dpId, ifName, - macAddress, elanInfo, ifTag); - mdsalApiManager.addFlowToTx(dpId, flowEntity, writeFlowGroupTx); - } + ElanInstance elanInfo, long ifTag, WriteTransaction writeFlowGroupTx) { + EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(ifName).orNull(); + if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { + EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag); + if (etreeTagName == null) { + LOG.warn("Interface {} seems like it belongs to Etree but etreeTagName from elanTag {} is null", + ifName, elanTag); + } else { + Flow flowEntity = buildLocalDmacFlowEntry(etreeTagName.getEtreeLeafTag().getValue(), dpId, ifName, + macAddress, elanInfo, ifTag); + mdsalManager.addFlowToTx(dpId, flowEntity, writeFlowGroupTx); } } } @@ -978,18 +942,16 @@ public class ElanUtils { WriteTransaction writeFlowGroupTx, ElanInstance elanInstance) throws ElanException { Flow flowEntity; - EtreeInterface etreeInterface = getEtreeInterfaceByElanInterfaceName(broker, interfaceName); - if (etreeInterface != null) { - if (etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { - EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag); - if (etreeTagName == null) { - LOG.warn("Interface " + interfaceName - + " seems like it belongs to Etree but etreeTagName from elanTag " + elanTag + " is null."); - } else { - flowEntity = buildRemoteDmacFlowEntry(srcDpId, destDpId, lportTagOrVni, - etreeTagName.getEtreeLeafTag().getValue(), macAddress, displayName, elanInstance); - mdsalManager.addFlowToTx(srcDpId, flowEntity, writeFlowGroupTx); - } + EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName).orNull(); + if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) { + EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag); + if (etreeTagName == null) { + LOG.warn("Interface " + interfaceName + + " seems like it belongs to Etree but etreeTagName from elanTag " + elanTag + " is null."); + } else { + flowEntity = buildRemoteDmacFlowEntry(srcDpId, destDpId, lportTagOrVni, + etreeTagName.getEtreeLeafTag().getValue(), macAddress, displayName, elanInstance); + mdsalManager.addFlowToTx(srcDpId, flowEntity, writeFlowGroupTx); } } } @@ -1655,23 +1617,6 @@ public class ElanUtils { return false; } - public static void addElanInterfaceToElanInstanceCache(String elanInstanceName, String elanInterfaceName) { - elanInstanceToInterfacesCache.computeIfAbsent(elanInstanceName, key -> new HashSet<>()).add(elanInterfaceName); - } - - public static void removeElanInterfaceToElanInstanceCache(String elanInstanceName, String interfaceName) { - Set elanInterfaces = elanInstanceToInterfacesCache.get(elanInstanceName); - if (elanInterfaces == null || elanInterfaces.isEmpty()) { - return; - } - elanInterfaces.remove(interfaceName); - } - - @Nonnull public static Set removeAndGetElanInterfaces(String elanInstanceName) { - Set removed = elanInstanceToInterfacesCache.remove(elanInstanceName); - return removed != null ? removed : Collections.emptySet(); - } - public static InstanceIdentifier getFlowIid(Flow flow, BigInteger dpnId) { FlowKey flowKey = new FlowKey(new FlowId(flow.getId())); org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId nodeId = -- 2.36.6