Using MD-SAL .exists() API 61/89661/9
authorChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Mon, 11 May 2020 10:05:22 +0000 (15:35 +0530)
committerChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Fri, 26 Jun 2020 12:27:43 +0000 (12:27 +0000)
Description:
Whenever we are performing read operations just to
check it's presence in DS, instead of doing such read,
we can make use of MD-SAL exist() API which provides better performance.

Enhanced INFO level Logging statements.

Signed-off-by: Chetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Change-Id: Ie81f1be19e60af5081780bf0d43419ab433b9d4e
Signed-off-by: Chetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
13 files changed:
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepConnectionManager.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepSouthboundProvider.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/LogicalSwitchUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/McastMacsRemoteRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactUtils.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepMacEntriesRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepUcastMacsLocalUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-it/src/test/java/org/opendaylight/ovsdb/hwvtepsouthbound/it/HwvtepSouthboundIT.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionManager.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundProvider.java
southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionManagerTest.java
utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtils.java

index 76cbdee9c3cb80325dc16a05f233503552cd4c6a..bc51ccc1db724afdb504c91594d877dc09a3c3e1 100644 (file)
@@ -106,6 +106,9 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
         if (hwvtepDeviceEntityOwnershipListener != null) {
             hwvtepDeviceEntityOwnershipListener.close();
         }
+        if (hwvtepOperGlobalListener != null) {
+            hwvtepOperGlobalListener.close();
+        }
 
         for (HwvtepConnectionInstance client: clients.values()) {
             client.disconnect();
@@ -165,8 +168,10 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
             hwvtepConnectionInstance = getConnectionInstance(key);
             if (hwvtepConnectionInstance != null) {
                 if (hwvtepConnectionInstance.getInstanceIdentifier() != null) {
+                    int port = hwvtepConnectionInstance.getOvsdbClient().getConnectionInfo().getRemotePort();
                     deviceUpdateHistory.get(hwvtepConnectionInstance.getInstanceIdentifier()).addToHistory(
                             TransactionType.DELETE, new ClientConnected(client.getConnectionInfo().getRemotePort()));
+                    LOG.info("CONTROLLER - {} {}", TransactionType.DELETE, new ClientConnected(port));
                 }
 
 
@@ -486,6 +491,7 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
             TransactionHistory deviceLog = deviceUpdateHistory.get(iid);
             int port = hwvtepConnectionInstance.getOvsdbClient().getConnectionInfo().getRemotePort();
             deviceLog.addToHistory(TransactionType.ADD, new ClientConnected(port));
+            LOG.info("CONTROLLER - {} {}", TransactionType.ADD, new ClientConnected(port));
             hwvtepConnectionInstance.setControllerTxHistory(controllerLog);
             hwvtepConnectionInstance.setDeviceUpdateHistory(deviceLog);
         }
index a28732220e8c77f55c321f58ed716e8e53abef7c..74cd4a5ee8e21c9c93bcd3f33df8d651cba306f6 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.ovsdb.hwvtepsouthbound;
 
 import com.google.common.util.concurrent.FluentFuture;
 import java.util.Collection;
-import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -198,9 +197,9 @@ public class HwvtepSouthboundProvider implements ClusteredDataTreeChangeListener
                 .create(NetworkTopology.class)
                 .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
         ReadWriteTransaction transaction = dataBroker.newReadWriteTransaction();
-        FluentFuture<Optional<Topology>> hwvtepTp = transaction.read(type, path);
+        FluentFuture<Boolean> hwvtepTp = transaction.exists(type, path);
         try {
-            if (!hwvtepTp.get().isPresent()) {
+            if (!hwvtepTp.get().booleanValue()) {
                 TopologyBuilder tpb = new TopologyBuilder();
                 tpb.setTopologyId(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID);
                 transaction.mergeParentStructurePut(type, path, tpb.build());
@@ -236,6 +235,8 @@ public class HwvtepSouthboundProvider implements ClusteredDataTreeChangeListener
         }
     }
 
+
+
     private void openOvsdbPort() {
         if (!registered.getAndSet(true)) {
             LOG.info("Starting the ovsdb port");
index fa1cb1bafbbbe2f1943890e214e40eac6cccef12..9cc3e24ba7865bb1d44e020d8c0f461efb50e39f 100644 (file)
@@ -92,6 +92,7 @@ public class LogicalSwitchUpdateCommand
             UUID lsUuid = new UUID(TransactUtils.getLogicalSwitchId(lswitch));
             updateCurrentTxData(LogicalSwitches.class, lsKey, lsUuid, lswitch);
             updateControllerTxHistory(TransactionType.ADD, logicalSwitch);
+            LOG.info("CONTROLLER - {} {}", TransactionType.ADD, logicalSwitch);
         } else {
             String existingLogicalSwitchName = lswitch.getHwvtepNodeName().getValue();
             // Name is immutable, and so we *can't* update it.  So we use extraBridge for the schema stuff
@@ -103,6 +104,7 @@ public class LogicalSwitchUpdateCommand
                     .build());
             transaction.add(op.comment("Logical Switch: Updating " + existingLogicalSwitchName));
             updateControllerTxHistory(TransactionType.UPDATE, logicalSwitch);
+            LOG.info("CONTROLLER - {} {}", TransactionType.UPDATE, logicalSwitch);
         }
     }
 
index f0d565139d5f09fe9c11ddbec8e046a61645df59..bf162ea45812733fbff5b2a9439467e0f1919561 100644 (file)
@@ -93,6 +93,7 @@ public class McastMacsRemoteRemoveCommand
                                     final RemoteMcastMacs mac,
                                     final InstanceIdentifier macIid,
                                     final Object... extraData) {
+        String nodeId = instanceIdentifier.firstKeyOf(Node.class).getNodeId().getValue();
         clearConfigData(RemoteMcastMacs.class, macIid);
         long transactionId = getOperationalState().getTransactionId();
         LOG.debug("Remove received for RemoteMcastMacs key: {} txId: {}", macIid, transactionId);
@@ -109,7 +110,9 @@ public class McastMacsRemoteRemoveCommand
                 updateCurrentTxDeleteData(RemoteMcastMacs.class, macIid, mac);
                 updateControllerTxHistory(TransactionType.DELETE, new StringBuilder(mcastMacsRemote.toString())
                         .append(":  LS: ").append(logicalSwitchUid));
-                LOG.info("CONTROLLER - {} {} LS:{}", TransactionType.DELETE, mcastMacsRemote, logicalSwitchUid);
+                LOG.info("CONTROLLER - {} {} LS:{} Node:{}", TransactionType.DELETE,
+                    mcastMacsRemote, logicalSwitchUid, nodeId);
+
             }
         }
         if (!deleted && deviceData != null) {
@@ -121,7 +124,8 @@ public class McastMacsRemoteRemoveCommand
                         .where(mcastMacsRemote.getUuidColumn().getSchema().opEqual(macEntryUUID)).build());
                 updateControllerTxHistory(TransactionType.DELETE, new StringBuilder(mcastMacsRemote.toString())
                         .append(":  Mac : ").append(macEntryUUID));
