BGPCEP-745: Improve synchronization 33/67733/2
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Tue, 30 Jan 2018 18:54:39 +0000 (19:54 +0100)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Wed, 31 Jan 2018 09:27:32 +0000 (10:27 +0100)
when unbinding PCEPState

Change-Id: I7558610208f12e09f69d859bb0b613a044f8b1ce
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
pcep/topology/topology-stats/src/main/java/org/opendaylight/bgpcep/pcep/topology/stats/provider/TopologyStatsProviderImpl.java

index 935a4cc872db057d3727a6fca5294e4f91be9645..458adced06733fa09ce3bcd0193e581230998622 100644 (file)
@@ -39,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class TopologyStatsProviderImpl implements TransactionChainListener,
-        TopologySessionStatsRegistry,   AutoCloseable {
+        TopologySessionStatsRegistry, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(TopologyStatsProviderImpl.class);
     @GuardedBy("this")
@@ -54,20 +54,13 @@ public final class TopologyStatsProviderImpl implements TransactionChainListener
         this.timeout = timeout;
     }
 
-    public void init() {
+    public synchronized void init() {
         LOG.info("Initializing TopologyStatsProvider service.", this);
         this.transactionChain = this.dataBroker.createTransactionChain(this);
         final TimerTask task = new TimerTask() {
             @Override
             public void run() {
-                synchronized (TopologyStatsProviderImpl.this) {
-                    final WriteTransaction tx = TopologyStatsProviderImpl
-                            .this.transactionChain.newWriteOnlyTransaction();
-
-                    TopologyStatsProviderImpl.this.statsMap
-                            .forEach((key, value) -> updatePCEPStats(key, value, tx));
-                    tx.submit();
-                }
+                updatePcepStats();
             }
         };
 
@@ -75,26 +68,29 @@ public final class TopologyStatsProviderImpl implements TransactionChainListener
                 TimeUnit.SECONDS);
     }
 
-    private synchronized void updatePCEPStats(
-            final KeyedInstanceIdentifier<Node, NodeKey> nodeIId,
-            final PcepSessionState stats,
-            final WriteTransaction tx) {
+    private synchronized void updatePcepStats() {
+        final WriteTransaction tx = TopologyStatsProviderImpl.this.transactionChain.newWriteOnlyTransaction();
 
-        final PcepTopologyNodeStatsAug nodeStatsAug = new PcepTopologyNodeStatsAugBuilder()
-                .setPcepSessionState(new PcepSessionStateBuilder(stats).build()).build();
-        final InstanceIdentifier<PcepTopologyNodeStatsAug> statId =
-                nodeIId.augmentation(PcepTopologyNodeStatsAug.class);
-        tx.put(LogicalDatastoreType.OPERATIONAL, statId, nodeStatsAug);
+        for (final Map.Entry<KeyedInstanceIdentifier<Node, NodeKey>, PcepSessionState> entry
+                : this.statsMap.entrySet()) {
+            final PcepTopologyNodeStatsAug nodeStatsAug = new PcepTopologyNodeStatsAugBuilder()
+                    .setPcepSessionState(new PcepSessionStateBuilder(entry.getValue()).build()).build();
+            final InstanceIdentifier<PcepTopologyNodeStatsAug> statId =
+                    entry.getKey().augmentation(PcepTopologyNodeStatsAug.class);
+            tx.put(LogicalDatastoreType.OPERATIONAL, statId, nodeStatsAug);
+        }
+        tx.submit();
     }
 
     @Override
-    public void close() throws Exception {
+    public synchronized void close() throws Exception {
         LOG.info("Closing TopologyStatsProvider service.", this);
         this.scheduleTask.cancel(true);
         final WriteTransaction wTx = this.transactionChain.newWriteOnlyTransaction();
-        this.statsMap.keySet().iterator().forEachRemaining(statId ->
-                wTx.delete(LogicalDatastoreType.OPERATIONAL, statId));
-        wTx.submit().get();
+        for (final KeyedInstanceIdentifier<Node, NodeKey> statId : this.statsMap.keySet()) {
+            wTx.delete(LogicalDatastoreType.OPERATIONAL, statId);
+            wTx.submit().get();
+        }
         this.statsMap.clear();
         this.transactionChain.close();
     }