Migrate deprecated submit() to commit() for BGP/BMP 20/72220/2
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Thu, 10 May 2018 11:34:15 +0000 (13:34 +0200)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Thu, 24 May 2018 12:30:10 +0000 (14:30 +0200)
Change-Id: Id22bb9d50c40e94bb616272d018a376cecc1705a
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
35 files changed:
bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java
bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java
bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/extended/communities/Ipv4SpecificEcHandlerTest.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibsInWriterTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java
bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java
bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilderTest.java
bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderTest.java
bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderTest.java
bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRibInWriter.java
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterPeerImpl.java
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java

index acd23618329c55a29d9464134ca23fd73d72f7d6..04b1f5e752c74974d428c00d6cecdf84dca1814d 100644 (file)
@@ -15,11 +15,11 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Stopwatch;
 import com.google.common.net.InetAddresses;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -28,9 +28,9 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.application.rib.tables.routes.Ipv4RoutesCaseBuilder;
@@ -120,9 +120,9 @@ public class AppPeerBenchmark implements OdlBgpAppPeerBenchmarkService, Transact
 
         final WriteTransaction wTx = this.txChain.newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.CONFIGURATION, this.appIID, appRib);
-        Futures.addCallback(wTx.submit(), new FutureCallback<Void>() {
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.info("Empty Structure created for Application Peer Benchmark {}", AppPeerBenchmark.this.appRibId);
             }
 
@@ -175,8 +175,8 @@ public class AppPeerBenchmark implements OdlBgpAppPeerBenchmarkService, Transact
         final WriteTransaction dTx = this.txChain.newWriteOnlyTransaction();
         dTx.delete(LogicalDatastoreType.CONFIGURATION, this.appIID);
         try {
-            dTx.submit().checkedGet();
-        } catch (final TransactionCommitFailedException e) {
+            dTx.commit().get();
+        } catch (final InterruptedException | ExecutionException e) {
             LOG.warn("Failed to clean-up BGP Application RIB.", e);
         }
         this.txChain.close();
@@ -226,12 +226,32 @@ public class AppPeerBenchmark implements OdlBgpAppPeerBenchmarkService, Transact
                 wt.delete(LogicalDatastoreType.CONFIGURATION, routeIId);
             }
             if (i % batch == 0) {
-                wt.submit();
+                wt.commit().addCallback(new FutureCallback<CommitInfo>() {
+                    @Override
+                    public void onSuccess(final CommitInfo result) {
+                        LOG.trace("Successful commit");
+                    }
+
+                    @Override
+                    public void onFailure(final Throwable trw) {
+                        LOG.error("Failed commit", trw);
+                    }
+                }, MoreExecutors.directExecutor());
                 wt = this.txChain.newWriteOnlyTransaction();
             }
             address = increasePrefix(address);
         }
-        wt.submit();
+        wt.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Route batch stored.");
+            }
+
+            @Override
+            public void onFailure(final Throwable throwable) {
+                LOG.error("Failed to store route batch.", throwable);
+            }
+        }, MoreExecutors.directExecutor());
         return stopwatch.stop().elapsed(TimeUnit.MILLISECONDS);
     }
 
index 24c7b6898ff2f673119a59bfdd5bf07b072dce13..db090728937c3d7fad5275337bbf0bb7eecab7c4 100644 (file)
@@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -35,6 +34,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState;
 import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