-                LOG.info("CONTROLLER - {} {} Mac :{}", TransactionType.DELETE, mcastMacsRemote, macEntryUUID);
+                LOG.info("CONTROLLER - {} {} Mac :{} Node:{}", TransactionType.DELETE,
+                    mcastMacsRemote, macEntryUUID, nodeId);
             } else {
                 LOG.error("Failed to delete remote mcast entry as it is not found in device {}", macIid);
                 getDeviceInfo().clearConfigData(RemoteMcastMacs.class, macIid);
index 9ba36305df17407f8676fdd405674be7fba6fe4d..f63da658dcff1351730ba1f17df3e22d44e9d56b 100644 (file)
@@ -186,6 +186,8 @@ public final class TransactUtils {
         transaction.add(op.insert(physicalLocator).withId(locatorUuid));
         hwvtepOperationalState.getDeviceInfo().addToControllerTx(TransactionType.ADD,
                 new StringBuilder(physicalLocator.toString()).append(" Uuid ").append(locatorUuid));
+        LOG.info("CONTROLLER - {} {}", TransactionType.ADD,
+            new StringBuilder(physicalLocator.toString()).append(" Uuid ").append(locatorUuid));
         return new UUID(locatorUuid);
     }
 
index 2c44cab041c44c98a933cf57176779c01106854c..0e87fcc52eb340b4fbbf6f33743608662753d21a 100644 (file)
@@ -84,6 +84,7 @@ public class UcastMacsRemoteRemoveCommand
     private void removeUcastMacRemote(final TransactionBuilder transaction,
                                       final InstanceIdentifier<Node> instanceIdentifier,
                                       final List<RemoteUcastMacs> macList) {
+        String nodeId = instanceIdentifier.firstKeyOf(Node.class).getNodeId().getValue();
         for (RemoteUcastMacs mac: macList) {
             final InstanceIdentifier<RemoteUcastMacs> macIid =
                     instanceIdentifier.augmentation(HwvtepGlobalAugmentation.class)
@@ -106,7 +107,9 @@ public class UcastMacsRemoteRemoveCommand
                                         .opEqual(logicalSwitchUid))
                                 .and(ucastMacsRemote.getMacColumn().getSchema().opEqual(mac.getMacEntryKey()
                                         .getValue())).build());
-                        LOG.info("CONTROLLER - {} {}", TransactionType.DELETE, ucastMacsRemote);
+                        LOG.info("CONTROLLER - {} Mac:{} LS:{} Node:{}", TransactionType.DELETE,
+                            mac.getMacEntryKey(), logicalSwitchUid, nodeId);
+
                     }
                 }
             }
