From df9bd1e2436b62a17cfc4e876ce01d1122f90e46 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Mon, 19 Dec 2016 23:36:09 +0100 Subject: [PATCH] Replace UnsignedInt32Counter by LongAdder Replace UnsignedInt32Counter, which is not efficient and only provides of logs which are of not use for a more suitable counter(LongAdder). Change-Id: Iaad4879c9c3a783ac45f21d47f3379b22f22e3e4 Signed-off-by: Claudio D. Gasparini --- .../bgp/rib/impl/AdjRibOutListener.java | 12 +-- .../bgp/rib/impl/ApplicationPeer.java | 2 +- .../protocol/bgp/rib/impl/BGPPeer.java | 12 +-- .../protocol/bgp/rib/impl/CountersUtil.java | 60 ++++++++++++ .../bgp/rib/impl/EffectiveRibInWriter.java | 8 +- .../protocol/bgp/rib/impl/LocRibWriter.java | 11 ++- .../rib/impl/stats/UnsignedInt32Counter.java | 97 ------------------- .../bgp/rib/impl/stats/peer/BGPPeerStats.java | 7 +- .../rib/impl/stats/peer/BGPPeerStatsImpl.java | 28 +++--- .../peer/route/PerTableTypeRouteCounter.java | 40 ++++---- .../impl/stats/rib/impl/BGPRenderStats.java | 9 +- .../stats/rib/impl/BGPRenderStatsImpl.java | 36 +++---- .../rib/impl/RIBImplRuntimeMXBeanImpl.java | 6 +- .../rib/impl/AbstractRIBImplModuleTest.java | 4 +- .../bgp/rib/impl/config/AbstractConfig.java | 4 +- .../rib/impl/BGPRenderStatsImplTest.java | 14 ++- 16 files changed, 157 insertions(+), 193 deletions(-) create mode 100644 bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CountersUtil.java delete mode 100644 bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/UnsignedInt32Counter.java diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java index beb1177e64..4dddf38128 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -20,7 +21,6 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.protocol.bgp.rib.impl.spi.Codecs; import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils; @@ -64,11 +64,11 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener { private final RIBSupport support; private final boolean mpSupport; private final ListenerRegistration registerDataTreeChangeListener; - private final UnsignedInt32Counter routeCounter; + private final LongAdder routeCounter; private AdjRibOutListener(final PeerId peerId, final TablesKey tablesKey, final YangInstanceIdentifier ribId, final CodecsRegistry registry, final RIBSupport support, final DOMDataTreeChangeService service, - final ChannelOutputLimiter session, final boolean mpSupport, final UnsignedInt32Counter routeCounter) { + final ChannelOutputLimiter session, final boolean mpSupport, final LongAdder routeCounter) { this.session = Preconditions.checkNotNull(session); this.support = Preconditions.checkNotNull(support); this.codecs = registry.getCodecs(this.support); @@ -80,7 +80,7 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener { static AdjRibOutListener create(@Nonnull final PeerId peerId, @Nonnull final TablesKey tablesKey, @Nonnull final YangInstanceIdentifier ribId, @Nonnull final CodecsRegistry registry, @Nonnull final RIBSupport support, @Nonnull final DOMDataTreeChangeService service, - @Nonnull final ChannelOutputLimiter session, @Nonnull final boolean mpSupport, @Nonnull final UnsignedInt32Counter routeCounter + @Nonnull final ChannelOutputLimiter session, @Nonnull final boolean mpSupport, @Nonnull final LongAdder routeCounter ) { return new AdjRibOutListener(peerId, tablesKey, ribId, registry, support, service, session, mpSupport, routeCounter); } @@ -137,7 +137,7 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener { } private Update withdraw(final MapEntryNode route) { - this.routeCounter.decreaseCount(); + this.routeCounter.decrement(); if (!this.mpSupport) { return buildUpdate(Collections.emptyList(), Collections.singleton(route), routeAttributes(route)); } @@ -145,7 +145,7 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener { } private Update advertise(final MapEntryNode route) { - this.routeCounter.increaseCount(); + this.routeCounter.increment(); if (!this.mpSupport) { return buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route)); } 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 bf65fdc7c4..cfdedff7e0 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 @@ -130,7 +130,7 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol }; this.adjRibInWriter = this.adjRibInWriter.transform(peerId, context, localTables, Collections.emptyMap(), registerAppPeerListener); - this.peerStats = new BGPPeerStatsImpl(this.name, localTables); + this.peerStats = new BGPPeerStatsImpl(localTables); this.effectiveRibInWriter = EffectiveRibInWriter.create(this.rib.getService(), this.rib.createPeerChain(this), this.peerIId, this.rib.getImportPolicyPeerTracker(), context, PeerRole.Internal, this.peerStats.getEffectiveRibInRouteCounters(), this.peerStats.getAdjRibInRouteCounters()); 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 fe62c9efb2..da76554016 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 @@ -114,7 +114,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer private final String name; private BGPPeerRuntimeRegistrator registrator; private BGPPeerRuntimeRegistration runtimeReg; - private final Map adjRibOutListenerSet = new HashMap(); + private final Map adjRibOutListenerSet = new HashMap<>(); private final RpcProviderRegistry rpcRegistry; private RoutedRpcRegistration rpcRegistration; private final PeerRole peerRole; @@ -129,7 +129,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer this.rib = Preconditions.checkNotNull(rib); this.name = name; this.rpcRegistry = rpcRegistry; - this.peerStats = new BGPPeerStatsImpl(this.name, this.tables); + this.peerStats = new BGPPeerStatsImpl(this.tables); this.chain = rib.createPeerChain(this); } @@ -140,7 +140,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer public void instantiateServiceInstance() { // add current peer to "configured BGP peer" stats - this.rib.getRenderStats().getConfiguredPeerCounter().increaseCount(); + this.rib.getRenderStats().getConfiguredPeerCounter().increment(); this.ribWriter = AdjRibInWriter.create(rib.getYangRibId(), this.peerRole, this.simpleRoutingPolicy, this.chain); } @@ -320,7 +320,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer this.ribWriter = this.ribWriter.transform(peerId, this.rib.getRibSupportContext(), this.tables, addPathTableMaps); // register BGP Peer stats - this.peerStats.getSessionEstablishedCounter().increaseCount(); + this.peerStats.getSessionEstablishedCounter().increment(); if (this.registrator != null) { this.runtimeReg = this.registrator.register(this); } @@ -332,7 +332,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer this.rpcRegistration.registerPath(PeerContext.class, path); } - this.rib.getRenderStats().getConnectedPeerCounter().increaseCount(); + this.rib.getRenderStats().getConnectedPeerCounter().increment(); } private void createAdjRibOutListener(final PeerId peerId) { @@ -434,7 +434,7 @@ public class BGPPeer implements BGPSessionListener, Peer, AutoCloseable, BGPPeer } this.session = null; - this.rib.getRenderStats().getConnectedPeerCounter().decreaseCount(); + this.rib.getRenderStats().getConnectedPeerCounter().decrement(); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CountersUtil.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CountersUtil.java new file mode 100644 index 0000000000..003c32912a --- /dev/null +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CountersUtil.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.protocol.bgp.rib.impl; + +import java.util.concurrent.atomic.LongAdder; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides util for increment/decrement counters whenever is not null + * Otherwise prints an informative warn. + */ +public final class CountersUtil { + private static final Logger LOG = LoggerFactory.getLogger(CountersUtil.class); + + private CountersUtil() { + throw new UnsupportedOperationException(); + } + + /** + * Increments counter by 1 if supported, otherwise produce a warn + * + * @param counter counter + * @param tablesKey tablesKey Type + */ + static void increment(@Nullable final LongAdder counter, @Nonnull TablesKey tablesKey) { + if (counter != null) { + counter.increment(); + return; + } + LOG.warn("Family {} not supported", tablesKey); + } + + /** + * Increments counter by 1 if supported, otherwise produce a warn + * @param counter counter + * @param tablesKey tablesKey Type + */ + static void decrement(@Nullable final LongAdder counter, @Nonnull TablesKey tablesKey) { + if (counter != null) { + counter.decrement(); + return; + } + LOG.warn("Family {} not supported", tablesKey); + } + + public static ZeroBasedCounter32 toZeroBasedCounter32(final LongAdder longAdder){ + return new ZeroBasedCounter32(longAdder.longValue()); + } +} 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 b62e0ec879..bb3dad7e50 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 @@ -15,6 +15,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -101,7 +102,7 @@ final class EffectiveRibInWriter implements AutoCloseable { */ @Deprecated AdjInTracker(final DOMDataTreeChangeService service, final RIBSupportContextRegistry registry, final DOMTransactionChain chain, final YangInstanceIdentifier peerIId) { - this(service, registry, chain, peerIId, new PerTableTypeRouteCounter("effective-rib-in"), new PerTableTypeRouteCounter("adj-rib-in")); + this(service, registry, chain, peerIId, new PerTableTypeRouteCounter(), new PerTableTypeRouteCounter()); } private void updateRoute(@Nonnull final PerTableTypeRouteCounter counter, @Nonnull final Map> routeMap, @@ -130,8 +131,9 @@ final class EffectiveRibInWriter implements AutoCloseable { private void updateRouteCounter(@Nonnull final PerTableTypeRouteCounter counter, @Nonnull final Map> routeMap, @Nonnull final TablesKey tablesKey) { - counter.getCounterOrSetDefault(tablesKey) - .setCount(routeMap.getOrDefault(tablesKey, new HashSet<>()).size()); + final LongAdder tableCounter = counter.getCounterOrSetDefault(tablesKey); + tableCounter.reset(); + tableCounter.add(routeMap.getOrDefault(tablesKey, new HashSet<>()).size()); } private void processRoute(final DOMDataWriteTransaction tx, final RIBSupport ribSupport, final AbstractImportPolicy policy, final YangInstanceIdentifier routesPath, final DataTreeCandidateNode route) { 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 3cbd173c11..d6ad73ec11 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 @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -25,7 +26,6 @@ import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; import org.opendaylight.protocol.bgp.mode.api.RouteEntry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils; import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup; @@ -73,11 +73,11 @@ final class LocRibWriter implements AutoCloseable, ClusteredDOMDataTreeChangeLis private final TablesKey localTablesKey; private final ListenerRegistration reg; private final PathSelectionMode pathSelectionMode; - private final UnsignedInt32Counter routeCounter; + private final LongAdder routeCounter; private LocRibWriter(final RIBSupportContextRegistry registry, final DOMTransactionChain chain, final YangInstanceIdentifier target, final Long ourAs, final DOMDataTreeChangeService service, final ExportPolicyPeerTracker exportPolicyPeerTracker, final TablesKey tablesKey, - @Nonnull final PathSelectionMode pathSelectionMode, final UnsignedInt32Counter routeCounter) { + @Nonnull final PathSelectionMode pathSelectionMode, final LongAdder routeCounter) { this.chain = Preconditions.checkNotNull(chain); final NodeIdentifierWithPredicates tableKey = RibSupportUtils.toYangTablesKey(tablesKey); this.localTablesKey = tablesKey; @@ -101,7 +101,7 @@ final class LocRibWriter implements AutoCloseable, ClusteredDOMDataTreeChangeLis public static LocRibWriter create(@Nonnull final RIBSupportContextRegistry registry, @Nonnull final TablesKey tablesKey, @Nonnull final DOMTransactionChain chain, @Nonnull final YangInstanceIdentifier target, @Nonnull final AsNumber ourAs, @Nonnull final DOMDataTreeChangeService service, @Nonnull final ExportPolicyPeerTracker ep, - @Nonnull final PathSelectionMode pathSelectionStrategy, @Nonnull final UnsignedInt32Counter routeCounter) { + @Nonnull final PathSelectionMode pathSelectionStrategy, @Nonnull final LongAdder routeCounter) { return new LocRibWriter(registry, chain, target, ourAs.getValue(), service, ep, tablesKey, pathSelectionStrategy, routeCounter); } @@ -211,7 +211,8 @@ final class LocRibWriter implements AutoCloseable, ClusteredDOMDataTreeChangeLis * Update the statistic of loc-rib route */ private void updateRouteCounter() { - routeCounter.setCount(this.routeEntries.size()); + this.routeCounter.reset(); + this.routeCounter.add(this.routeEntries.size()); } private void walkThrough(final DOMDataWriteTransaction tx, final Set> toUpdate) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/UnsignedInt32Counter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/UnsignedInt32Counter.java deleted file mode 100644 index 50fdd880ad..0000000000 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/UnsignedInt32Counter.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2016 Brocade Communications Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.protocol.bgp.rib.impl.stats; - -import com.google.common.base.Preconditions; -import java.util.concurrent.atomic.AtomicLong; -import javax.annotation.Nonnull; -import javax.annotation.concurrent.ThreadSafe; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Kevin Wang - */ -@ThreadSafe -public class UnsignedInt32Counter { - private static final Logger LOG = LoggerFactory.getLogger(UnsignedInt32Counter.class); - private static final long MAX_VALUE = 4294967295L; - - private final String counterName; - private final AtomicLong count = new AtomicLong(); - - public UnsignedInt32Counter(@Nonnull final String counterName) { - this.counterName = Preconditions.checkNotNull(counterName); - } - - private static long safetyCheck(final long value) { - return Math.min(Math.max(0L, value), MAX_VALUE); - } - - public long increaseCount(final long change) { - final long result; - if (change == 0) { - result = getCount(); - } else { - Preconditions.checkArgument(change > 0, "Count number %s must be a positive number.", change); - result = this.count.addAndGet(change); - LOG.debug("Counter [{}] is increased by {}. Current count: {}", this.counterName, change, result); - if (result > MAX_VALUE) { - LOG.warn("Counter [{}] has exceeded the max allowed value {}. Counter's current value {} is invalid.", this.counterName, MAX_VALUE, result); - } - } - return result; - } - - public long increaseCount() { - return this.increaseCount(1); - } - - public long decreaseCount(final long change) { - final long result; - if (change == 0) { - result = getCount(); - } else { - Preconditions.checkArgument(change > 0, "Count number %s must be a positive number.", change); - result = this.count.addAndGet(-change); - LOG.debug("Counter [{}] is decreased by {}. Current count: {}", this.counterName, change, result); - if (result < 0) { - // In most case, we do not want the BGP session get into trouble due to an ERROR in counter - // so here we print ERROR log instead of throwing out exception - LOG.warn("Counter {} must not be less than 0. Counter's current value {} is invalid.", this.counterName, result); - } - } - return result; - } - - public long decreaseCount() { - return this.decreaseCount(1); - } - - public long getCount() { - return this.count.get(); - } - - public void setCount(final long count) { - final long result = getCount(); - if (count != result) { - LOG.debug("Value of counter [{}] changes to {} (previous value is {})", this.counterName, count, result); - this.count.set(count); - } - } - - public void resetCount() { - LOG.debug("Value of counter [{}] is reset to 0.", this.counterName); - setCount(0L); - } - - public ZeroBasedCounter32 getCountAsZeroBasedCounter32() { - return new ZeroBasedCounter32(safetyCheck(getCount())); - } -} diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStats.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStats.java index 3949441813..ae251e8b0c 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStats.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStats.java @@ -7,13 +7,10 @@ */ package org.opendaylight.protocol.bgp.rib.impl.stats.peer; +import java.util.concurrent.atomic.LongAdder; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpPeerState; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter; -/** - * @author Kevin Wang - */ public interface BGPPeerStats { BgpPeerState getBgpPeerState(); @@ -23,5 +20,5 @@ public interface BGPPeerStats { PerTableTypeRouteCounter getEffectiveRibInRouteCounters(); - UnsignedInt32Counter getSessionEstablishedCounter(); + LongAdder getSessionEstablishedCounter(); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStatsImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStatsImpl.java index 537a578e2c..df41686296 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStatsImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/BGPPeerStatsImpl.java @@ -7,15 +7,17 @@ */ package org.opendaylight.protocol.bgp.rib.impl.stats.peer; +import static org.opendaylight.protocol.bgp.rib.impl.CountersUtil.toZeroBasedCounter32; + import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import org.opendaylight.controller.config.api.IdentityAttributeRef; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpPeerState; import org.opendaylight.controller.config.yang.bgp.rib.impl.RouteTable; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; @@ -26,15 +28,13 @@ public final class BGPPeerStatsImpl implements BGPPeerStats { private final PerTableTypeRouteCounter adjRibInRouteCounters; private final PerTableTypeRouteCounter adjRibOutRouteCounters; private final PerTableTypeRouteCounter effectiveRibInRouteCounters; - private final UnsignedInt32Counter sessionEstablishedCounter = new UnsignedInt32Counter("SESSION ESTABLISHED"); - private final String peerName; + private final LongAdder sessionEstablishedCounter = new LongAdder(); - public BGPPeerStatsImpl(@Nonnull final String peerName, @Nonnull final Set tablesKeySet) { - this.peerName = Preconditions.checkNotNull(peerName); + public BGPPeerStatsImpl(@Nonnull final Set tablesKeySet) { this.tablesKeySet = Preconditions.checkNotNull(tablesKeySet); - this.adjRibInRouteCounters = new PerTableTypeRouteCounter("["+ this.peerName +"] adj-rib-in route", tablesKeySet); - this.adjRibOutRouteCounters = new PerTableTypeRouteCounter("["+ this.peerName +"] adj-rib-out route", tablesKeySet); - this.effectiveRibInRouteCounters = new PerTableTypeRouteCounter("["+ this.peerName +"] effective-rib-in route", tablesKeySet); + this.adjRibInRouteCounters = new PerTableTypeRouteCounter(tablesKeySet); + this.adjRibOutRouteCounters = new PerTableTypeRouteCounter(tablesKeySet); + this.effectiveRibInRouteCounters = new PerTableTypeRouteCounter(tablesKeySet); } public PerTableTypeRouteCounter getAdjRibInRouteCounters() { @@ -60,9 +60,9 @@ public final class BGPPeerStatsImpl implements BGPPeerStats { routeTable.setAfi(new IdentityAttributeRef(afiQName.toString())); routeTable.setSafi(new IdentityAttributeRef(safiQName.toString())); // we want to get default counter in case particular route table is not initialized (e.g. adj-rib-out is not initialized in some cases) - routeTable.setAdjRibInRoutesCount(adjRibInRouteCounters.getCounterOrDefault(tablesKey).getCountAsZeroBasedCounter32()); - routeTable.setAdjRibOutRoutesCount(adjRibOutRouteCounters.getCounterOrDefault(tablesKey).getCountAsZeroBasedCounter32()); - routeTable.setEffectiveRibInRoutesCount(effectiveRibInRouteCounters.getCounterOrDefault(tablesKey).getCountAsZeroBasedCounter32()); + routeTable.setAdjRibInRoutesCount(toZeroBasedCounter32(this.adjRibInRouteCounters.getCounterOrDefault(tablesKey))); + routeTable.setAdjRibOutRoutesCount(toZeroBasedCounter32(this.adjRibOutRouteCounters.getCounterOrDefault(tablesKey))); + routeTable.setEffectiveRibInRoutesCount(toZeroBasedCounter32(this.effectiveRibInRouteCounters.getCounterOrDefault(tablesKey))); return routeTable; } @@ -71,14 +71,14 @@ public final class BGPPeerStatsImpl implements BGPPeerStats { public BgpPeerState getBgpPeerState() { final BgpPeerState peerState = new BgpPeerState(); final List routes = Lists.newArrayList(); - this.tablesKeySet.stream().forEach(tablesKey -> routes.add(createRouteTable(tablesKey))); + this.tablesKeySet.forEach(tablesKey -> routes.add(createRouteTable(tablesKey))); peerState.setRouteTable(routes); - peerState.setSessionEstablishedCount(this.sessionEstablishedCounter.getCountAsZeroBasedCounter32()); + peerState.setSessionEstablishedCount(toZeroBasedCounter32(this.sessionEstablishedCounter)); return peerState; } @Override - public UnsignedInt32Counter getSessionEstablishedCounter() { + public LongAdder getSessionEstablishedCounter() { return this.sessionEstablishedCounter; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/route/PerTableTypeRouteCounter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/route/PerTableTypeRouteCounter.java index 07bdf06f8e..e2af7a3378 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/route/PerTableTypeRouteCounter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/peer/route/PerTableTypeRouteCounter.java @@ -11,8 +11,8 @@ import com.google.common.base.Preconditions; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,33 +20,27 @@ import org.slf4j.LoggerFactory; public final class PerTableTypeRouteCounter { private static final Logger LOG = LoggerFactory.getLogger(PerTableTypeRouteCounter.class); - private final Map counters = new ConcurrentHashMap<>(); - private final String counterName; + private final Map counters = new ConcurrentHashMap<>(); - private final UnsignedInt32Counter createCounter(@Nonnull final TablesKey tablesKey) { - return new UnsignedInt32Counter(this.counterName + tablesKey.toString()); - } - - public PerTableTypeRouteCounter(@Nonnull final String counterName) { - this.counterName = Preconditions.checkNotNull(counterName); + public PerTableTypeRouteCounter(@Nonnull final Set tablesKeySet) { + init(tablesKeySet); } - public PerTableTypeRouteCounter(@Nonnull final String counterName, @Nonnull final Set tablesKeySet) { - this(counterName); - init(tablesKeySet); + public PerTableTypeRouteCounter() { } - public final synchronized void init(@Nonnull Set tablesKeySet) { - tablesKeySet.stream().forEach(tablesKey -> init(tablesKey)); + private synchronized void init(@Nonnull Set tablesKeySet) { + tablesKeySet.forEach(this::init); } - public final synchronized UnsignedInt32Counter init(@Nonnull final TablesKey tablesKey) { - UnsignedInt32Counter counter = this.counters.get(Preconditions.checkNotNull(tablesKey)); + public final synchronized LongAdder init(@Nonnull final TablesKey tablesKey) { + LongAdder counter = this.counters.get(Preconditions.checkNotNull(tablesKey)); if (counter == null) { - this.counters.put(tablesKey, counter = createCounter(tablesKey)); + counter = new LongAdder(); + this.counters.put(tablesKey, counter); } LOG.debug("Initializing route counter for tablesKey {}", tablesKey); - counter.resetCount(); + counter.reset(); return counter; } @@ -56,8 +50,8 @@ public final class PerTableTypeRouteCounter { * @param tablesKey * @return */ - @Nonnull public final UnsignedInt32Counter getCounterOrDefault(@Nonnull final TablesKey tablesKey) { - return this.counters.getOrDefault(Preconditions.checkNotNull(tablesKey), createCounter(tablesKey)); + @Nonnull public final LongAdder getCounterOrDefault(@Nonnull final TablesKey tablesKey) { + return this.counters.getOrDefault(Preconditions.checkNotNull(tablesKey), new LongAdder()); } /** @@ -66,7 +60,7 @@ public final class PerTableTypeRouteCounter { * @param tablesKey * @return */ - public final UnsignedInt32Counter getCounterOrSetDefault(@Nonnull final TablesKey tablesKey) { + public final LongAdder getCounterOrSetDefault(@Nonnull final TablesKey tablesKey) { if (!this.counters.containsKey(tablesKey)) { return init(tablesKey); } else { @@ -74,12 +68,12 @@ public final class PerTableTypeRouteCounter { } } - public final Map getCounters() { + public final Map getCounters() { return this.counters; } public final void resetAll() { LOG.debug("Resetting all route counters.."); - this.counters.values().stream().forEach(v -> v.resetCount()); + this.counters.values().forEach(LongAdder::reset); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStats.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStats.java index 6648bf9b1c..0d2de4fc92 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStats.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStats.java @@ -7,18 +7,15 @@ */ package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl; +import java.util.concurrent.atomic.LongAdder; import org.opendaylight.controller.config.yang.bgp.rib.impl.RIBImplRuntimeMXBean; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter; -/** - * @author Kevin Wang - */ public interface BGPRenderStats extends RIBImplRuntimeMXBean { PerTableTypeRouteCounter getLocRibRouteCounter(); - UnsignedInt32Counter getConfiguredPeerCounter(); + LongAdder getConfiguredPeerCounter(); - UnsignedInt32Counter getConnectedPeerCounter(); + LongAdder getConnectedPeerCounter(); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java index c5495ccb9e..a84662a95e 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java @@ -7,16 +7,18 @@ */ package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl; +import static org.opendaylight.protocol.bgp.rib.impl.CountersUtil.toZeroBasedCounter32; + import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.controller.config.api.IdentityAttributeRef; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpRenderState; import org.opendaylight.controller.config.yang.bgp.rib.impl.LocRibRouteTable; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId; @@ -27,21 +29,21 @@ import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; public class BGPRenderStatsImpl implements BGPRenderStats { - private final PerTableTypeRouteCounter locRibRouteCounter = new PerTableTypeRouteCounter("loc-rib route"); + private final PerTableTypeRouteCounter locRibRouteCounter = new PerTableTypeRouteCounter(); private final BgpId bgpId; private final RibId ribId; private final ClusterIdentifier clusterId; private final AsNumber localAs; - private final UnsignedInt32Counter configuredPeerCounter; - private final UnsignedInt32Counter connectedPeerCounter; + private final LongAdder configuredPeerCounter; + private final LongAdder connectedPeerCounter; public BGPRenderStatsImpl(@Nonnull final BgpId bgpId, @Nonnull final RibId ribId, @Nonnull final AsNumber localAs, @Nullable final ClusterIdentifier clusterId) { this.bgpId = Preconditions.checkNotNull(bgpId); this.ribId = Preconditions.checkNotNull(ribId); this.localAs = localAs; this.clusterId = clusterId; - this.configuredPeerCounter = new UnsignedInt32Counter("Configured Peer of BGP-RIB " + this.ribId.getValue()); - this.connectedPeerCounter = new UnsignedInt32Counter("Connected Peer of BGP-RIB " + this.ribId.getValue()); + this.configuredPeerCounter = new LongAdder(); + this.connectedPeerCounter = new LongAdder(); } @Override @@ -51,27 +53,27 @@ public class BGPRenderStatsImpl implements BGPRenderStats { renderState.setBgpRibId(this.bgpId); renderState.setClusterId(this.clusterId); renderState.setLocalAs(this.localAs); - renderState.setConfiguredPeerCount(this.configuredPeerCounter.getCountAsZeroBasedCounter32()); - renderState.setConnectedPeerCount(this.connectedPeerCounter.getCountAsZeroBasedCounter32()); + renderState.setConfiguredPeerCount(toZeroBasedCounter32(this.configuredPeerCounter)); + renderState.setConnectedPeerCount(toZeroBasedCounter32(this.connectedPeerCounter)); // fill in the the statistic part - final UnsignedInt32Counter totalRouteCount = new UnsignedInt32Counter("Total Loc-Rib Route Count"); + final LongAdder totalRouteCount = new LongAdder(); final List locRibRouteTableList = new ArrayList<>(); - this.locRibRouteCounter.getCounters().entrySet().stream().forEach(e -> generateCounters(e, locRibRouteTableList, totalRouteCount)); + this.locRibRouteCounter.getCounters().entrySet().forEach(e -> generateCounters(e, locRibRouteTableList, totalRouteCount)); renderState.setLocRibRouteTable(locRibRouteTableList); - renderState.setLocRibRoutesCount(totalRouteCount.getCountAsZeroBasedCounter32()); + renderState.setLocRibRoutesCount(toZeroBasedCounter32(totalRouteCount)); return renderState; } - private void generateCounters(final Map.Entry e, final List locRibRouteTableList, - final UnsignedInt32Counter totalRouteCount) { + private void generateCounters(final Map.Entry e, final List locRibRouteTableList, + final LongAdder totalRouteCount) { final LocRibRouteTable table = new LocRibRouteTable(); final QName afi = BindingReflections.getQName(e.getKey().getAfi()).intern(); final QName safi = BindingReflections.getQName(e.getKey().getSafi()).intern(); table.setAfi(new IdentityAttributeRef(afi.toString())); table.setSafi(new IdentityAttributeRef(safi.toString())); - table.setRoutesCount(e.getValue().getCountAsZeroBasedCounter32()); + table.setRoutesCount(toZeroBasedCounter32(e.getValue())); locRibRouteTableList.add(table); - totalRouteCount.increaseCount(e.getValue().getCount()); + totalRouteCount.add(e.getValue().longValue()); } @@ -81,12 +83,12 @@ public class BGPRenderStatsImpl implements BGPRenderStats { } @Override - public UnsignedInt32Counter getConfiguredPeerCounter() { + public LongAdder getConfiguredPeerCounter() { return this.configuredPeerCounter; } @Override - public UnsignedInt32Counter getConnectedPeerCounter() { + public LongAdder getConnectedPeerCounter() { return this.connectedPeerCounter; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/RIBImplRuntimeMXBeanImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/RIBImplRuntimeMXBeanImpl.java index 4d9894f5a2..01e8c7ceac 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/RIBImplRuntimeMXBeanImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/RIBImplRuntimeMXBeanImpl.java @@ -7,10 +7,10 @@ */ package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl; +import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpRenderState; -import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId; @@ -38,12 +38,12 @@ public class RIBImplRuntimeMXBeanImpl implements BGPRenderStats { } @Override - public UnsignedInt32Counter getConfiguredPeerCounter() { + public LongAdder getConfiguredPeerCounter() { return this.renderStats.getConfiguredPeerCounter(); } @Override - public UnsignedInt32Counter getConnectedPeerCounter() { + public LongAdder getConnectedPeerCounter() { return this.renderStats.getConnectedPeerCounter(); } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java index 3075b68cb7..9ea90e9061 100755 --- a/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.LongAdder; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; @@ -92,7 +93,6 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer; import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker; 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.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext; import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext; @@ -286,7 +286,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { doReturn(new AsNumber(123456l)).when(this.mockedRIB).getLocalAs(); doReturn(BGP_ID).when(this.mockedRIB).getBgpIdentifier(); final BGPRenderStats mockedRenderStats = mock(BGPRenderStats.class); - doReturn(new UnsignedInt32Counter("counter")).when(mockedRenderStats).getConfiguredPeerCounter(); + doReturn(new LongAdder()).when(mockedRenderStats).getConfiguredPeerCounter(); doReturn(mockedRenderStats).when(this.mockedRIB).getRenderStats(); final DOMDataTreeChangeService mockedTreeChangeService = mock(DOMDataTreeChangeService.class); final ListenerRegistration mockedListenerReg = mock(ListenerRegistration.class); 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 2755a180a6..ef025eaed3 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 @@ -19,6 +19,7 @@ import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.Collections; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.LongAdder; import org.junit.Before; import org.mockito.Mock; import org.mockito.Mockito; @@ -43,7 +44,6 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer; import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker; 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.stats.UnsignedInt32Counter; import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats; import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; @@ -99,7 +99,7 @@ class AbstractConfig { this.singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0]; return this.singletonServiceRegistration; }).when(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class)); - Mockito.doReturn(new UnsignedInt32Counter("counter")).when(this.render).getConfiguredPeerCounter(); + Mockito.doReturn(new LongAdder()).when(this.render).getConfiguredPeerCounter(); Mockito.doReturn(this.render).when(this.rib).getRenderStats(); Mockito.doReturn(this.domTx).when(this.rib).createPeerChain(any(TransactionChainListener.class)); Mockito.doReturn(AS).when(this.rib).getLocalAs(); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java index ee50556107..e95f5948d9 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.LongAdder; import org.junit.Test; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpRenderState; import org.opendaylight.controller.config.yang.bgp.rib.impl.LocRibRouteTable; @@ -47,8 +48,15 @@ public class BGPRenderStatsImplTest { renderStateExpected.setLocRibRoutesCount(COUTER); assertEquals(renderStateExpected, render.getBgpRenderState()); - assertEquals(1L, render.getLocRibRouteCounter().init(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).increaseCount()); - assertEquals(1L, render.getConfiguredPeerCounter().increaseCount()); - assertEquals(1L, render.getConnectedPeerCounter().increaseCount()); + LongAdder counter = render.getLocRibRouteCounter().init(new TablesKey(Ipv4AddressFamily.class, + UnicastSubsequentAddressFamily.class)); + counter.increment(); + assertEquals(1L, counter.longValue()); + counter = render.getConfiguredPeerCounter(); + counter.increment(); + assertEquals(1L, counter.longValue()); + counter = render.getConnectedPeerCounter(); + counter.increment(); + assertEquals(1L, counter.longValue()); } } \ No newline at end of file -- 2.36.6