Expose TypedReadTransaction.exists(InstanceIdentifier) 26/85926/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 15 Sep 2019 18:36:41 +0000 (20:36 +0200)
committerHema Gopalakrishnan <hema.gopalkrishnan@ericsson.com>
Wed, 4 Dec 2019 05:19:36 +0000 (05:19 +0000)
This operation was not exposed at the binding layer when these
utilities were conceived and thus is lacking here, even when they
are available as part of MDSAL-389.

The MD-SAL version of TypedReadTransaction has been updated back
then, this patch backports these changes to legacy Genius APIs.

Also converts a few callers to use this capability, potentially
improving performance.

JIRA: MDSAL-389
Change-Id: Ieb870a49c8239ee74e697d7d36dea431b24362ae
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 7144e4db6a02daf37f8ba055745a359d0a80c21e)

interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/InterfaceManagerCommonUtils.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmExternalTunnelDeleteWorker.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/listeners/TransportZoneListener.java
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/impl/ItmExternalTunnelDeleteTest.java
lockmanager/lockmanager-impl/src/main/java/org/opendaylight/genius/lockmanager/impl/LockManagerServiceImpl.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/infra/TransactionAdapter.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/infra/TypedReadTransaction.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/infra/TypedReadTransactionImpl.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/infra/TypedReadWriteTransactionImpl.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/infra/WriteTrackingReadWriteTransaction.java
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/MDSALManager.java

index b7a8abb6ab3ce521cbb7b6686472da9f6dfbf095..1a7f8632b958618f0af166293fe43f9aa02c4b39 100644 (file)
@@ -160,7 +160,7 @@ public final class InterfaceManagerCommonUtils {
         NodeId nodeID = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId);
         InstanceIdentifier<Node> nodeInstanceIdentifier = InstanceIdentifier.builder(Nodes.class)
                 .child(Node.class, new NodeKey(nodeID)).build();
-        return tx.read(LogicalDatastoreType.OPERATIONAL, nodeInstanceIdentifier).checkedGet().isPresent();
+        return tx.exists(LogicalDatastoreType.OPERATIONAL, nodeInstanceIdentifier).checkedGet();
     }
 
     public static InstanceIdentifier<Interface> getInterfaceIdentifier(InterfaceKey interfaceKey) {
index 42951a89e9b011efd123ae46ca730c714b4d124f..516f5d3689436043b3c8e4e4296f0228a3175932 100644 (file)
@@ -283,6 +283,6 @@ public final class ItmExternalTunnelDeleteWorker {
             throws ExecutionException, InterruptedException {
         InstanceIdentifier<ExternalTunnel> path = InstanceIdentifier.create(ExternalTunnelList.class)
                 .child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(dstDpnOrNode, srcDpnOrNode, tunType));
-        return tx.read(path).get().isPresent();
+        return tx.exists(path).get();
     }
 }
