Description : Wrong instance identifier was being used for unbind service.
Also, DJC synchronization key for unbind service should be parent interface, rather
than interface-name, else this will cause race conditions while deleting 220 flow.
Change-Id: I632791ed131cab96e1967542c1fa7e18fa92c519
Signed-off-by: Faseela K <faseela.k@ericsson.com>
}
public static void unbindService(DataBroker dataBroker, String interfaceName, InstanceIdentifier<BoundServices>
- boundServicesInstanceIdentifier, Class<? extends ServiceModeBase> serviceMode){
+ boundServicesInstanceIdentifier, String parentInterface){
LOG.info("Unbinding Service from : {}", interfaceName);
DataStoreJobCoordinator dataStoreJobCoordinator = DataStoreJobCoordinator.getInstance();
- dataStoreJobCoordinator.enqueueJob(interfaceName,
+ dataStoreJobCoordinator.enqueueJob(parentInterface,
() -> {
WriteTransaction t = dataBroker.newWriteOnlyTransaction();
t.delete(LogicalDatastoreType.CONFIGURATION, boundServicesInstanceIdentifier);
@Override
public void unbindService(String interfaceName, Class<? extends ServiceModeBase> serviceMode, BoundServices serviceInfo) {
IfmUtil.unbindService(dataBroker, interfaceName,
- FlowBasedServicesUtils.buildServiceId(interfaceName, serviceInfo.getServicePriority()), serviceMode);
+ FlowBasedServicesUtils.buildServiceId(interfaceName, serviceInfo.getServicePriority(), serviceMode), interfaceName);
}
@Override
boolean isNodePresent = InterfaceManagerCommonUtils.isNodePresent(dataBroker, nodeConnectorIdNew);
DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
InterfaceStateRemoveWorker portStateRemoveWorker = new InterfaceStateRemoveWorker(idManager, nodeConnectorIdNew,
- nodeConnectorIdOld, fcNodeConnectorNew, portName, isNodePresent, isNetworkEvent, true);
+ nodeConnectorIdOld, fcNodeConnectorNew, portName, portName, isNodePresent, isNetworkEvent, true);
coordinator.enqueueJob(portName, portStateRemoveWorker, IfmConstants.JOB_MAX_RETRIES);
}
private NodeConnectorId nodeConnectorIdOld;
FlowCapableNodeConnector fcNodeConnectorOld;
private final String interfaceName;
+ private final String parentInterface;
private final IdManagerService idManager;
private final boolean isNodePresent;
private final boolean isNetworkEvent;
public InterfaceStateRemoveWorker(IdManagerService idManager, NodeConnectorId nodeConnectorIdNew,
NodeConnectorId nodeConnectorIdOld,
FlowCapableNodeConnector fcNodeConnectorOld,
- String portName,
+ String interfaceName,
+ String parentInterface,
boolean isNodePresent,
boolean isNetworkEvent,
boolean isParentInterface) {
this.nodeConnectorIdNew = nodeConnectorIdNew;
this.nodeConnectorIdOld = nodeConnectorIdOld;
this.fcNodeConnectorOld = fcNodeConnectorOld;
- this.interfaceName = portName;
+ this.interfaceName = interfaceName;
+ this.parentInterface = parentInterface;
this.idManager = idManager;
this.isNodePresent = isNodePresent;
this.isNetworkEvent = isNetworkEvent;
}
futures = OvsInterfaceStateRemoveHelper.removeInterfaceStateConfiguration(idManager, mdsalApiManager, alivenessMonitorService,
- nodeConnectorIdNew, nodeConnectorIdOld, dataBroker, interfaceName, fcNodeConnectorOld, isNodePresent);
+ nodeConnectorIdNew, nodeConnectorIdOld, dataBroker, interfaceName, fcNodeConnectorOld, isNodePresent, parentInterface);
List<InterfaceChildEntry> interfaceChildEntries = getInterfaceChildEntries(dataBroker, interfaceName);
for (InterfaceChildEntry interfaceChildEntry : interfaceChildEntries) {
// Fetch all interfaces on this port and trigger remove worker for each of them
InterfaceStateRemoveWorker interfaceStateRemoveWorker = new InterfaceStateRemoveWorker(idManager, nodeConnectorIdNew,
- nodeConnectorIdOld, fcNodeConnectorOld, interfaceChildEntry.getChildInterface(), isNodePresent, isNetworkEvent, false);
+ nodeConnectorIdOld, fcNodeConnectorOld, interfaceChildEntry.getChildInterface(), interfaceName, isNodePresent, isNetworkEvent, false);
DataStoreJobCoordinator.getInstance().enqueueJob(interfaceName, interfaceStateRemoveWorker);
}
return futures;
LOG.debug("removing interface state for vlan trunk member {}", interfaceChildEntry.getChildInterface());
InterfaceManagerCommonUtils.deleteInterfaceStateInformation(interfaceChildEntry.getChildInterface(), defaultOperationalShardTransaction, idManagerService);
FlowBasedServicesUtils.removeIngressFlow(interfaceChildEntry.getChildInterface(), dpId, dataBroker, futures);
- FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceName);
+ FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceName,interfaceParentEntry.getParentInterface());
}
}
IfmUtil.buildStateInterfaceId(interfaceOld.getName());
defaultOperShardTransaction.delete(LogicalDatastoreType.OPERATIONAL, ifStateId);
FlowBasedServicesUtils.removeIngressFlow(interfaceOld.getName(), dpId, dataBroker, futures);
- FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceOld.getName());
+ FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceOld.getName(), parentRefs.getParentInterface());
}
futures.add(defaultConfigShardTransaction.submit());
NodeConnectorId nodeConnectorIdNew, NodeConnectorId nodeConnectorIdOld,
DataBroker dataBroker, String interfaceName,
FlowCapableNodeConnector fcNodeConnectorOld,
- boolean isNodePresent) {
+ boolean isNodePresent,
+ String parentInterface) {
LOG.debug("Removing interface-state information for interface: {} {}", interfaceName, isNodePresent);
List<ListenableFuture<Void>> futures = new ArrayList<>();
WriteTransaction defaultOperationalShardTransaction = dataBroker.newWriteOnlyTransaction();
// skip this check for non-unique ports(Ex: br-int,br-ex)
if(iface != null || (iface == null && !interfaceName.contains(fcNodeConnectorOld.getName()))) {
FlowBasedServicesUtils.removeIngressFlow(interfaceName, dpId, dataBroker, futures);
- FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceName);
+ FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceName, parentInterface);
}
// Delete the Vpn Interface from DpnToInterface Op DS.
.child(BoundServices.class, new BoundServicesKey(serviceIndex)).build();
}
- public static void unbindDefaultEgressDispatcherService(DataBroker dataBroker, String interfaceName) {
+ public static InstanceIdentifier<BoundServices> buildServiceId(String interfaceName, short serviceIndex, Class<? extends ServiceModeBase> serviceMode) {
+ return InstanceIdentifier.builder(ServiceBindings.class).child(ServicesInfo.class,
+ new ServicesInfoKey(interfaceName, serviceMode))
+ .child(BoundServices.class, new BoundServicesKey(serviceIndex)).build();
+ }
+
+ public static void unbindDefaultEgressDispatcherService(DataBroker dataBroker, String interfaceName, String parentInterface) {
IfmUtil.unbindService(dataBroker, interfaceName, buildServiceId(interfaceName,
- ServiceIndex.getIndex(NwConstants.DEFAULT_EGRESS_SERVICE_NAME, NwConstants.DEFAULT_EGRESS_SERVICE_INDEX)),
- ServiceModeEgress.class);
+ ServiceIndex.getIndex(NwConstants.DEFAULT_EGRESS_SERVICE_NAME, NwConstants.DEFAULT_EGRESS_SERVICE_INDEX),
+ ServiceModeEgress.class), parentInterface);
}
public static void bindDefaultEgressDispatcherService(DataBroker dataBroker, List<ListenableFuture<Void>> futures,
NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
.setId(ncId)
.setKey(new NodeConnectorKey(ncId));
- FlowCapableNodeConnectorBuilder flowCapableNodeConnectorBuilder = new FlowCapableNodeConnectorBuilder().setHardwareAddress(MacAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA"));
+ FlowCapableNodeConnectorBuilder flowCapableNodeConnectorBuilder = new FlowCapableNodeConnectorBuilder().
+ setHardwareAddress(MacAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA")).setName(InterfaceManagerTestUtil.interfaceName);
ncBuilder.addAugmentation(FlowCapableNodeConnector.class,flowCapableNodeConnectorBuilder.build());
return ncBuilder.build();
}
doReturn(Futures.immediateFuture(RpcResultBuilder.<Void>success().build())).when(idManager).releaseId(getIdInput);
boolean isNodePresent = InterfaceManagerCommonUtils.isNodePresent(dataBroker, nodeConnectorId);
removeHelper.removeInterfaceStateConfiguration(idManager, mdsalManager, alivenessMonitorService, nodeConnectorId,
- nodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew, isNodePresent);
+ nodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew, isNodePresent, fcNodeConnectorNew.getName());
verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier);
boolean isNodePresent = InterfaceManagerCommonUtils.isNodePresent(dataBroker, nodeConnectorId);
removeHelper.removeInterfaceStateConfiguration(idManager, mdsalManager, alivenessMonitorService, nodeConnectorId,
- nodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew, isNodePresent);
+ nodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew, isNodePresent, fcNodeConnectorNew.getName());
}