@@ -109,9 +109,9 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl
                     try {
                         updateBGPStats(wTx);
 
-                        Futures.addCallback(wTx.submit(), new FutureCallback<Void>() {
+                        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
                             @Override
-                            public void onSuccess(Void result) {
+                            public void onSuccess(CommitInfo result) {
                                 LOG.debug("Successfully committed BGP stats update");
                             }
 
@@ -176,7 +176,17 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl
                 final WriteTransaction wTx = this.transactionChain.newWriteOnlyTransaction();
                 this.instanceIdentifiersCache.keySet().iterator()
                 .forEachRemaining(ribId -> removeStoredOperationalState(ribId, wTx));
-                wTx.submit();
+                wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+                    @Override
+                    public void onSuccess(final CommitInfo result) {
+                        LOG.trace("Successfully operational stats removed.");
+                    }
+
+                    @Override
+                    public void onFailure(final Throwable throwable) {
+                        LOG.error("Failed to clean up operational stats", throwable);
+                    }
+                }, MoreExecutors.directExecutor());
             }
             this.transactionChain.close();
             this.scheduler.shutdown();
index 14e3f68e5b4e01d4b96fe987df378f3fe9cec8a9..ca3c2803861fc5f046bd6d018766e7e14ea027c5 100644 (file)
@@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import org.junit.Assert;
 import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.extended.community.ExtendedCommunity;
index 38ef50de9e477572e7165ed01b1437f2ca862858..ba2f53af7173df4b8fc47fb5562c7da08202bdae 100644 (file)
@@ -7,11 +7,9 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Arrays;
 import java.util.Set;
 import javax.annotation.Nonnull;
@@ -22,6 +20,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.impl.state.BGPPeerStateImpl;
 import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
@@ -80,18 +79,17 @@ abstract class AbstractPeer extends BGPPeerStateImpl implements BGPRouteEntryImp
                 rib.getLocalTablesKeys(), afiSafisGracefulAdvertized);
     }
 
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    final synchronized ListenableFuture<Void> removePeer(
+    final synchronized FluentFuture<? extends CommitInfo> removePeer(
             @Nonnull final DOMTransactionChain chain,
             @Nullable final YangInstanceIdentifier peerPath) {
         if (peerPath != null) {
             LOG.info("AdjRibInWriter closed per Peer {} removed", peerPath);
             final DOMDataWriteTransaction tx = chain.newWriteOnlyTransaction();
             tx.delete(LogicalDatastoreType.OPERATIONAL, peerPath);
-            final ListenableFuture<Void> future = tx.submit();
-            Futures.addCallback(future, new FutureCallback<Void>() {
+            final FluentFuture<? extends CommitInfo> future = tx.commit();
+            future.addCallback(new FutureCallback<CommitInfo>() {
                 @Override
-                public void onSuccess(final Void result) {
+                public void onSuccess(final CommitInfo result) {
                     LOG.debug("Peer {} removed", peerPath);
                 }
 
@@ -102,7 +100,7 @@ abstract class AbstractPeer extends BGPPeerStateImpl implements BGPRouteEntryImp
             }, MoreExecutors.directExecutor());
             return future;
         }
-        return Futures.immediateFuture(null);
+        return CommitInfo.emptyFluentFuture();
     }
 
     synchronized YangInstanceIdentifier createPeerPath() {
index 6fdc59ca99eac2ce12ff4a8a29c23fba4eb528d7..9b2738fd4b2ef5cff12bcd09b4ae5c860e6cd04b 100644 (file)
@@ -13,8 +13,6 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collections;
 import java.util.Locale;
@@ -27,6 +25,7 @@ import javax.annotation.concurrent.NotThreadSafe;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer.RegisterAppPeerListener;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
@@ -148,9 +147,9 @@ final class AdjRibInWriter {
         final ImmutableMap<TablesKey, TableContext> tb = createNewTableInstances(peerPath, registry, tableTypes,
                 addPathTablesType, tx);
 
-        Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 if (registerAppPeerListener != null) {
                     LOG.trace("Application Peer Listener registered");
                     registerAppPeerListener.register();
@@ -252,9 +251,9 @@ final class AdjRibInWriter {
         final TableContext ctx = this.tables.get(tableTypes);
         tx.merge(LogicalDatastoreType.OPERATIONAL, ctx.getTableId().node(Attributes.QNAME)
                 .node(ATTRIBUTES_UPTODATE_TRUE.getNodeType()), ATTRIBUTES_UPTODATE_TRUE);
-        Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.trace("Write Attributes uptodate, succeed");
             }
 
@@ -277,9 +276,9 @@ final class AdjRibInWriter {
         final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
         ctx.writeRoutes(tx, nlri, attributes);
         LOG.trace("Write routes {}", nlri);
-        Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.trace("Write routes {}, succeed", nlri);
             }
 
@@ -300,9 +299,9 @@ final class AdjRibInWriter {
         LOG.trace("Removing routes {}", nlri);
         final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
         ctx.removeRoutes(tx, nlri);
-        Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.trace("Removing routes {}, succeed", nlri);
             }
 
index 103b5669573b7152190da879b6087bfa0cc5467c..8cf798ac0c7c12d81fc065ab9a05a89191ced4f4 100644 (file)
@@ -14,9 +14,9 @@ import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.net.InetAddresses;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -29,6 +29,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
 import org.opendaylight.protocol.bgp.rib.impl.state.BGPSessionStateImpl;
@@ -208,7 +209,17 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre
                 }
             }
         }
-        tx.submit();
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
     private synchronized void processRoutesTable(final DataTreeCandidateNode node,
@@ -245,10 +256,8 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre
         }
     }
 
-    // FIXME ListenableFuture<?> should be used once closeServiceInstance uses wildcard too
     @Override
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public synchronized ListenableFuture<Void> close() {
+    public synchronized FluentFuture<? extends CommitInfo> close() {
         setActive(false);
         if (this.registration != null) {
             this.registration.close();
@@ -257,13 +266,13 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre
         if (this.effectiveRibInWriter != null) {
             this.effectiveRibInWriter.close();
         }
-        final ListenableFuture<Void> future;
+        final FluentFuture<? extends CommitInfo> future;
         if (this.chain != null) {
             future = removePeer(this.chain, this.peerPath);
             this.chain.close();
             this.chain = null;
         } else {
-            future = Futures.immediateFuture(null);
+            future = CommitInfo.emptyFluentFuture();
         }
         if (this.writerChain != null) {
             this.writerChain.close();
index df1e3e555c5387f634b29c9ac9d0517bccce940b..375b577aa58249f3cdb4ce5efd7a664d292576af 100644 (file)
@@ -18,7 +18,7 @@ import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.net.InetAddresses;
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -35,6 +35,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
 import org.opendaylight.protocol.bgp.parser.BGPError;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.LocalPreferenceAttributeParser;
@@ -224,10 +225,9 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
         setActive(true);
     }
 
-    // FIXME ListenableFuture<?> should be used once closeServiceInstance uses wildcard too
     @Override
-    public synchronized ListenableFuture<Void> close() {
-        final ListenableFuture<Void> future = releaseConnection();
+    public synchronized FluentFuture<? extends CommitInfo> close() {
+        final FluentFuture<? extends CommitInfo> future = releaseConnection();
         this.chain.close();
         setActive(false);
         return future;
@@ -388,8 +388,7 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
         }
     }
 
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    private synchronized ListenableFuture<Void> cleanup() {
+    private synchronized FluentFuture<? extends CommitInfo> cleanup() {
         // FIXME: BUG-196: support graceful
         this.adjRibOutListenerSet.values().forEach(AdjRibOutListener::close);
         this.adjRibOutListenerSet.clear();
@@ -429,14 +428,14 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
     }
 
     @Override
-    public synchronized ListenableFuture<Void> releaseConnection() {
+    public synchronized FluentFuture<? extends CommitInfo> releaseConnection() {
         LOG.info("Closing session with peer");
         this.sessionUp = false;
         closeRegistration();
         if (this.rpcRegistration != null) {
             this.rpcRegistration.close();
         }
-        final ListenableFuture<Void> future = cleanup();
+        final FluentFuture<? extends CommitInfo> future = cleanup();
 
         if (this.session != null) {
             try {
index 94d1294d167649c73815e8e08554bcb20d19b8be..fcbfd0409fd2b721b8210f5581517c83e6c9c222 100644 (file)
@@ -11,6 +11,8 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Optional;
@@ -26,6 +28,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
 import org.opendaylight.protocol.bgp.rib.impl.state.peer.PrefixesInstalledCounters;
@@ -170,7 +173,17 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn
             }
         }
         if (tx != null) {
-            tx.submit();
+            tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+                @Override
+                public void onSuccess(final CommitInfo result) {
+                    LOG.trace("Successful commit");
+                }
+
+                @Override
+                public void onFailure(final Throwable trw) {
+                    LOG.error("Failed commit", trw);
+                }
+            }, MoreExecutors.directExecutor());
         }
     }
 
index 6e854a7695f2b3e9e8db575f5d7c2f78cf0e646d..17784090ca8a40dc6fd4fd4b1d2ebda8e153fd5a 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.protocol.bgp.rib.impl;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.primitives.UnsignedInteger;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -26,6 +28,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
 import org.opendaylight.protocol.bgp.mode.api.RouteEntry;
 import org.opendaylight.protocol.bgp.rib.impl.state.rib.TotalPathsCounter;
@@ -118,7 +121,17 @@ final class LocRibWriter implements AutoCloseable, TotalPrefixesCounter, TotalPa
         tx.merge(LogicalDatastoreType.OPERATIONAL,
                 this.locRibTableIID.builder().child(Attributes.class).build(),
                 new AttributesBuilder().setUptodate(true).build());
-        tx.submit();
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
 
         final InstanceIdentifier<Tables> tableId = this.ribIId.builder().child(Peer.class)
                 .child(EffectiveRibIn.class).child(Tables.class, this.tk).build();
@@ -182,7 +195,17 @@ final class LocRibWriter implements AutoCloseable, TotalPrefixesCounter, TotalPa
         } catch (final Exception e) {
             LOG.error("Failed to completely propagate updates {}, state is undefined", changes, e);
         } finally {
-            tx.submit();
+            tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+                @Override
+                public void onSuccess(final CommitInfo result) {
+                    LOG.trace("Successful commit");
+                }
+
+                @Override
+                public void onFailure(final Throwable trw) {
+                    LOG.error("Failed commit", trw);
+                }
+            }, MoreExecutors.directExecutor());
         }
     }
 
index e227e0e8d581415bd99d0af41353af879d5f41bf..e0cdddab91ba3a3a423dcdbe37296831c18e9343 100755 (executable)
@@ -12,15 +12,16 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.GuardedBy;
 import javax.annotation.concurrent.ThreadSafe;
@@ -30,12 +31,12 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
 import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory;
@@ -174,8 +175,8 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh
 
             tx.put(LogicalDatastoreType.OPERATIONAL, tableId.build(), table.build());
             try {
-                tx.submit().checkedGet();
-            } catch (final TransactionCommitFailedException e1) {
+                tx.commit().get();
+            } catch (final InterruptedException | ExecutionException e1) {
                 LOG.error("Failed to initiate LocRIB for key {}", key, e1);
             }
         } else {
@@ -357,8 +358,8 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh
         trans.put(LogicalDatastoreType.OPERATIONAL, this.yangRibId, ribInstance);
 
         try {
-            trans.submit().checkedGet();
-        } catch (final TransactionCommitFailedException e) {
+            trans.commit().get();
+        } catch (final InterruptedException | ExecutionException e) {
             LOG.error("Failed to initiate RIB {}", this.yangRibId, e);
         }
 
@@ -368,11 +369,10 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh
         this.localTablesKeys.forEach(this::createLocRibWriter);
     }
 
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public synchronized ListenableFuture<Void> closeServiceInstance() {
+    public synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
         if (!this.isServiceInstantiated) {
             LOG.trace("RIB {} already closed", this.ribId.getValue());
-            return Futures.immediateFuture(null);
+            return CommitInfo.emptyFluentFuture();
         }
         LOG.info("Close RIB {}", this.ribId.getValue());
         this.isServiceInstantiated = false;
@@ -383,8 +383,19 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh
 
         final DOMDataWriteTransaction t = this.domChain.newWriteOnlyTransaction();
         t.delete(LogicalDatastoreType.OPERATIONAL, getYangRibId());
-        final ListenableFuture<Void> cleanFuture = t.submit();
+        final FluentFuture<? extends CommitInfo> cleanFuture = t.commit();
+        cleanFuture.addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.info("RIB cleaned {}", RIBImpl.this.ribId.getValue());
+            }
 
+            @Override
+            public void onFailure(final Throwable throwable) {
+                LOG.error("Failed to clean RIB {}",
+                        RIBImpl.this.ribId.getValue(), throwable);
+            }
+        }, MoreExecutors.directExecutor());
         this.domChain.close();
         return cleanFuture;
     }
