Bug2121 -- Add configuration parameter for TopologyId.
[l2switch.git] / loopremover / implementation / src / main / java / org / opendaylight / l2switch / loopremover / topology / TopologyLinkDataChangeHandler.java
index 65aedbb7a4bc9903b8ef232f6089d4ab761b3c21..4756c36a227340c3bd50a4d8fe4e200f3a9673c1 100644 (file)
@@ -9,6 +9,9 @@ package org.opendaylight.l2switch.loopremover.topology;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
@@ -53,12 +56,15 @@ import java.util.concurrent.TimeUnit;
 public class TopologyLinkDataChangeHandler implements DataChangeListener {
   private static final Logger _logger = LoggerFactory.getLogger(TopologyLinkDataChangeHandler.class);
   private static final String DEFAULT_TOPOLOGY_ID = "flow:1";
+  private static final long DEFAULT_GRAPH_REFRESH_DELAY = 1000;
 
   private final ScheduledExecutorService topologyDataChangeEventProcessor = Executors.newScheduledThreadPool(1);
 
   private final NetworkGraphService networkGraphService;
   private boolean networkGraphRefreshScheduled = false;
+  private boolean threadReschedule = false;
   private long graphRefreshDelay;
+  private String topologyId;
 
   private final DataBroker dataBroker;
 
@@ -70,7 +76,17 @@ public class TopologyLinkDataChangeHandler implements DataChangeListener {
   }
 
   public void setGraphRefreshDelay(long graphRefreshDelay) {
-    this.graphRefreshDelay = graphRefreshDelay;
+    if (graphRefreshDelay < 0) {
+      this.graphRefreshDelay = DEFAULT_GRAPH_REFRESH_DELAY;
+    }
+    else this.graphRefreshDelay = graphRefreshDelay;
+  }
+
+  public void setTopologyId(String topologyId) {
+    if (topologyId == null || topologyId.isEmpty()) {
+      this.topologyId = DEFAULT_TOPOLOGY_ID;
+    }
+    else this.topologyId = topologyId;
   }
 
   /**
@@ -81,7 +97,7 @@ public class TopologyLinkDataChangeHandler implements DataChangeListener {
    */
   public ListenerRegistration<DataChangeListener> registerAsDataChangeListener() {
     InstanceIdentifier<Link> linkInstance = InstanceIdentifier.builder(NetworkTopology.class)
-        .child(Topology.class, new TopologyKey(new TopologyId(DEFAULT_TOPOLOGY_ID))).child(Link.class).toInstance();
+        .child(Topology.class, new TopologyKey(new TopologyId(topologyId))).child(Link.class).toInstance();
     return dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, linkInstance, this, AsyncDataBroker.DataChangeScope.BASE);
   }
 
@@ -132,13 +148,14 @@ public class TopologyLinkDataChangeHandler implements DataChangeListener {
     if(!networkGraphRefreshScheduled) {
       synchronized(this) {
         if(!networkGraphRefreshScheduled) {
-          topologyDataChangeEventProcessor.schedule(new TopologyDataChangeEventProcessor(), graphRefreshDelay, TimeUnit.SECONDS);
+          topologyDataChangeEventProcessor.schedule(new TopologyDataChangeEventProcessor(), graphRefreshDelay, TimeUnit.MILLISECONDS);
           networkGraphRefreshScheduled = true;
           _logger.debug("Scheduled Graph for refresh.");
         }
       }
     } else {
       _logger.debug("Already scheduled for network graph refresh.");
+      threadReschedule = true;
     }
   }
 
@@ -150,6 +167,11 @@ public class TopologyLinkDataChangeHandler implements DataChangeListener {
 
     @Override
     public void run() {
+      if (threadReschedule) {
+        topologyDataChangeEventProcessor.schedule(this, graphRefreshDelay, TimeUnit.MILLISECONDS);
+        threadReschedule = false;
+        return;
+      }
       _logger.debug("In network graph refresh thread.");
       networkGraphRefreshScheduled = false;
       networkGraphService.clear();
@@ -158,14 +180,25 @@ public class TopologyLinkDataChangeHandler implements DataChangeListener {
         return;
       }
       networkGraphService.addLinks(links);
-      ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();
+      final ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();
       updateNodeConnectorStatus(readWriteTransaction);
-      readWriteTransaction.submit();
+      final CheckedFuture writeTxResultFuture = readWriteTransaction.submit();
+      Futures.addCallback(writeTxResultFuture, new FutureCallback() {
+        @Override
+        public void onSuccess(Object o) {
+          _logger.debug("TopologyLinkDataChangeHandler write successful for tx :{}", readWriteTransaction.getIdentifier());
+        }
+
+        @Override
+        public void onFailure(Throwable throwable) {
+          _logger.error("TopologyLinkDataChangeHandler write transaction {} failed", readWriteTransaction.getIdentifier(), throwable.getCause());
+        }
+      });
       _logger.debug("Done with network graph refresh thread.");
     }
 
     private List<Link> getLinksFromTopology() {
-      InstanceIdentifier<Topology> topologyInstanceIdentifier = InstanceIdentifierUtils.generateTopologyInstanceIdentifier(DEFAULT_TOPOLOGY_ID);
+      InstanceIdentifier<Topology> topologyInstanceIdentifier = InstanceIdentifierUtils.generateTopologyInstanceIdentifier(topologyId);
       Topology topology = null;
       ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
       try {