Simplify pcep-stats blueprint 02/98702/4
authormarekzatko <Marek.Zatko@pantheon.tech>
Fri, 26 Nov 2021 12:15:02 +0000 (13:15 +0100)
committerOlivier Dugeon <olivier.dugeon@orange.com>
Mon, 29 Nov 2021 14:27:48 +0000 (14:27 +0000)
We don't need to subclass Timer, use
TimerTask instead, ditch factory-ref since we can
instantiate the normal way.

Change-Id: I5cb047408392a51424bdb5356f18ad0095043f74
Signed-off-by: marekzatko <Marek.Zatko@pantheon.tech>
pcep/topology/topology-stats/src/main/java/org/opendaylight/bgpcep/pcep/topology/stats/provider/TopologyStatsProviderImpl.java
pcep/topology/topology-stats/src/main/resources/OSGI-INF/blueprint/pcep-stats.xml

index d0289d3743ca9b4b5179cb5dd3ade35732ded915..d60f8c7182909b94e2a789d22f13db77a8a4bc26 100644 (file)
@@ -16,10 +16,12 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.checkerframework.checker.lock.qual.Holding;
@@ -42,8 +44,8 @@ import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class TopologyStatsProviderImpl extends TimerTask
-        implements TransactionChainListener, TopologySessionStatsRegistry, AutoCloseable {
+public final class TopologyStatsProviderImpl implements TopologySessionStatsRegistry, TransactionChainListener,
+        AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(TopologyStatsProviderImpl.class);
 
     // This tracking looks weird. It essentially tracks when there is a pending delete transaction and skips updates --
@@ -62,22 +64,31 @@ public final class TopologyStatsProviderImpl extends TimerTask
     private DataBroker dataBroker;
     @GuardedBy("this")
     private TransactionChain transactionChain;
+    @GuardedBy("this")
+    private final ScheduledFuture<?> scheduleTask;
 
-    private TopologyStatsProviderImpl(final DataBroker dataBroker) {
-        this.dataBroker = requireNonNull(dataBroker);
+    public TopologyStatsProviderImpl(final DataBroker dataBroker, final int updateIntervalSeconds) {
+        this(dataBroker, updateIntervalSeconds, Executors.newScheduledThreadPool(1));
     }
 
-    public static AutoCloseable createStarted(final DataBroker dataBroker, final Timer timer,
-            final int updateIntervalSeconds) {
+    public TopologyStatsProviderImpl(final DataBroker dataBroker, final int updateIntervalSeconds,
+            final ScheduledExecutorService scheduler) {
+        this.dataBroker = requireNonNull(dataBroker);
         LOG.info("Initializing TopologyStatsProvider service.");
-        final TopologyStatsProviderImpl ret = new TopologyStatsProviderImpl(dataBroker);
-        timer.scheduleAtFixedRate(ret, 0, TimeUnit.SECONDS.toMillis(updateIntervalSeconds));
-        return ret;
+        final TimerTask task = new TimerTask() {
+            @Override
+            public void run() {
+                synchronized (TopologyStatsProviderImpl.this) {
+                    updateStats();
+                }
+            }
+        };
+        scheduleTask = scheduler.scheduleAtFixedRate(task, 0, updateIntervalSeconds, TimeUnit.SECONDS);
     }
 
     @Override
     public void close() throws InterruptedException, ExecutionException {
-        if (cancel()) {
+        if (scheduleTask.cancel(true)) {
             LOG.info("Closing TopologyStatsProvider service.");
             shutdown();
         } else {
@@ -122,9 +133,8 @@ public final class TopologyStatsProviderImpl extends TimerTask
         return transactionChain;
     }
 
-    @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
-    public synchronized void run() {
+    public synchronized void updateStats() {
         final TransactionChain chain = accessChain();
         if (chain == null) {
             // Already closed, do not bother
@@ -136,10 +146,10 @@ public final class TopologyStatsProviderImpl extends TimerTask
             for (Entry<KeyedInstanceIdentifier<Node, NodeKey>, PcepSessionState> entry : statsMap.entrySet()) {
                 if (!statsPendingDelete.contains(entry.getKey())) {
                     tx.put(LogicalDatastoreType.OPERATIONAL,
-                        entry.getKey().augmentation(PcepTopologyNodeStatsAug.class),
-                        new PcepTopologyNodeStatsAugBuilder()
-                            .setPcepSessionState(new PcepSessionStateBuilder(entry.getValue()).build())
-                            .build());
+                            entry.getKey().augmentation(PcepTopologyNodeStatsAug.class),
+                            new PcepTopologyNodeStatsAugBuilder()
+                                    .setPcepSessionState(new PcepSessionStateBuilder(entry.getValue()).build())
+                                    .build());
                 }
             }
         } catch (Exception e) {
index 50f1b64e5c21acd92026fcc2f9fb1346bf996d08..08eddbd689d003038a744a5285a01a179982498b 100644 (file)
     </bean>
     <odl:rpc-implementation ref="topologyStatsRpcService"/>
 
-    <bean id="timer" class="java.util.Timer" destroy-method="cancel">
-        <argument value="pcep-topology-stats-timer"/>
-        <argument value="true"/>
-    </bean>
-
     <bean id="topologyStatsRegistry"
           class="org.opendaylight.bgpcep.pcep.topology.stats.provider.TopologyStatsProviderImpl"
-          factory-method="createStarted" destroy-method="close">
+          destroy-method="close">
         <argument ref="dataBroker"/>
-        <argument ref="timer"/>
         <argument>
             <bean factory-ref="pcepStatsConfig" factory-method="getTimer"/>
         </argument>
     </bean>
+
     <service ref="topologyStatsRegistry"
              interface="org.opendaylight.bgpcep.pcep.topology.spi.stats.TopologySessionStatsRegistry"/>
 </blueprint>