index 2d1a3b1597644773672125627bf2e9104ea4ee4d..d3ca61416eefbc3fa7cba1fc20b1de795c0b7bef 100644 (file)
@@ -10,14 +10,13 @@ package org.opendaylight.protocol.bgp.rib.impl.config;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
 import java.util.Objects;
 import javax.annotation.concurrent.GuardedBy;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
@@ -91,13 +90,12 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
     }
 
     @Override
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public synchronized ListenableFuture<Void> closeServiceInstance() {
+    public synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
         if (this.bgpAppPeerSingletonService != null) {
             return this.bgpAppPeerSingletonService.closeServiceInstance();
         }
 
-        return Futures.immediateFuture(null);
+        return CommitInfo.emptyFluentFuture();
     }
 
     @Override
@@ -137,11 +135,10 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
                     new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, yangIId));
         }
 
-        @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-        public synchronized ListenableFuture<Void> closeServiceInstance() {
+        public synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
             if (!this.isServiceInstantiated) {
                 LOG.trace("Application peer already closed {}", this.appRibId.getValue());
-                return Futures.immediateFuture(null);
+                return CommitInfo.emptyFluentFuture();
             }
             LOG.info("Application peer instance closed {}", this.appRibId.getValue());
             this.isServiceInstantiated = false;
index 9d204c7eace16e872e2b51c7ae3bc20f6d4961f0..deedf6b0ef214ac4ecd305a7319ce1a88d2d899d 100644 (file)
@@ -30,6 +30,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.concurrent.GuardedBy;
 import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
@@ -98,17 +99,20 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
     }
 
     @Override
