From e33bcbbb4e78dd57bc9b6ff3c56f9cae3d59ea34 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Thu, 10 May 2018 13:34:15 +0200 Subject: [PATCH] Migrate deprecated submit() to commit() for BGP/BMP Change-Id: Id22bb9d50c40e94bb616272d018a376cecc1705a Signed-off-by: Claudio D. Gasparini --- .../bgp/benchmark/app/AppPeerBenchmark.java | 36 +++++++-- .../protocol/bgp/state/StateProviderImpl.java | 18 ++++- .../Ipv4SpecificEcHandlerTest.java | 1 - .../protocol/bgp/rib/impl/AbstractPeer.java | 16 ++-- .../protocol/bgp/rib/impl/AdjRibInWriter.java | 19 +++-- .../bgp/rib/impl/ApplicationPeer.java | 27 ++++--- .../protocol/bgp/rib/impl/BGPPeer.java | 15 ++-- .../bgp/rib/impl/EffectiveRibInWriter.java | 15 +++- .../protocol/bgp/rib/impl/LocRibWriter.java | 27 ++++++- .../protocol/bgp/rib/impl/RIBImpl.java | 35 ++++++--- .../protocol/bgp/rib/impl/config/AppPeer.java | 15 ++-- .../config/BGPClusterSingletonService.java | 16 ++-- .../bgp/rib/impl/config/BgpDeployerImpl.java | 16 ++-- .../protocol/bgp/rib/impl/config/BgpPeer.java | 19 ++--- .../bgp/rib/impl/config/PeerBean.java | 5 +- .../protocol/bgp/rib/impl/config/RibImpl.java | 10 +-- .../bgp/rib/impl/AbstractRIBTestSetup.java | 10 ++- .../bgp/rib/impl/AdjRibsInWriterTest.java | 48 +++++++----- .../protocol/bgp/rib/impl/FSMTest.java | 1 - .../bgp/rib/impl/ParserToSalTest.java | 3 +- .../impl/SynchronizationAndExceptionTest.java | 11 +-- .../bgp/rib/impl/config/AbstractConfig.java | 8 +- .../config/OpenConfigMappingUtilTest.java | 1 - .../bgp/testtool/TestingListener.java | 10 +-- .../provider/AbstractTopologyBuilder.java | 40 +++++----- ...TopologyReferenceSingletonServiceImpl.java | 5 +- .../provider/AbstractTopologyBuilderTest.java | 2 +- .../Ipv4ReachabilityTopologyBuilderTest.java | 4 +- .../Ipv6ReachabilityTopologyBuilderTest.java | 4 +- .../LinkstateTopologyBuilderTest.java | 4 +- .../impl/app/BmpMonitoringStationImpl.java | 13 ++-- .../protocol/bmp/impl/app/BmpRibInWriter.java | 78 ++++++++++++++----- .../protocol/bmp/impl/app/BmpRouterImpl.java | 33 ++++++-- .../bmp/impl/app/BmpRouterPeerImpl.java | 55 +++++++++++-- .../bmp/impl/config/BmpDeployerImpl.java | 15 +++- 35 files changed, 422 insertions(+), 213 deletions(-) diff --git a/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java b/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java index acd2361832..04b1f5e752 100644 --- a/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java +++ b/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java @@ -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() { + wTx.commit().addCallback(new FutureCallback() { @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() { + @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() { + @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); } diff --git a/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java b/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java index 24c7b6898f..db09072893 100644 --- a/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java +++ b/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java @@ -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() { + wTx.commit().addCallback(new FutureCallback() { @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() { + @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(); diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/extended/communities/Ipv4SpecificEcHandlerTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/extended/communities/Ipv4SpecificEcHandlerTest.java index 14e3f68e5b..ca3c280386 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/extended/communities/Ipv4SpecificEcHandlerTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/extended/communities/Ipv4SpecificEcHandlerTest.java @@ -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; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java index 38ef50de9e..ba2f53af71 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java @@ -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 removePeer( + final synchronized FluentFuture 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 future = tx.submit(); - Futures.addCallback(future, new FutureCallback() { + final FluentFuture future = tx.commit(); + future.addCallback(new FutureCallback() { @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() { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java index 6fdc59ca99..9b2738fd4b 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibInWriter.java @@ -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 tb = createNewTableInstances(peerPath, registry, tableTypes, addPathTablesType, tx); - Futures.addCallback(tx.submit(), new FutureCallback() { + tx.commit().addCallback(new FutureCallback() { @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() { + tx.commit().addCallback(new FutureCallback() { @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() { + tx.commit().addCallback(new FutureCallback() { @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() { + tx.commit().addCallback(new FutureCallback() { @Override - public void onSuccess(final Void result) { + public void onSuccess(final CommitInfo result) { LOG.trace("Removing routes {}, succeed", nlri); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java index 103b566957..8cf798ac0c 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java @@ -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() { + @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 close() { + public synchronized FluentFuture 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 future; + final FluentFuture 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(); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index df1e3e555c..375b577aa5 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -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 close() { - final ListenableFuture future = releaseConnection(); + public synchronized FluentFuture close() { + final FluentFuture 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 cleanup() { + private synchronized FluentFuture 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 releaseConnection() { + public synchronized FluentFuture releaseConnection() { LOG.info("Closing session with peer"); this.sessionUp = false; closeRegistration(); if (this.rpcRegistration != null) { this.rpcRegistration.close(); } - final ListenableFuture future = cleanup(); + final FluentFuture future = cleanup(); if (this.session != null) { try { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java index 94d1294d16..fcbfd0409f 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java @@ -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() { + @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()); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java index 6e854a7695..17784090ca 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java @@ -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() { + @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 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() { + @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()); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index e227e0e8d5..e0cdddab91 100755 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -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 closeServiceInstance() { + public synchronized FluentFuture 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 cleanFuture = t.submit(); + final FluentFuture cleanFuture = t.commit(); + cleanFuture.addCallback(new FutureCallback() { + @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; } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java index 2d1a3b1597..d3ca61416e 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java @@ -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 closeServiceInstance() { + public synchronized FluentFuture 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 closeServiceInstance() { + public synchronized FluentFuture 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; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java index 9d204c7eac..deedf6b0ef 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java @@ -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 closeServiceInstance() { + public synchronized ListenableFuture closeServiceInstance() { LOG.info("BGPClusterSingletonService {} close service instance", this.serviceGroupIdentifier.getValue()); this.instantiated.set(false); - final List> futurePeerCloseList = this.peers.values().stream() + final List> futurePeerCloseList = this.peers.values().stream() .map(PeerBean::closeServiceInstance).collect(Collectors.toList()); - final SettableFuture done = SettableFuture.create(); - Futures.addCallback(Futures.allAsList(futurePeerCloseList), new FutureCallback>() { + final SettableFuture done = SettableFuture.create(); + + final ListenableFuture> futureResult = Futures.allAsList(futurePeerCloseList); + Futures.addCallback(futureResult, new FutureCallback>() { @Override - public void onSuccess(final List result) { - done.setFuture(BGPClusterSingletonService.this.ribImpl.closeServiceInstance()); + public void onSuccess(final List result) { + done.setFuture(Futures.transform(BGPClusterSingletonService.this.ribImpl.closeServiceInstance(), + input -> null, MoreExecutors.directExecutor())); } @Override diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java index 22482ac6af..c88c31dba8 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java @@ -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() { + initializeNetworkInstance(dataBroker, this.networkInstanceIId).addCallback(new FutureCallback() { @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 initializeNetworkInstance( + private static FluentFuture initializeNetworkInstance( final DataBroker dataBroker, final InstanceIdentifier 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 diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java index 44753b0aed..a7358453f7 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java @@ -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 closeServiceInstance() { + public synchronized FluentFuture closeServiceInstance() { if (this.bgpPeerSingletonService != null) { - final ListenableFuture fut = this.bgpPeerSingletonService.closeServiceInstance(); + final FluentFuture 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 closeServiceInstance() { + private synchronized FluentFuture 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 future = this.bgpPeer.close(); + final FluentFuture future = this.bgpPeer.close(); removePeer(this.dispatcher.getBGPPeerRegistry()); return future; } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java index 86a7d10667..24b8c1d80d 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/PeerBean.java @@ -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 closeServiceInstance(); + FluentFuture closeServiceInstance(); Boolean containsEqualConfiguration(Neighbor neighbor); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java index 0c4a1f4387..ec403dd6f4 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java @@ -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 closeServiceInstance() { + FluentFuture closeServiceInstance() { if (this.ribImpl != null) { return this.ribImpl.closeServiceInstance(); } - return Futures.immediateFuture(null); + return CommitInfo.emptyFluentFuture(); } @Override diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java index 3cd4f09eb6..11e1d73eb6 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java @@ -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 future; @Mock private Optional 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 ipv4Input(final YangInstanceIdentifier target, diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibsInWriterTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibsInWriterTest.java index 44efa1164f..e7b0a52cb7 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibsInWriterTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibsInWriterTest.java @@ -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 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java index 2f2c73dd5f..2f7c83b279 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java @@ -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; diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java index e7b045e84c..6482b91aa6 100755 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java @@ -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 BGP_IID = InstanceIdentifier.create(BgpRib.class); private BGPMock mock; private AbstractRIBExtensionProviderActivator baseact, lsact; diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java index 2715bb6409..8b861a1be3 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java @@ -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 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 diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java index 112fd851cf..f755498a15 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java @@ -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 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(); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java index 6baecb2fb6..d4cfaa462c 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java @@ -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; diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java index b16e4eaaf0..4d0158b2db 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java @@ -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 releaseConnection() { LOG.info("Client Listener: Connection released."); - return Futures.immediateFuture(null); + return CommitInfo.emptyFluentFuture(); } void printCount(final String localAddress) { diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java index 3adabf9858..81ba926f19 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java @@ -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 implements Cluste private ListenerRegistration> 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 implements Cluste return this.topology; } - @SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Unrecognised NullableDecl") - public final synchronized ListenableFuture close() { - if (this.closed) { + public final synchronized FluentFuture 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 future = destroyOperationalTopology(); + final FluentFuture future = destroyOperationalTopology(); destroyTransactionChain(); return future; } @@ -169,7 +165,7 @@ public abstract class AbstractTopologyBuilder implements Cluste @Override @SuppressWarnings("checkstyle:IllegalCatch") public synchronized void onDataTreeChanged(final Collection> 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 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() { + trans.commit().addCallback(new FutureCallback() { @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 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() { + trans.commit().addCallback(new FutureCallback() { @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 implements Cluste /** * Destroy the current operational topology data. Note a valid transaction must be provided. */ - private synchronized ListenableFuture destroyOperationalTopology() { + private synchronized FluentFuture destroyOperationalTopology() { requireNonNull(this.chain, "A valid transaction chain must be provided."); final WriteTransaction trans = this.chain.newWriteOnlyTransaction(); trans.delete(LogicalDatastoreType.OPERATIONAL, getInstanceIdentifier()); - final ListenableFuture future = trans.submit(); - Futures.addCallback(future, new FutureCallback() { + final FluentFuture future = trans.commit(); + future.addCallback(new FutureCallback() { @Override - public void onSuccess(final Void result) { + public void onSuccess(final CommitInfo result) { LOG.trace("Operational topology removed {}", AbstractTopologyBuilder.this.topology); } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java index a56109556a..a6bd811d14 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java @@ -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 closeServiceInstance() { + public FluentFuture closeServiceInstance() { LOG.info("Close Topology Singleton Service {}", getIdentifier()); return this.topologyBuilder.close(); } diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilderTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilderTest.java index 774a6ce2f3..38f8313a70 100644 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilderTest.java +++ b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilderTest.java @@ -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(); } } diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderTest.java index e48482c417..b3d2db16b9 100755 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderTest.java +++ b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderTest.java @@ -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) { diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderTest.java index 181b499637..4685ea8fbd 100755 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderTest.java +++ b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderTest.java @@ -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) { diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java index 1c7a1474fe..efba6e387b 100755 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java +++ b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java @@ -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, diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java index fc23c2aa8f..4925aa4078 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java @@ -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 closeServiceInstance() { + public synchronized FluentFuture 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); } } diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRibInWriter.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRibInWriter.java index 857cfdcc57..a9af303ba6 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRibInWriter.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRibInWriter.java @@ -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() { + @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() { + @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() { + @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() { + @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()); } } diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java index 9a9e253e3b..03f6de0e4b 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java @@ -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() { + @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() { + @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) { diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterPeerImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterPeerImpl.java index 9e133bbea7..327d6e5ef4 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterPeerImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterPeerImpl.java @@ -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 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() { + @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() { + @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() { + @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() { + @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(); } diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java index 3707d1b2ed..eb1a2966ce 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java @@ -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() { + @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); } -- 2.36.6