index 3db8d655ab79f8d0e21a0d4bf6899e8098d63f1b..592b102c3c54b00b9015c52b8a9fd28de5dda068 100644 (file)
@@ -152,8 +152,8 @@ public class TransportZoneListener extends AbstractSyncDataTreeChangeListener<Tr
     private void initializeTZNode() {
         InstanceIdentifier<TransportZones> path = InstanceIdentifier.create(TransportZones.class);
         txRunner.callWithNewReadWriteTransactionAndSubmit(Datastore.CONFIGURATION, tx -> {
-            FluentFuture<Optional<TransportZones>> tzones = tx.read(path);
-            if (!tzones.get().isPresent()) {
+            FluentFuture<Boolean> tzones = tx.exists(path);
+            if (!tzones.get()) {
                 TransportZonesBuilder tzb = new TransportZonesBuilder();
                 tx.put(path, tzb.build());
             }
index a0603b1cfee0c238c97021121ca94d456f244dd2..70e8f7a70fd7c1ce40f0329784f09c3b6234b70a 100644 (file)
@@ -298,18 +298,19 @@ public class ItmExternalTunnelDeleteTest {
 
         doReturn(FluentFutures.immediateFluentFuture(optionalTransportZone))
                 .when(typedReadWriteTransaction).read(transportZoneIdentifier);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels))
-                .when(typedReadWriteTransaction).read(externalTunnelIdentifier1);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels))
-                .when(typedReadWriteTransaction).read(externalTunnelIdentifier2);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels)).when(typedReadWriteTransaction)
-                .read(externalTunnelIdentifier3);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels)).when(typedReadWriteTransaction)
-                .read(externalTunnelIdentifier4);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels)).when(typedReadWriteTransaction)
-                .read(externalTunnelIdentifier5);
-        doReturn(FluentFutures.immediateFluentFuture(exTunnels)).when(typedReadWriteTransaction)
-                .read(externalTunnelIdentifier6);
+        doReturn(FluentFutures.immediateTrueFluentFuture())
+                .when(typedReadWriteTransaction).exists(externalTunnelIdentifier1);
+        doReturn(FluentFutures.immediateTrueFluentFuture())
+                .when(typedReadWriteTransaction).exists(externalTunnelIdentifier2);
+        doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
+                .exists(externalTunnelIdentifier3);
+        doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
+                .exists(externalTunnelIdentifier4);
+        doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
+                .exists(externalTunnelIdentifier5);
+        doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
+                .exists(externalTunnelIdentifier6);
+
         try {
             ItmExternalTunnelDeleteWorker
                     .deleteHwVtepsTunnels(dpnTepsList, cfgdHwVtepsList, transportZone, typedReadWriteTransaction,
index e210b423024efc99f5b20a980ecbe2246501b29f..141dee724f10c3a2c42ddcba9d56c8db8b4924f4 100644 (file)
@@ -132,8 +132,8 @@ public class LockManagerServiceImpl implements LockManagerService {
     private ListenableFuture<Void> unlock(final String lockName,
         final InstanceIdentifier<Lock> lockInstanceIdentifier, final int retry) {
         ListenableFuture<Void> future = txRunner.callWithNewReadWriteTransactionAndSubmit(tx -> {
-            Optional<Lock> result = tx.read(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier).get();
-            if (!result.isPresent()) {
+            Boolean result = tx.exists(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier).get();
+            if (!result) {
                 LOG.debug("unlock ignored, as unnecessary; lock is already unlocked: {}", lockName);
             } else {
                 tx.delete(LogicalDatastoreType.OPERATIONAL, lockInstanceIdentifier);
index 09c77c3cf1049e1b76a08ca7475ebde5c59108d4..7bf2f6a24b0d2e7cb4eb7338dca026363cf32415 100644 (file)
@@ -150,5 +150,13 @@ public final class TransactionAdapter {
             return Futures.makeChecked(delegate.read(path),
                 e -> new ReadFailedException("Error reading from the datastore", e));
         }
+
+        @Override
+        public CheckedFuture<Boolean, ReadFailedException> exists(LogicalDatastoreType store,
+                InstanceIdentifier<?> path) {
+            checkStore(store);
+            return Futures.makeChecked(delegate.exists(path),
+                e -> new ReadFailedException("Error reading from the datastore", e));
+        }
     }
 }
index 180cde5eb503e5d286762abe2965cae0d4ab20e2..245bb6206b6b39264a2d55ec06eeb44901b5a7f5 100644 (file)
@@ -35,4 +35,15 @@ public interface TypedReadTransaction<D extends Datastore>
      * @return A future providing access to the result of the read, when it’s available, or any error encountered.
      */
     <T extends DataObject> FluentFuture<Optional<T>> read(InstanceIdentifier<T> path);
+
+    /**
+     * Determines if an object exists at the given path.
+     *
+     * @see ReadTransaction#exists(org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType,
+     * InstanceIdentifier)
+     *
+     * @param path The path to read from.
+     * @return A future providing access to the result of the check, when it’s available, or any error encountered.
+     */
+    FluentFuture<Boolean> exists(InstanceIdentifier<?> path);
 }
index c119d389edcd3b3d6069c688774d764303a81e13..6797e8b5ac2c5ff3ae9698054d26ebea9e9aaa95 100644 (file)
@@ -32,6 +32,11 @@ class TypedReadTransactionImpl<D extends Datastore> extends TypedTransaction<D>
         return FluentFuture.from(delegate.read(getDatastoreType(), path));
     }
 
+    @Override
+    public FluentFuture<Boolean> exists(InstanceIdentifier<?> path) {
+        return FluentFuture.from(delegate.exists(getDatastoreType(), path));
+    }
+
     @Override
     public Object getIdentifier() {
         return delegate.getIdentifier();
index bd0668e6ca0d2ae21471db7c668456fc9c0782b3..e43606ccd9de5a579fe51392243f0de5a5dc88a3 100644 (file)
@@ -33,4 +33,9 @@ class TypedReadWriteTransactionImpl<D extends Datastore>
     public <T extends DataObject> FluentFuture<Optional<T>> read(InstanceIdentifier<T> path) {
         return FluentFuture.from(delegate.read(getDatastoreType(), path));
     }
+
+    @Override
+    public FluentFuture<Boolean> exists(InstanceIdentifier<?> path) {
+        return FluentFuture.from(delegate.exists(getDatastoreType(), path));
+    }
 }
index c89d66c54f6e1ce48f69afcae3221da3299e56f1..fa667fb24fc066b8448184e233b5b31ca7bfc340 100644 (file)
@@ -29,4 +29,10 @@ class WriteTrackingReadWriteTransaction extends WriteTrackingWriteTransaction im
             InstanceIdentifier<T> path) {
         return ((ReadWriteTransaction) delegate()).read(store, path);
     }
+
+    @Override
+    public CheckedFuture<Boolean, ReadFailedException> exists(LogicalDatastoreType store,
+            InstanceIdentifier<?> path) {
+        return ((ReadWriteTransaction) delegate()).exists(store, path);
+    }
 }
index 9f1110529cc7a4f2dcb432e66a1e9f389098333c..0221806134e2a850a04750d80d5e679cfe60d45b 100644 (file)
@@ -648,7 +648,7 @@ public class MDSALManager extends AbstractLifecycle implements IMdsalApiManager
 
     private static boolean groupExists(TypedReadTransaction<Configuration> tx, Node nodeDpn, long groupId)
            throws ExecutionException, InterruptedException {
-        return tx.read(buildGroupInstanceIdentifier(groupId, nodeDpn)).get().isPresent();
+        return tx.exists(buildGroupInstanceIdentifier(groupId, nodeDpn)).get();
     }
 
     private static InstanceIdentifier<Group> buildGroupInstanceIdentifier(long groupId, Node nodeDpn) {