-    public synchronized ListenableFuture<Void> closeServiceInstance() {
+    public synchronized ListenableFuture<? extends CommitInfo> closeServiceInstance() {
         LOG.info("BGPClusterSingletonService {} close service instance", this.serviceGroupIdentifier.getValue());
         this.instantiated.set(false);
 
-        final List<ListenableFuture<Void>> futurePeerCloseList = this.peers.values().stream()
+        final List<ListenableFuture<? extends CommitInfo>> futurePeerCloseList = this.peers.values().stream()
                 .map(PeerBean::closeServiceInstance).collect(Collectors.toList());
-        final SettableFuture<Void> done = SettableFuture.create();
-        Futures.addCallback(Futures.allAsList(futurePeerCloseList), new FutureCallback<List<Void>>() {
+        final SettableFuture<? extends CommitInfo> done = SettableFuture.create();
+
+        final ListenableFuture<List<CommitInfo>> futureResult = Futures.allAsList(futurePeerCloseList);
+        Futures.addCallback(futureResult, new FutureCallback<List<? extends CommitInfo>>() {
             @Override
-            public void onSuccess(final List<Void> result) {
-                done.setFuture(BGPClusterSingletonService.this.ribImpl.closeServiceInstance());
+            public void onSuccess(final List<? extends CommitInfo> result) {
+                done.setFuture(Futures.transform(BGPClusterSingletonService.this.ribImpl.closeServiceInstance(),
+                        input -> null, MoreExecutors.directExecutor()));
             }
 
             @Override
index 22482ac6af76d8df6db8287964c42cdbcc5dffd5..c88c31dba84ed7c7be940707686a5527fb4225fb 100644 (file)
@@ -14,9 +14,8 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collection;
 import java.util.HashMap;
@@ -32,6 +31,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
@@ -92,15 +92,15 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
         this.tableTypeRegistry = requireNonNull(mappingService);
         this.networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
                 .child(NetworkInstance.class, new NetworkInstanceKey(networkInstanceName));
-        Futures.addCallback(initializeNetworkInstance(dataBroker, this.networkInstanceIId), new FutureCallback<Void>() {
+        initializeNetworkInstance(dataBroker, this.networkInstanceIId).addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.debug("Network Instance {} initialized successfully.", networkInstanceName);
             }
 
             @Override
-            public void onFailure(final Throwable t) {
-                LOG.error("Failed to initialize Network Instance {}.", networkInstanceName, t);
+            public void onFailure(final Throwable throwable) {
+                LOG.error("Failed to initialize Network Instance {}.", networkInstanceName, throwable);
             }
         }, MoreExecutors.directExecutor());
     }
@@ -174,13 +174,13 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
 
     }
 
-    private static ListenableFuture<Void> initializeNetworkInstance(
+    private static FluentFuture<? extends CommitInfo> initializeNetworkInstance(
             final DataBroker dataBroker, final InstanceIdentifier<NetworkInstance> networkInstance) {
         final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
         wTx.merge(LogicalDatastoreType.CONFIGURATION, networkInstance,
                 new NetworkInstanceBuilder().setName(networkInstance.firstKeyOf(NetworkInstance.class).getName())
                         .setProtocols(new ProtocolsBuilder().build()).build());
-        return wTx.submit();
+        return wTx.commit();
     }
 
     @VisibleForTesting
index 44753b0aed55840ff12a7c5552504a581ab4773a..a7358453f7c95afc011fe70cb6cee00d6e42ede5 100644 (file)
@@ -12,9 +12,7 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
 import io.netty.util.concurrent.Future;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
@@ -26,6 +24,7 @@ import java.util.Set;
 import javax.annotation.concurrent.GuardedBy;
 import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.parser.BgpExtendedMessageUtil;
 import org.opendaylight.protocol.bgp.parser.spi.MultiprotocolCapabilitiesUtil;
@@ -164,14 +163,13 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
     }
 
     @Override
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public synchronized ListenableFuture<Void> closeServiceInstance() {
+    public synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
         if (this.bgpPeerSingletonService != null) {
-            final ListenableFuture<Void> fut = this.bgpPeerSingletonService.closeServiceInstance();
+            final FluentFuture<? extends CommitInfo> fut = this.bgpPeerSingletonService.closeServiceInstance();
             this.bgpPeerSingletonService = null;
             return fut;
         }
-        return Futures.immediateFuture(null);
+        return CommitInfo.emptyFluentFuture();
     }
 
     @Override
@@ -299,11 +297,10 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
             }
         }
 
-        @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-        private synchronized ListenableFuture<Void> closeServiceInstance() {
+        private synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
             if (!this.isServiceInstantiated) {
                 LOG.info("Peer {} already closed", this.neighborAddress);
-                return Futures.immediateFuture(null);
+                return CommitInfo.emptyFluentFuture();
             }
             LOG.info("Close Peer {}", this.neighborAddress);
             this.isServiceInstantiated = false;
@@ -311,7 +308,7 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
                 this.connection.cancel(true);
                 this.connection = null;
             }
-            final ListenableFuture<Void> future = this.bgpPeer.close();
+            final FluentFuture<? extends CommitInfo> future = this.bgpPeer.close();
             removePeer(this.dispatcher.getBGPPeerRegistry());
             return future;
         }
index 86a7d10667848c214f5f10033e746128ffa35d0f..24b8c1d80d58b0a000fd3697d7b9aabdc6dead9e 100644 (file)
@@ -8,7 +8,8 @@
 
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.FluentFuture;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
@@ -31,7 +32,7 @@ public interface PeerBean extends AutoCloseable {
 
     void instantiateServiceInstance();
 
-    ListenableFuture<Void> closeServiceInstance();
+    FluentFuture<? extends CommitInfo> closeServiceInstance();
 
     Boolean containsEqualConfiguration(Neighbor neighbor);
 }
index 0c4a1f43870cbe96ec55d3e47e65ebd893ac1987..ec403dd6f4d195a93604e1c794ab1e957c743794 100644 (file)
@@ -13,9 +13,7 @@ import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUti
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes;
 
 import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -27,6 +25,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory;
@@ -185,12 +184,11 @@ public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
         return this.ribImpl.getDataBroker();
     }
 
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    ListenableFuture<Void> closeServiceInstance() {
+    FluentFuture<? extends CommitInfo> closeServiceInstance() {
         if (this.ribImpl != null) {
             return this.ribImpl.closeServiceInstance();
         }
-        return Futures.immediateFuture(null);
+        return CommitInfo.emptyFluentFuture();
     }
 
     @Override
index 3cd4f09eb6c9bf15f3f8eca0591d39b6a9d9561e..11e1d73eb62c0b74082fbd166b04b19d5792e64c 100644 (file)
@@ -16,6 +16,7 @@ import static org.mockito.Mockito.mock;
 
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -51,6 +52,7 @@ import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrate
 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
@@ -124,7 +126,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest {
     private DOMDataWriteTransaction domTransWrite;
 
     @Mock
-    private CheckedFuture<?, ?> future;
+    private FluentFuture<? extends CommitInfo> future;
 
     @Mock
     private Optional<Rib> o;
@@ -214,14 +216,14 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest {
         doReturn(this.domChain).when(this.dom).createTransactionChain(any(BGPPeer.class));
         doReturn(this.transWrite).when(this.chain).newWriteOnlyTransaction();
         doReturn(false).when(this.o).isPresent();
-        doReturn(this.o).when(this.future).checkedGet();
-        doReturn(this.future).when(this.domTransWrite).submit();
+        doReturn(this.o).when(this.future).get();
+        doReturn(this.future).when(this.domTransWrite).commit();
         doNothing().when(this.future).addListener(any(Runnable.class), any(Executor.class));
         doNothing().when(this.transWrite).put(eq(LogicalDatastoreType.OPERATIONAL),
                 any(InstanceIdentifier.class), any(DataObject.class), eq(true));
         doNothing().when(this.transWrite).put(eq(LogicalDatastoreType.OPERATIONAL),
                 any(InstanceIdentifier.class), any(DataObject.class));
-        doReturn(this.future).when(this.transWrite).submit();
+        doReturn(this.future).when(this.transWrite).commit();
     }
 
     public Collection<DataTreeCandidate> ipv4Input(final YangInstanceIdentifier target,
index 44efa1164f37eea55612e7c43382b60e4c24a808..e7b0a52cb71f5ac910103df41785f763d1fd66ef 100644 (file)
@@ -9,20 +9,25 @@ package org.opendaylight.protocol.bgp.rib.impl;
 
 import static org.junit.Assert.assertNotNull;
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
@@ -61,39 +66,44 @@ public class AdjRibsInWriterTest {
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        Mockito.doReturn("MockedTrans").when(this.tx).toString();
-        Mockito.doReturn(this.tx).when(this.chain).newWriteOnlyTransaction();
-        final CheckedFuture<?, ?> checkedFuture = Mockito.mock(CheckedFuture.class);
-        Mockito.doNothing().when(checkedFuture).addListener(any(), any());
-        Mockito.doReturn(checkedFuture).when(this.tx).submit();
-        Mockito.doNothing().when(this.tx).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
-        Mockito.doNothing().when(this.tx).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.any(YangInstanceIdentifier.class), Mockito.any(NormalizedNode.class));
-        Mockito.doReturn(this.context).when(this.registry).getRIBSupportContext(Mockito.any(TablesKey.class));
-        Mockito.doNothing().when(this.context).createEmptyTableStructure(Mockito.eq(this.tx), Mockito.any(YangInstanceIdentifier.class));
+        doReturn("MockedTrans").when(this.tx).toString();
+        doReturn(this.tx).when(this.chain).newWriteOnlyTransaction();
+        final FluentFuture<? extends CommitInfo> fluentFuture = mock(FluentFuture.class);
+        doNothing().when(fluentFuture).addListener(any(), any());
+        doReturn(fluentFuture).when(this.tx).commit();
+        doNothing().when(this.tx).put(eq(LogicalDatastoreType.OPERATIONAL),
+                any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+        doNothing().when(this.tx).merge(eq(LogicalDatastoreType.OPERATIONAL),
+                any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+        doReturn(this.context).when(this.registry).getRIBSupportContext(any(TablesKey.class));
+        doNothing().when(this.context).createEmptyTableStructure(eq(this.tx), any(YangInstanceIdentifier.class));
     }
 
     @Test
     public void testTransform() {
         this.writer = AdjRibInWriter.create(YangInstanceIdentifier.of(Rib.QNAME), PeerRole.Ebgp, this.chain);
         assertNotNull(this.writer);
-        final YangInstanceIdentifier peerPath = YangInstanceIdentifier.builder().node(Rib.QNAME).node(Peer.QNAME).nodeWithKey(Peer.QNAME,
-                AdjRibInWriter.PEER_ID_QNAME, this.peerIp).build();
+        final YangInstanceIdentifier peerPath = YangInstanceIdentifier.builder().node(Rib.QNAME)
+                .node(Peer.QNAME).nodeWithKey(Peer.QNAME,
+                        AdjRibInWriter.PEER_ID_QNAME, this.peerIp).build();
         this.writer.transform(new PeerId(this.peerIp), peerPath, this.registry, this.tableTypes, ADD_PATH_TABLE_MAPS);
         verifyPeerSkeletonInsertedCorrectly(peerPath);
         // verify supported tables were inserted for ipv4
-        Mockito.verify(this.tx).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.eq(peerPath.node(SupportedTables.QNAME)
-                .node(RibSupportUtils.toYangKey(SupportedTables.QNAME, K4))), Mockito.any(NormalizedNode.class));
+        verify(this.tx).put(eq(LogicalDatastoreType.OPERATIONAL), eq(peerPath.node(SupportedTables.QNAME)
+                .node(RibSupportUtils.toYangKey(SupportedTables.QNAME, K4))), any(NormalizedNode.class));
         verifyUptodateSetToFalse(peerPath);
     }
 
     private void verifyUptodateSetToFalse(final YangInstanceIdentifier peerPath) {
-        final YangInstanceIdentifier path = peerPath.node(AdjRibIn.QNAME).node(Tables.QNAME).node(RibSupportUtils.toYangTablesKey(K4))
+        final YangInstanceIdentifier path = peerPath.node(AdjRibIn.QNAME)
+                .node(Tables.QNAME).node(RibSupportUtils.toYangTablesKey(K4))
                 .node(Attributes.QNAME).node(AdjRibInWriter.ATTRIBUTES_UPTODATE_FALSE.getNodeType());
-        Mockito.verify(this.tx).merge(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.eq(path), Mockito.eq(AdjRibInWriter.ATTRIBUTES_UPTODATE_FALSE));
+        verify(this.tx).merge(eq(LogicalDatastoreType.OPERATIONAL), eq(path)
+                , eq(AdjRibInWriter.ATTRIBUTES_UPTODATE_FALSE));
     }
 
     private void verifyPeerSkeletonInsertedCorrectly(final YangInstanceIdentifier peerPath) {
-        Mockito.verify(this.tx).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), Mockito.eq(peerPath),
-                Mockito.eq(this.writer.peerSkeleton(IdentifierUtils.peerKey(peerPath), this.peerIp)));
+        verify(this.tx).put(eq(LogicalDatastoreType.OPERATIONAL), eq(peerPath),
+                eq(this.writer.peerSkeleton(IdentifierUtils.peerKey(peerPath), this.peerIp)));
     }
 }
\ No newline at end of file
index 2f2c73dd5fc9a6894dc43401f5adb8b15f918c2b..2f7c83b2793607ed1f8ec36ff6d7791230c49abf 100644 (file)
@@ -28,7 +28,6 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import org.junit.Before;
 import org.junit.Test;
index e7b045e84c57892cb14a65fc630549111051f332..6482b91aa68ff5f9ae1aed6b3683d6dd5bf1c9ac 100755 (executable)
@@ -63,7 +63,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 public class ParserToSalTest extends DefaultRibPoliciesMockTest {
 
     private static final String TEST_RIB_ID = "testRib";
-    private static final TablesKey TABLE_KEY = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+    private static final TablesKey TABLE_KEY
+            = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
     private static final InstanceIdentifier<BgpRib> BGP_IID = InstanceIdentifier.create(BgpRib.class);
     private BGPMock mock;
     private AbstractRIBExtensionProviderActivator baseact, lsact;
index 2715bb640949ae6ee23a4fed1fbfe01a80f53a1e..8b861a1be37c8029ac97bf4bd073beb224ec3b48 100644 (file)
@@ -22,7 +22,7 @@ import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandler;
@@ -46,6 +46,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
 import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory;
 import org.opendaylight.protocol.bgp.parser.BgpExtendedMessageUtil;
@@ -193,14 +194,14 @@ public class SynchronizationAndExceptionTest extends AbstractAddPathTest {
         doNothing().when(this.tx).put(eq(LogicalDatastoreType.OPERATIONAL),
                 any(YangInstanceIdentifier.class), any(NormalizedNode.class));
         doNothing().when(this.tx).delete(any(LogicalDatastoreType.class), any(YangInstanceIdentifier.class));
-        final CheckedFuture<?, ?> future = mock(CheckedFuture.class);
+        final FluentFuture<? extends CommitInfo> fluentFuture = mock(FluentFuture.class);
         doAnswer(invocation -> {
             final Runnable callback = (Runnable) invocation.getArguments()[0];
             callback.run();
             return null;
-        }).when(future).addListener(any(Runnable.class), any(Executor.class));
-        doReturn(future).when(this.tx).submit();
-        doReturn(mock(Optional.class)).when(future).checkedGet();
+        }).when(fluentFuture).addListener(any(Runnable.class), any(Executor.class));
+        doReturn(fluentFuture).when(this.tx).commit();
+        doReturn(mock(Optional.class)).when(fluentFuture).get();
     }
 
     @Test
