bug 7599 improving perf of ucast mac learning 35/53335/4
authorK.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
Wed, 15 Mar 2017 11:52:13 +0000 (17:22 +0530)
committersuneel verma <k.v.suneelu.verma@ericsson.com>
Mon, 8 May 2017 07:15:51 +0000 (07:15 +0000)
when the device is connected all its macs are learnt in one update.
node.merge is called for each local ucast and remote ucast mac.
Now it is called only once.

when a mac update comes its physical locator need not be part of the
same update. If the locator is not available in the same update get
it from the cache ( which got filled from previous locators update msg).

Change-Id: Idbcf0b881b8ac90526f400c5d17d56a825f0a611
Signed-off-by: K.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepMcastMacsLocalUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepMcastMacsRemoteUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepUcastMacsLocalUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepUcastMacsRemoteUpdateCommand.java

index bafa772c772112ba9cd57ab1bb1c68451cfb3ede..e5ee9f71682cba71fc6cba74123a5ac8d21d6cf1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015, 2017 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,
@@ -125,6 +125,10 @@ public class HwvtepMcastMacsLocalUpdateCommand extends AbstractTransactionComman
                     List<LocatorSet> plsList = new ArrayList<>();
                     for (UUID pLocUUID : plSet.getLocatorsColumn().getData()) {
                         PhysicalLocator pLoc = updatedPLocRows.get(pLocUUID);
+                        if (pLoc == null) {
+                            pLoc = (PhysicalLocator) getOvsdbConnectionInstance().
+                                    getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+                        }
                         InstanceIdentifier<TerminationPoint> tpIid = HwvtepSouthboundMapper.createInstanceIdentifier(
                                 getOvsdbConnectionInstance().getInstanceIdentifier(), pLoc);
                         plsList.add(new LocatorSetBuilder()
index 75647d49cd04676d9338f6d85c8801eb0b3a09fd..6686e175564733ce5013ac58bdc831fb99fadd0e 100644 (file)
@@ -139,6 +139,10 @@ public class HwvtepMcastMacsRemoteUpdateCommand extends AbstractTransactionComma
                     List<LocatorSet> plsList = new ArrayList<>();
                     for (UUID pLocUUID : plSet.getLocatorsColumn().getData()) {
                         PhysicalLocator pLoc = updatedPLocRows.get(pLocUUID);
+                        if (pLoc == null) {
+                            pLoc = (PhysicalLocator) getOvsdbConnectionInstance().
+                                    getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+                        }
                         InstanceIdentifier<TerminationPoint> tpIid = HwvtepSouthboundMapper.createInstanceIdentifier(
                                 getOvsdbConnectionInstance().getInstanceIdentifier(), pLoc);
                         plsList.add(new LocatorSetBuilder()
index e03038d884d059d675742e49057e30bb83632fb3..ae8cd0a69e0ff15a4e5a334544ffdb9e7227b608 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015, 2017 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,
@@ -11,6 +11,7 @@ package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 import com.google.common.base.Optional;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -40,9 +41,12 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionCommand {
 
+    private static final Logger LOG = LoggerFactory.getLogger(HwvtepUcastMacsLocalUpdateCommand.class);
     private Map<UUID, UcastMacsLocal> updatedUMacsLocalRows;
     private Map<UUID, PhysicalLocator> updatedPLocRows;
 
@@ -54,12 +58,10 @@ public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionComman
 
     @Override
     public void execute(ReadWriteTransaction transaction) {
-        for (UcastMacsLocal ucastMacsLocal : updatedUMacsLocalRows.values()) {
-            updateData(transaction, ucastMacsLocal);
-        }
+        updateData(transaction, updatedUMacsLocalRows.values());
     }
 
-    private void updateData(ReadWriteTransaction transaction, UcastMacsLocal ucml) {
+    private void updateData(ReadWriteTransaction transaction, Collection<UcastMacsLocal> ucml) {
         final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
         Optional<Node> connection = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
         if (connection.isPresent()) {
@@ -70,12 +72,21 @@ public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionComman
         }
     }
 
-    private Node buildConnectionNode(UcastMacsLocal ucml) {
+    private Node buildConnectionNode(final Collection<UcastMacsLocal> ucml) {
         //Update node with UcastMacsLocal reference
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
         InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
         HwvtepGlobalAugmentationBuilder hgAugmentationBuilder = new HwvtepGlobalAugmentationBuilder();
+        List<LocalUcastMacs> umclList = new ArrayList<>();
+        ucml.forEach( (mac) -> umclList.add(buildLocalUcastMac(mac)));
+        hgAugmentationBuilder.setLocalUcastMacs(umclList);
+        connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
+        return connectionNode.build();
+    }
+
+    private LocalUcastMacs buildLocalUcastMac(final UcastMacsLocal ucml) {
+        InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
         LocalUcastMacsBuilder ucmlBuilder = new LocalUcastMacsBuilder();
         if (ucml.getIpAddr() != null && !ucml.getIpAddr().isEmpty()) {
             ucmlBuilder.setIpaddr(new IpAddress(ucml.getIpAddr().toCharArray()));
@@ -85,6 +96,10 @@ public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionComman
         if (ucml.getLocatorColumn() != null && ucml.getLocatorColumn().getData() != null) {
             UUID plocUUID = ucml.getLocatorColumn().getData();
             PhysicalLocator physicalLocator = updatedPLocRows.get(plocUUID);
+            if (physicalLocator == null) {
+                physicalLocator = (PhysicalLocator) getOvsdbConnectionInstance().
+                        getDeviceInfo().getDeviceOperData(TerminationPoint.class, plocUUID);
+            }
             if (physicalLocator != null) {
                 InstanceIdentifier<TerminationPoint> plIid =
                         HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid, physicalLocator);
@@ -100,11 +115,7 @@ public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionComman
                 ucmlBuilder.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(lSwitchIid));
             }
         }
-        List<LocalUcastMacs> umclList = new ArrayList<>();
-        umclList.add(ucmlBuilder.build());
-        hgAugmentationBuilder.setLocalUcastMacs(umclList);
-        connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
-        return connectionNode.build();
+        return ucmlBuilder.build();
     }
 
-}
+}
\ No newline at end of file
index a6ff82ad39eff4841ab6ec461320dc414c9f9e51..d6c5ed46961ad165e1b595cb0458899f09369a78 100644 (file)
@@ -8,6 +8,11 @@
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
 import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -37,10 +42,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionCommand {
 
     private final Map<UUID, UcastMacsRemote> updatedUMacsRemoteRows;
@@ -54,39 +55,33 @@ public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionComma
 
     @Override
     public void execute(ReadWriteTransaction transaction) {
-        for (UcastMacsRemote ucastMacsRemote : updatedUMacsRemoteRows.values()) {
-            updateUcastMacsRemote(transaction, ucastMacsRemote);
-        }
+        updateUcastMacsRemote(transaction, updatedUMacsRemoteRows.values());
     }
 
-    private void updateUcastMacsRemote(ReadWriteTransaction transaction, UcastMacsRemote ucastMacsRemote) {
+    private void updateUcastMacsRemote(ReadWriteTransaction transaction, Collection<UcastMacsRemote> ucastMacsRemote) {
         final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
         Optional<Node> connection = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
         if (connection.isPresent()) {
             Node connectionNode = buildConnectionNode(ucastMacsRemote);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
-            InstanceIdentifier<RemoteUcastMacs> macIid = getMacIid(connectionIId, connectionNode);
-            getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(RemoteUcastMacs.class, macIid,
-                    ucastMacsRemote.getUuid(), ucastMacsRemote);
             //TODO: Handle any deletes
         }
     }
 
-
-    InstanceIdentifier<RemoteUcastMacs> getMacIid(InstanceIdentifier<Node> connectionIId, Node connectionNode) {
-        RemoteUcastMacsKey macsKey =
-                connectionNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteUcastMacs().get(0).getKey();
-        InstanceIdentifier<RemoteUcastMacs> key = connectionIId.augmentation(HwvtepGlobalAugmentation.class).
-                child(RemoteUcastMacs.class, macsKey);
-        return key;
-    }
-
-    private Node buildConnectionNode(UcastMacsRemote uMacRemote) {
+    private Node buildConnectionNode(final Collection<UcastMacsRemote> uMacRemotes) {
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
         InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
         HwvtepGlobalAugmentationBuilder hgAugmentationBuilder = new HwvtepGlobalAugmentationBuilder();
         List<RemoteUcastMacs> remoteUMacs = new ArrayList<>();
+        uMacRemotes.forEach( (mac) -> remoteUMacs.add(buildRemoteUcast(mac)));
+        hgAugmentationBuilder.setRemoteUcastMacs(remoteUMacs);
+        connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
+        return connectionNode.build();
+    }
+
+    private RemoteUcastMacs buildRemoteUcast(final UcastMacsRemote uMacRemote) {
+        InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
         RemoteUcastMacsBuilder rumBuilder = new RemoteUcastMacsBuilder();
         rumBuilder.setMacEntryKey(new MacAddress(uMacRemote.getMac()));
         rumBuilder.setMacEntryUuid(new Uuid(uMacRemote.getUuid().toString()));
@@ -97,6 +92,10 @@ public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionComma
                 && uMacRemote.getLocatorColumn().getData() != null) {
             UUID pLocUUID = uMacRemote.getLocatorColumn().getData();
             PhysicalLocator physicalLocator = updatedPLocRows.get(pLocUUID);
+            if (physicalLocator == null) {
+                physicalLocator = (PhysicalLocator) getOvsdbConnectionInstance().
+                        getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+            }
             if (physicalLocator != null) {
                 InstanceIdentifier<TerminationPoint> plIid = HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid,
                         physicalLocator);
@@ -113,10 +112,15 @@ public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionComma
                 rumBuilder.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(lSwitchIid));
             }
         }
-        remoteUMacs.add(rumBuilder.build());
-        hgAugmentationBuilder.setRemoteUcastMacs(remoteUMacs);
-        connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
-        return connectionNode.build();
+        RemoteUcastMacs remoteUcastMacs = rumBuilder.build();
+        InstanceIdentifier<RemoteUcastMacs> macIid = getMacIid(remoteUcastMacs);
+        getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(RemoteUcastMacs.class, macIid,
+                uMacRemote.getUuid(), uMacRemote);
+        return remoteUcastMacs;
     }
 
+    private InstanceIdentifier<RemoteUcastMacs> getMacIid(final RemoteUcastMacs remoteUcastMacs) {
+        return getOvsdbConnectionInstance().getInstanceIdentifier().
+                augmentation(HwvtepGlobalAugmentation.class).child(RemoteUcastMacs.class, remoteUcastMacs.getKey());
+    }
 }