Few Remote flows not deleted on DPNs after migration from
internal to external VPN.
For a vpn associate/dissociate, the vpn interface update event wait was
getting accumulated for every interface across vpns. So, vpn manger was
getting removed before interfaces were cleaned.
A label of 0 was being used to create unique ids across vpn engine if
IdManager failed to return a valid label.
Java Synchronize has been replaced by LockManager to handle events
gracefully across PLs during simultaneous northbound and southbound
events for subnet routes.
Change-Id: I3cf1d1553bd6b6b025a9cedbc860b7af246f1afe
Signed-off-by: Suraj Ranjan <suraj.ranjan@ericsson.com>
(cherry picked from commit
f60b2b35594f7cb0bc3aeba1a48f9ef9610649d5)
<artifactId>natservice-api</artifactId>
<version>${vpnservices.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.genius</groupId>
+ <artifactId>lockmanager-api</artifactId>
+ <version>${genius.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.infrautils</groupId>
<artifactId>counters-api</artifactId>
public static final String FLOWID_PREFIX = "L3.";
public static final long MIN_WAIT_TIME_IN_MILLISECONDS = 10000;
public static final long MAX_WAIT_TIME_IN_MILLISECONDS = 180000;
- public static final long PER_INTERFACE_MAX_WAIT_TIME_IN_MILLISECONDS = 20000;
+ public static final long PER_INTERFACE_MAX_WAIT_TIME_IN_MILLISECONDS = 50000;
public static final int ELAN_GID_MIN = 200000;
+ public static final int INVALID_LABEL = 0;
// An IdPool for Pseudo LPort tags, that is, lportTags that are no related to an interface.
// These lportTags must be higher than 170000 to avoid collision with interface LportTags and
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
VpnUtil.getNextHopLabelKey((rd == null) ? vpnName
: rd, prefix));
+ if (label == VpnConstants.INVALID_LABEL) {
+ LOG.error("Unable to fetch label from Id Manager. Bailing out of processing add/update of vpn interface {} for vpn {}", interfaceName, vpnName);
+ return;
+ }
List<String> adjNextHop = nextHop.getNextHopIpList();
value.add(new AdjacencyBuilder(nextHop).setLabel(label).setNextHopIpList(
(adjNextHop != null && !adjNextHop.isEmpty()) ? adjNextHop : Arrays.asList(nextHopIp))
} catch (Exception e) {
logger.error("Unable to handle subnet {} added to vpn {} {}", subnetIp, vpnName, e);
}
+
}
@Override
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TimeUnits;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TryLockInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TryLockInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.UnlockInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.UnlockInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinks;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkStateKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterInterfacesMap;
import org.opendaylight.yangtools.yang.common.RpcResult;
public static void lockSubnet(LockManagerService lockManager, String subnetId) {
TryLockInput input = new TryLockInputBuilder().setLockName(subnetId).setTime(3000L).setTimeUnit(TimeUnits.Milliseconds).build();
Future<RpcResult<Void>> result = lockManager.tryLock(input);
+ String errMsg = "Unable to getLock for subnet " + subnetId;
try {
if ((result != null) && (result.get().isSuccessful())) {
- if (LOG.isDebugEnabled()) {
LOG.debug("Acquired lock for {}", subnetId);
- }
} else {
- throw new RuntimeException(String.format("Unable to getLock for subnet %s", subnetId));
+ throw new RuntimeException(errMsg);
}
} catch (InterruptedException | ExecutionException e) {
- LOG.error("Unable to getLock for subnet {}", subnetId);
- throw new RuntimeException(String.format("Unable to getLock for subnet %s", subnetId), e.getCause());
+ LOG.error(errMsg);
+ throw new RuntimeException(errMsg, e.getCause());
}
}
for ( VrfEntry vrfEntry : srcVpnRemoteVrfEntries ) {
long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
VpnUtil.getNextHopLabelKey(dstVpnRd, vrfEntry.getDestPrefix()));
- if (label == 0) {
+ if (label == VpnConstants.INVALID_LABEL) {
LOG.error("Unable to fetch label from Id Manager. Bailing out of leaking routes for InterVpnLink {} rd {} prefix {}",
- vpnLink.getName(), dstVpnRd, vrfEntry.getDestPrefix());
+ vpnLink.getName(), dstVpnRd, vrfEntry.getDestPrefix());
continue;
}
InterVpnLinkUtil.leakRoute(dataBroker, bgpManager, vpnLink, srcVpnUuid, dstVpnUuid,
- vrfEntry.getDestPrefix(), label);
+ vrfEntry.getDestPrefix(), label);
}
}
// BGP accordingly
long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
VpnUtil.getNextHopLabelKey(vpn1Rd, vrfEntry.getDestPrefix()));
-
- if (label == 0) {
+ if (label == VpnConstants.INVALID_LABEL) {
LOG.error("Unable to fetch label from Id Manager. Bailing out of leaking extra routes for InterVpnLink {} rd {} prefix {}",
- vpnLink.getName(), vpn1Rd, vrfEntry.getDestPrefix());
+ vpnLink.getName(), vpn1Rd, vrfEntry.getDestPrefix());
continue;
}
InterVpnLinkUtil.leakRoute(dataBroker, bgpManager, vpnLink, vpn2Uuid, vpn1Uuid, vrfEntry.getDestPrefix(),
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService" />
<odl:rpc-service id="itmRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService" />
+ <odl:rpc-service id="lockManagerService"
+ interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService" />
<odl:rpc-service id="odlInterfaceRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
<odl:rpc-service id="odlArputilService"
@Mock IdManagerService idManager;
@Mock LockManagerService lockManager;
@Mock SubnetOpDpnManager subnetOpDpnManager;
+ @Mock LockManagerService lockManagerService;
VpnSubnetRouteHandler vpnSubnetRouteHandler;
setupMocks();
vpnSubnetRouteHandler = new VpnSubnetRouteHandler(dataBroker, subnetOpDpnManager, bgpManager,
- vpnInterfaceManager, idManager, lockManager);
+ vpnInterfaceManager, idManager, lockManagerService);
Future<RpcResult<AllocateIdOutput>> idOutputOptional =
RpcResultBuilder.success(allocateIdOutput).buildFuture();