index 112fd851cf5f0c78d0d3a9c7954f258b6a2f6131..f755498a15e5c98bed9ff31c23d52d930e7b025d 100644 (file)
@@ -16,7 +16,7 @@ import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import io.netty.util.concurrent.Future;
 import java.net.InetSocketAddress;
 import java.util.Collections;
@@ -29,6 +29,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListen
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
 import org.opendaylight.protocol.bgp.rib.impl.BGPPeerTrackerImpl;
@@ -111,14 +112,13 @@ class AbstractConfig extends DefaultRibPoliciesMockTest {
                 any(YangInstanceIdentifier.class));
         doNothing().when(this.domDW).merge(eq(LogicalDatastoreType.OPERATIONAL),
                 any(YangInstanceIdentifier.class), any(NormalizedNode.class));
-        final CheckedFuture<?, ?> checkedFuture = mock(CheckedFuture.class);
+        final FluentFuture<? extends CommitInfo> checkedFuture = mock(FluentFuture.class);
         doAnswer(invocation -> {
             final Runnable callback = (Runnable) invocation.getArguments()[0];
             callback.run();
             return null;
         }).when(checkedFuture).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
-        doReturn(checkedFuture).when(this.domDW).submit();
-        doReturn(null).when(checkedFuture).checkedGet();
+        doReturn(checkedFuture).when(this.domDW).commit();
         doReturn(null).when(checkedFuture).get();
         doReturn(true).when(checkedFuture).isDone();
         doReturn("checkedFuture").when(checkedFuture).toString();