@@ -116,7 +119,7 @@ public class UcastMacsRemoteRemoveCommand
                 ucastMacsRemote.getUuidColumn().setData(macEntryUUID);
                 transaction.add(op.delete(ucastMacsRemote.getSchema())
                         .where(ucastMacsRemote.getUuidColumn().getSchema().opEqual(macEntryUUID)).build());
-                LOG.info("CONTROLLER - {} {}", TransactionType.DELETE, ucastMacsRemote);
+                LOG.info("CONTROLLER - {} {} Node:{}", TransactionType.DELETE, ucastMacsRemote, nodeId);
             } else {
                 LOG.trace("Remove failed to find in op datastore key:{} txId:{}", macIid, getOperationalState()
                         .getTransactionId());
index c12fe2c36d0d663b72af0a36a97f515ae8420e3c..62581f97b84a0d7b5d64329bc64040b344170bf9 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.ovsdb.schema.hardwarevtep.McastMacsLocal;
 import org.opendaylight.ovsdb.schema.hardwarevtep.McastMacsRemote;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsLocal;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsRemote;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
@@ -34,6 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hw
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,6 +63,9 @@ public class HwvtepMacEntriesRemoveCommand extends AbstractTransactionCommand {
         for (UcastMacsLocal lum : deletedLUMRows) {
             if (lum.getMac() != null && lum.getLogicalSwitchColumn() != null
                     && lum.getLogicalSwitchColumn().getData() != null) {
+                LOG.info("DEVICE - {} LocalUcastMacs for Node {} - {}", TransactionType.DELETE,
+                    getOvsdbConnectionInstance().getInstanceIdentifier().firstKeyOf(Node.class)
+                        .getNodeId().getValue(), lum.getMac());
                 InstanceIdentifier<LocalUcastMacs> lumId = getOvsdbConnectionInstance().getInstanceIdentifier()
                     .augmentation(HwvtepGlobalAugmentation.class).child(LocalUcastMacs.class,
                                     new LocalUcastMacsKey(getLogicalSwitchRef(lum.getLogicalSwitchColumn().getData()),
index 11ab62feed3e87be794bece73c22db050e3f420d..d36165a348a3f04bc28eb8f6fe8b5019b96784b6 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsLocal;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -62,6 +63,8 @@ public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionComman
 
     private void updateData(ReadWriteTransaction transaction, Collection<UcastMacsLocal> ucml) {
         final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
+        LOG.info("DEVICE - {} LocalUcastMacs for Node {} - {}", TransactionType.ADD,
+            connectionIId.firstKeyOf(Node.class).getNodeId().getValue(), ucml);
         Node connectionNode = buildConnectionNode(ucml);
         transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
     }
index ebd43c08f68c5814a7f3881875d4de385e36fce6..a189c255e490afd81e65d5dfbc1c4a6240085214 100644 (file)
@@ -306,8 +306,8 @@ public class HwvtepSouthboundIT extends AbstractMdsalTestBase {
         InstanceIdentifier<Topology> path =
                 InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, new TopologyKey(topologyId));
         for (int i = 0; i < 60; i++) {
-            Topology topology = mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, path);
-            if (topology != null) {
+            Boolean topology = mdsalUtils.exists(LogicalDatastoreType.OPERATIONAL, path);
+            if (topology) {
                 LOG.info("getHwvtepTopology: found {}...", HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID.getValue());
                 found = true;
                 break;
index 975c19524018392e8e1782f729cbbfa3259130bb..1d30d798275ac339ede199076fc1209ec55860c9 100644 (file)
@@ -638,14 +638,14 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
                 reconciliationManager.enqueueForRetry(task);
                 break;
             case ON_DISCONNECT: {
-                FluentFuture<Optional<Node>> readNodeFuture;
+                FluentFuture<Boolean> readNodeFuture;
                 try (ReadTransaction tx = db.newReadOnlyTransaction()) {
-                    readNodeFuture = tx.read(LogicalDatastoreType.CONFIGURATION, iid);
+                    readNodeFuture = tx.exists(LogicalDatastoreType.CONFIGURATION, iid);
                 }
-                readNodeFuture.addCallback(new FutureCallback<Optional<Node>>() {
+                readNodeFuture.addCallback(new FutureCallback<Boolean>() {
                     @Override
-                    public void onSuccess(final Optional<Node> node) {
-                        if (node.isPresent()) {
+                    public void onSuccess(final Boolean node) {
+                        if (node.booleanValue()) {
                             LOG.info("Disconnected/Failed connection {} was controller initiated, attempting "
                                     + "reconnection", ovsdbNode.getConnectionInfo());
                             reconciliationManager.enqueue(task);
index 949f76395efeec059bf25daafd8431a106d47d44..3d421af7510333c358019c109f4654e9a9a21dd7 100644 (file)
@@ -13,7 +13,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import javax.annotation.PostConstruct;
@@ -171,9 +170,9 @@ public class SouthboundProvider implements ClusteredDataTreeChangeListener<Topol
                 .create(NetworkTopology.class)
                 .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID));
         ReadWriteTransaction transaction = db.newReadWriteTransaction();
-        FluentFuture<Optional<Topology>> ovsdbTp = transaction.read(type, path);
+        FluentFuture<Boolean> ovsdbTp = transaction.exists(type, path);
         try {
-            if (!ovsdbTp.get().isPresent()) {
+            if (!ovsdbTp.get().booleanValue()) {
                 TopologyBuilder tpb = new TopologyBuilder();
                 tpb.setTopologyId(SouthboundConstants.OVSDB_TOPOLOGY_ID);
                 transaction.mergeParentStructurePut(type, path, tpb.build());
index 57a241fc45af8775dea2b4bcf154f396492b91cd..f2ef95b07b0d11bcb203c8673f3035e0310ac209 100644 (file)
@@ -189,6 +189,8 @@ public class OvsdbConnectionManagerTest {
         when(db.newReadOnlyTransaction()).thenReturn(tx);
         when(tx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
                 .thenReturn(mock(FluentFuture.class));
+        when(tx.exists(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
+            .thenReturn(mock(FluentFuture.class));
         when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
         ovsdbConnManager.disconnected(externalClient);
         Map<ConnectionInfo, OvsdbConnectionInstance> testClients = Whitebox.getInternalState(ovsdbConnManager,
index 6c96fd899129947a01ea7693c1b35a4e2993a250..1460d8bbbac9262e012931bb30d49101169ee2ae 100644 (file)
@@ -150,6 +150,33 @@ public class MdsalUtils {
         return Optional.empty();
     }
 
+
+    public boolean exists(
+        final LogicalDatastoreType store, final InstanceIdentifier<? extends DataObject> path) {
+        int trialNo = 0;
+        ReadTransaction transaction = databroker.newReadOnlyTransaction();
+        do {
+            try {
+                FluentFuture<Boolean> result = transaction.exists(store, path);
+                transaction.close();
+                return result.get().booleanValue();
+            } catch (InterruptedException | ExecutionException e) {
+                if (trialNo == 0) {
+                    logReadFailureError(path, " mdsal Read failed exception retrying the read after sleep");
+                }
+                try {
+                    transaction.close();
+                    Thread.sleep(MDSAL_READ_SLEEP_INTERVAL_MS);
+                    transaction = databroker.newReadOnlyTransaction();
+                } catch (InterruptedException e1) {
+                    logReadFailureError(path, " Sleep interrupted");
+                }
+            }
+        } while (trialNo++ < MDSAL_MAX_READ_TRIALS);
+        logReadFailureError(path, " All read trials exceeded");
+        return false;
+    }
+
     private <D extends DataObject> void logReadFailureError(
             InstanceIdentifier<D> path, String cause) {
         LOG.error("{}: Failed to read {} Cause : {}", Thread.currentThread().getStackTrace()[2], path, cause);