index 6baecb2fb643dee7d44c2bc88be71e01563455a5..d4cfaa462cd540ed6782cc310ca4548760bb1454 100644 (file)
@@ -60,7 +60,6 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.n
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
index b16e4eaaf07a7faa5ea58dc5bfad6af3dcca314b..4d0158b2db7faa436064dd91be5fa87e8c6503c6 100644 (file)
@@ -7,11 +7,10 @@
  */
 package org.opendaylight.protocol.bgp.testtool;
 
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.google.common.util.concurrent.FluentFuture;
 import java.util.List;
 import java.util.concurrent.atomic.LongAdder;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.impl.BGPSessionImpl;
 import org.opendaylight.protocol.bgp.rib.spi.BGPSession;
 import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
@@ -77,10 +76,9 @@ final class TestingListener implements BGPSessionListener {
     }
 
     @Override
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public ListenableFuture<?> releaseConnection() {
+    public FluentFuture<? extends CommitInfo> releaseConnection() {
         LOG.info("Client Listener: Connection released.");
-        return Futures.immediateFuture(null);
+        return CommitInfo.emptyFluentFuture();
     }
 
     void printCount(final String localAddress) {
index 3adabf9858573ff1fffd9e0fa88fbd1638f84c65..81ba926f19e7fd612c6bf832c1e4d6272f89dacc 100644 (file)
@@ -11,11 +11,9 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -33,6 +31,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.Route;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.LocRib;
@@ -71,8 +70,7 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
     private ListenerRegistration<AbstractTopologyBuilder<T>> listenerRegistration = null;
     @GuardedBy("this")
     private BindingTransactionChain chain = null;
-    @GuardedBy("this")
-    private boolean closed = false;
+    private AtomicBoolean closed = new AtomicBoolean(false);
     @GuardedBy("this")
     @VisibleForTesting
     protected long listenerScheduledRestartTime = 0;
@@ -152,16 +150,14 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
         return this.topology;
     }
 
-    @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl")
-    public final synchronized ListenableFuture<Void> close() {
-        if (this.closed) {
+    public final synchronized FluentFuture<? extends CommitInfo> close() {
+        if (this.closed.getAndSet(true)) {
             LOG.trace("Transaction chain was already closed.");
-            Futures.immediateFuture(null);
+            return CommitInfo.emptyFluentFuture();
         }
-        this.closed = true;
         LOG.info("Shutting down builder for {}", getInstanceIdentifier());
         unregisterDataChangeListener();
-        final ListenableFuture<Void> future = destroyOperationalTopology();
+        final FluentFuture<? extends CommitInfo> future = destroyOperationalTopology();
         destroyTransactionChain();
         return future;
     }
@@ -169,7 +165,7 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
     @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
     public synchronized void onDataTreeChanged(final Collection<DataTreeModification<T>> changes) {
-        if (this.closed) {
+        if (this.closed.get()) {
             LOG.trace("Transaction chain was already closed, skipping update.");
             return;
         }
@@ -188,16 +184,16 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
                 LOG.warn("Data change {} (transaction {}) was not completely propagated to listener {}", change,
                         trans.getIdentifier(), this, exc);
                 // trans.cancel() is not supported by PingPongTransactionChain, so we just skip the problematic change
-                // trans.submit() must be called first to unlock the current transaction chain, to make the chain
+                // trans.commit() must be called first to unlock the current transaction chain, to make the chain
                 // closable so we cannot exit the #onDataTreeChanged() yet
                 transactionInError.set(true);
                 break;
             }
         }
-        Futures.addCallback(trans.submit(), new FutureCallback<Void>() {
+        trans.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
-                // as we are enforcing trans.submit(), in some cases the transaction execution actually could be
+            public void onSuccess(final CommitInfo result) {
+                // as we are enforcing trans.commit(), in some cases the transaction execution actually could be
                 // successfully even when an exception is captured, thus #onTransactionChainFailed() never get invoked.
                 // Though the transaction chain remains usable,
                 // the data loss will not be able to be recovered. Thus we schedule a listener restart here
@@ -247,9 +243,9 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
                 new TopologyBuilder().setKey(this.topologyKey).setServerProvided(Boolean.TRUE)
                         .setTopologyTypes(this.topologyTypes)
                         .setLink(Collections.emptyList()).setNode(Collections.emptyList()).build(), true);
-        Futures.addCallback(trans.submit(), new FutureCallback<Void>() {
+        trans.commit().addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.trace("Transaction {} committed successfully", trans.getIdentifier());
             }
 
@@ -265,14 +261,14 @@ public abstract class AbstractTopologyBuilder<T extends Route> implements Cluste
     /**
      * Destroy the current operational topology data. Note a valid transaction must be provided.
      */
-    private synchronized ListenableFuture<Void> destroyOperationalTopology() {
+    private synchronized FluentFuture<? extends CommitInfo> destroyOperationalTopology() {
         requireNonNull(this.chain, "A valid transaction chain must be provided.");
         final WriteTransaction trans = this.chain.newWriteOnlyTransaction();
         trans.delete(LogicalDatastoreType.OPERATIONAL, getInstanceIdentifier());
-        final ListenableFuture<Void> future = trans.submit();
-        Futures.addCallback(future, new FutureCallback<Void>() {
+        final FluentFuture<? extends CommitInfo> future = trans.commit();
+        future.addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(final Void result) {
+            public void onSuccess(final CommitInfo result) {
                 LOG.trace("Operational topology removed {}", AbstractTopologyBuilder.this.topology);
             }
 
index a56109556aeb23338ab9d30c79dfa616a32e8666..a6bd811d14d332ccc486af10ce50dc2e27e6e68d 100644 (file)
@@ -10,10 +10,11 @@ package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
@@ -51,7 +52,7 @@ final class TopologyReferenceSingletonServiceImpl implements TopologyReferenceSi
     }
 
     @Override
-    public ListenableFuture<Void> closeServiceInstance() {
+    public FluentFuture<? extends CommitInfo> closeServiceInstance() {
         LOG.info("Close Topology Singleton Service {}", getIdentifier());
         return this.topologyBuilder.close();
     }
index 774a6ce2f3d64267f64590f975eafe1840dc091b..38f8313a700fd37e9b2721d88faedc8dd4f7c697 100644 (file)
@@ -40,6 +40,6 @@ public abstract class AbstractTopologyBuilderTest extends AbstractConcurrentData
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetworkTopology.class).build(),
             new NetworkTopologyBuilder().setTopology(Collections.emptyList()).build());
-        wTx.submit();
+        wTx.commit();
     }
 }
index e48482c417562b787d2918d2a3d5965364332b00..b3d2db16b9aa638021e725748f35087473d3e754 100755 (executable)
@@ -95,7 +95,7 @@ public class Ipv4ReachabilityTopologyBuilderTest extends AbstractTopologyBuilder
         // delete route
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, this.ipv4RouteIID);
-        wTx.submit();
+        wTx.commit();
         readDataOperational(getDataBroker(), this.ipv4TopoBuilder.getInstanceIdentifier(), topology -> {
             assertEquals(0, topology.getNode().size());
             return topology;
@@ -108,7 +108,7 @@ public class Ipv4ReachabilityTopologyBuilderTest extends AbstractTopologyBuilder
     private void updateIpv4Route(final Ipv4Route data) {
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL, this.ipv4RouteIID, data, true);
-        wTx.submit();
+        wTx.commit();
     }
 
     private static Ipv4Route createIpv4Route(final String nextHop) {
index 181b499637934d95d185a58d98dae412dcb9c11d..4685ea8fbdf4dcaf07cb0b8f01952761ffd772d1 100755 (executable)
@@ -95,7 +95,7 @@ public class Ipv6ReachabilityTopologyBuilderTest extends AbstractTopologyBuilder
         // delete route
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, this.ipv6RouteIID);
-        wTx.submit();
+        wTx.commit();
         readDataOperational(getDataBroker(), this.ipv6TopoBuilder.getInstanceIdentifier(), topology -> {
             assertEquals(0, topology.getNode().size());
             return topology;
@@ -108,7 +108,7 @@ public class Ipv6ReachabilityTopologyBuilderTest extends AbstractTopologyBuilder
     private void updateIpv6Route(final Ipv6Route data) {
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL, this.ipv6RouteIID, data, true);
-        wTx.submit();
+        wTx.commit();
     }
 
     private static Ipv6Route createIpv6Route(final String netxHop) {
index 1c7a1474fe88c2cea369c5aa6e9704e006298fa9..efba6e387b754ea5ed5879273c26b9e641bfda09 100755 (executable)
@@ -213,7 +213,7 @@ public class LinkstateTopologyBuilderTest extends AbstractTopologyBuilderTest {
         // remove
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, this.linkstateRouteIID);
-        wTx.submit();
+        wTx.commit();
         readDataOperational(getDataBroker(), this.linkstateTopoBuilder.getInstanceIdentifier(), topology -> {
             assertEquals(0, topology.getNode().size());
             assertEquals(0, topology.getLink().size());
@@ -358,7 +358,7 @@ public class LinkstateTopologyBuilderTest extends AbstractTopologyBuilderTest {
     private void updateLinkstateRoute(final LinkstateRoute data) {
         final WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL, this.linkstateRouteIID, data, true);
-        wTx.submit();
+        wTx.commit();
     }
 
     private static LinkstateRoute createLinkstateNodeRoute(final ProtocolId protocolId, final String nodeName,
index fc23c2aa8fba2270b4e3649a4fca802d9226e475..4925aa407897436e782f74ffc1bf8828409b69b6 100644 (file)
@@ -13,18 +13,19 @@ import static org.opendaylight.protocol.bmp.impl.app.KeyConstructorUtil.construc
 
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelFutureListener;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
@@ -106,7 +107,7 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu
     }
 
     @Override
-    public synchronized ListenableFuture<Void> closeServiceInstance() {
+    public synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
         LOG.info("BMP Monitor Singleton Service {} instance closed, Monitor Id {}",
                 getIdentifier().getValue(), this.monitorId.getValue());
         if (this.channel != null) {
@@ -120,7 +121,7 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu
         final DOMDataWriteTransaction wTx = this.domDataBroker.newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, this.yangMonitorId);
         LOG.info("BMP monitoring station {} closed.", this.monitorId.getValue());
-        return wTx.submit();
+        return wTx.commit();
     }
 
     @Nonnull
@@ -157,8 +158,8 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu
                         .addChild(ImmutableNodes.mapNodeBuilder(Router.QNAME).build())
                         .build());
         try {
-            wTx.submit().checkedGet();
-        } catch (final TransactionCommitFailedException e) {
+            wTx.commit().get();
+        } catch (final ExecutionException | InterruptedException e) {
             LOG.error("Failed to initiate BMP Monitor {}.", this.monitorId.getValue(), e);
         }
     }
index 857cfdcc572812521011fcde5f7c0ad3ae4f80bb..a9af303ba62015718affb6848582ef71a7fb0f05 100644 (file)
@@ -11,6 +11,8 @@ package org.opendaylight.protocol.bmp.impl.app;
 import static org.opendaylight.protocol.bmp.impl.app.TablesUtil.BMP_ATTRIBUTES_QNAME;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -21,6 +23,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv4.prefixes.DestinationIpv4Builder;
@@ -69,7 +72,17 @@ final class BmpRibInWriter {
         this.tables = createTableInstance(tableTypes, tablesRoot, tx, ribExtensions, tree).build();
 
         LOG.debug("New RIB table {} structure installed.", tablesRoot.toString());
-        tx.submit();
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
     public static BmpRibInWriter create(@Nonnull final YangInstanceIdentifier tablesRootPath,
@@ -151,21 +164,17 @@ final class BmpRibInWriter {
         final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
         ctx.writeRoutes(tx, nlri, attributes);
         LOG.trace("Write routes {}", nlri);
-        tx.submit();
-    }
-
-    private synchronized void removeRoutes(final MpUnreachNlri nlri) {
-        final TablesKey key = new TablesKey(nlri.getAfi(), nlri.getSafi());
-        final TableContext ctx = this.tables.get(key);
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
 
-        if (ctx == null) {
-            LOG.debug("No table for {}, not accepting NLRI {}", key, nlri);
-            return;
-        }
-        LOG.trace("Removing routes {}", nlri);
-        final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
-        ctx.removeRoutes(tx, nlri);
-        tx.submit();
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
     /**
@@ -189,6 +198,30 @@ final class BmpRibInWriter {
         return b.build();
     }
 
+    private synchronized void removeRoutes(final MpUnreachNlri nlri) {
+        final TablesKey key = new TablesKey(nlri.getAfi(), nlri.getSafi());
+        final TableContext ctx = this.tables.get(key);
+
+        if (ctx == null) {
+            LOG.debug("No table for {}, not accepting NLRI {}", key, nlri);
+            return;
+        }
+        LOG.trace("Removing routes {}", nlri);
+        final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
+        ctx.removeRoutes(tx, nlri);
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
+    }
+
     /**
      * Create MPUnreach for the prefixes to be handled in the same way as linkstate routes.
      *
@@ -253,8 +286,17 @@ final class BmpRibInWriter {
         final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
         final TableContext ctxPre = this.tables.get(tableTypes);
         tx.merge(LogicalDatastoreType.OPERATIONAL, ctxPre.getTableId().node(BMP_ATTRIBUTES_QNAME)
-                        .node(ATTRIBUTES_UPTODATE_TRUE.getNodeType()),
-                ATTRIBUTES_UPTODATE_TRUE);
-        tx.submit();
+                .node(ATTRIBUTES_UPTODATE_TRUE.getNodeType()), ATTRIBUTES_UPTODATE_TRUE);
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 }
index 9a9e253e3b6dbab8452fa08471d69efa35c75e2c..03f6de0e4ba05e6d17644161d3a9819599df372c 100644 (file)
@@ -12,21 +12,24 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.concurrent.GuardedBy;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bmp.api.BmpSession;
 import org.opendaylight.protocol.bmp.impl.spi.BmpRouter;
@@ -170,8 +173,8 @@ public final class BmpRouterImpl implements BmpRouter, TransactionChainListener
                     // it means the session was closed before it was written to datastore
                     final DOMDataWriteTransaction wTx = this.domDataBroker.newWriteOnlyTransaction();
                     wTx.delete(LogicalDatastoreType.OPERATIONAL, this.routerYangIId);
-                    wTx.submit().checkedGet();
-                } catch (final TransactionCommitFailedException e) {
+                    wTx.commit().get();
+                } catch (final InterruptedException | ExecutionException e) {
                     LOG.error("Failed to remove BMP router data from DS.", e);
                 }
                 this.sessionManager.removeSessionListener(this);
@@ -203,7 +206,17 @@ public final class BmpRouterImpl implements BmpRouter, TransactionChainListener
                 .withChild(ImmutableNodes.leafNode(ROUTER_ID_QNAME, this.routerIp))
                 .withChild(ImmutableNodes.leafNode(ROUTER_STATUS_QNAME, DOWN))
                 .withChild(ImmutableNodes.mapNodeBuilder(Peer.QNAME).build()).build());
-        wTx.submit();
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
     private synchronized void onInitiate(final InitiationMessage initiation) {
@@ -218,7 +231,17 @@ public final class BmpRouterImpl implements BmpRouter, TransactionChainListener
                 .withChild(ImmutableNodes.leafNode(ROUTER_INFO_QNAME, getStringInfo(initiation.getTlvs()
                         .getStringInformation())))
                 .withChild(ImmutableNodes.leafNode(ROUTER_STATUS_QNAME, UP)).build());
-        wTx.submit();
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
     private synchronized void onPeerUp(final PeerUpNotification peerUp) {
index 9e133bbea76c3eab1bf073877f8265600e2fd0fb..327d6e5ef4932660899b40012e842afec75e8d92 100644 (file)
@@ -14,6 +14,8 @@ import static org.opendaylight.yangtools.yang.common.QName.create;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Locale;
 import java.util.Set;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -21,6 +23,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bmp.impl.spi.BmpRouterPeer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
@@ -69,10 +72,13 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 public final class BmpRouterPeerImpl implements BmpRouterPeer {
 
+    private static final Logger LOG = LoggerFactory.getLogger(BmpRouterPeerImpl.class);
     private static final String TIMESTAMP_SEC = "timestamp-sec";
 
     private static final QName PEER_ID_QNAME = create(Peer.QNAME, "peer-id").intern();
@@ -141,7 +147,17 @@ public final class BmpRouterPeerImpl implements BmpRouterPeer {
         final Set<TablesKey> peerTables = setPeerTables(peerUp.getReceivedOpen());
         final DOMDataWriteTransaction wTx = this.domTxChain.newWriteOnlyTransaction();
         wTx.put(LogicalDatastoreType.OPERATIONAL, this.peerYangIId, createPeerEntry(peerUp));
-        wTx.submit();
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
         this.prePolicyWriter = BmpRibInWriter.create(this.peerYangIId.node(PrePolicyRib.QNAME).node(BMP_TABLES_QNAME),
                 this.domTxChain, extensions, peerTables, tree);
         this.postPolicyWriter = BmpRibInWriter.create(this.peerYangIId.node(PostPolicyRib.QNAME).node(BMP_TABLES_QNAME),
@@ -189,7 +205,17 @@ public final class BmpRouterPeerImpl implements BmpRouterPeer {
             final DOMDataWriteTransaction wTx = this.domTxChain.newWriteOnlyTransaction();
             wTx.merge(LogicalDatastoreType.OPERATIONAL, this.peerYangIId.node(Stats.QNAME),
                     createStats(statsReports, statsReports.getPeerHeader().getTimestampSec()));
-            wTx.submit();
+            wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+                @Override
+                public void onSuccess(final CommitInfo result) {
+                    LOG.trace("Successful commit");
+                }
+
+                @Override
+                public void onFailure(final Throwable trw) {
+                    LOG.error("Failed commit", trw);
+                }
+            }, MoreExecutors.directExecutor());
         }
     }
 
@@ -197,14 +223,33 @@ public final class BmpRouterPeerImpl implements BmpRouterPeer {
         final DOMDataWriteTransaction wTx = this.domTxChain.newWriteOnlyTransaction();
         wTx.merge(LogicalDatastoreType.OPERATIONAL, this.peerYangIId.node(Mirrors.QNAME),
                 createMirrors(mirror, mirror.getPeerHeader().getTimestampSec()));
-        wTx.submit();
-    }
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
 
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
+    }
 
     private synchronized void onPeerDown() {
         final DOMDataWriteTransaction wTx = this.domTxChain.newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, this.peerYangIId);
-        wTx.submit();
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
         close();
     }
 
index 3707d1b2ed5abbbf3ff47fbe3ed45e3c72cb5805..eb1a2966ceb5438a57dfe57e4ceeb3cdd6273f76 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.protocol.bmp.impl.config;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.Iterables;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.HashMap;
@@ -23,6 +25,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.protocol.bmp.api.BmpDispatcher;
 import org.opendaylight.protocol.bmp.impl.app.BmpMonitoringStationImpl;
 import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation;
@@ -70,7 +73,17 @@ public final class BmpDeployerImpl implements ClusteredDataTreeChangeListener<Od
     public synchronized void init() {
         final DOMDataWriteTransaction wTx = this.bmpDeployerDependencies.getDomDataBroker().newWriteOnlyTransaction();
         wTx.merge(LogicalDatastoreType.OPERATIONAL, BMP_MONITOR_YII, EMPTY_PARENT_NODE);
-        wTx.submit();
+        wTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.trace("Successful commit");
+            }
+
+            @Override
+            public void onFailure(final Throwable trw) {
+                LOG.error("Failed commit", trw);
+            }
+        }, MoreExecutors.directExecutor());
         this.registration = this.bmpDeployerDependencies.getDataBroker().registerDataTreeChangeListener(
                 new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, ODL_BMP_MONITORS_IID), this);
     }