Bug 6745 Remove thread renaming and unnecessary logging
[openflowplugin.git] / applications / forwardingrules-sync / src / main / java / org / opendaylight / openflowplugin / applications / frsync / impl / SimplifiedOperationalListener.java
index 7717bb2930e4b05e8727bb050ba926d0e0b55106..424a98daebc3b7456b864abb5a89a013ea305ea7 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.openflowplugin.applications.frsync.impl.clustering.Devic
 import org.opendaylight.openflowplugin.applications.frsync.util.ModificationUtil;
 import org.opendaylight.openflowplugin.applications.frsync.util.PathUtil;
 import org.opendaylight.openflowplugin.applications.frsync.util.ReconciliationRegistry;
+import org.opendaylight.openflowplugin.applications.frsync.util.SyncupEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableStatisticsGatheringStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.snapshot.gathering.status.grouping.SnapshotGatheringStatusEnd;
@@ -39,12 +40,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Listens to operational new nodes and delegates add/remove/update/barrier to {@link SyncReactor}.
+ * Listens to operational changes and starts reconciliation through {@link SyncReactor} when necessary.
  */
 public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node> {
+
     private static final Logger LOG = LoggerFactory.getLogger(SimplifiedOperationalListener.class);
     public static final String DATE_AND_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
-
     private final SyncReactor reactor;
     private final FlowCapableNodeSnapshotDao operationalSnapshot;
     private final FlowCapableNodeDao configDao;
@@ -64,23 +65,17 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
     }
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Node>> modifications) {
-        LOG.trace("Operational changes: {}", modifications.size());
+    public void onDataTreeChanged(final Collection<DataTreeModification<Node>> modifications) {
         super.onDataTreeChanged(modifications);
     }
 
     /**
-     * This method behaves like this:
-     * <ul>
-     * <li>If node is added to operational store then reconciliation.</li>
-     * <li>Node is deleted from operational cache is removed.</li>
-     * <li>Skip this event otherwise.</li>
-     * </ul>
-     *
+     * Update cache, register for device masterhip when device connected and start reconciliation if device
+     * is registered and actual modification is consistent.Skip the event otherwise.
      * @throws InterruptedException from syncup
      */
     protected Optional<ListenableFuture<Boolean>> processNodeModification(
-            DataTreeModification<Node> modification) throws InterruptedException {
+            final DataTreeModification<Node> modification) throws InterruptedException {
         final NodeId nodeId = ModificationUtil.nodeId(modification);
         updateCache(modification);
 
@@ -88,7 +83,7 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
             deviceMastershipManager.onDeviceConnected(nodeId);
         }
 
-        if (isRegisteredAndConsistentForReconcile(modification)) {
+        if (reconciliationRegistry.isRegistered(nodeId) && isConsistentForReconcile(modification)) {
             return reconciliation(modification);
         } else {
             return skipModification(modification);
@@ -97,10 +92,10 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
 
     /**
      * Remove if delete. Update only if FlowCapableNode Augmentation modified.
-     *
+     * Unregister for device mastership.
      * @param modification Datastore modification
      */
-    private void updateCache(DataTreeModification<Node> modification) {
+    private void updateCache(final DataTreeModification<Node> modification) {
         NodeId nodeId = ModificationUtil.nodeId(modification);
         if (isDelete(modification) || isDeleteLogical(modification)) {
             operationalSnapshot.updateCache(nodeId, Optional.absent());
@@ -110,88 +105,75 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
         operationalSnapshot.updateCache(nodeId, Optional.fromNullable(ModificationUtil.flowCapableNodeAfter(modification)));
     }
 
-    private Optional<ListenableFuture<Boolean>> skipModification(DataTreeModification<Node> modification) {
-        LOG.trace("Skipping operational modification: {}, before {}, after {}",
-                ModificationUtil.nodeIdValue(modification),
-                modification.getRootNode().getDataBefore() == null ? "null" : "nonnull",
-                modification.getRootNode().getDataAfter() == null ? "null" : "nonnull");
+    private Optional<ListenableFuture<Boolean>> skipModification(final DataTreeModification<Node> modification) {
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Skipping operational modification: {}, before {}, after {}",
+                    ModificationUtil.nodeIdValue(modification),
+                    modification.getRootNode().getDataBefore() == null ? "null" : "nonnull",
+                    modification.getRootNode().getDataAfter() == null ? "null" : "nonnull");
+        }
         return Optional.absent();
     }
 
     /**
      * ModificationType.DELETE.
      */
-    private boolean isDelete(DataTreeModification<Node> modification) {
-        if (ModificationType.DELETE == modification.getRootNode().getModificationType()) {
-            LOG.trace("Delete {} (physical)", ModificationUtil.nodeIdValue(modification));
-            return true;
-        }
-
-        return false;
+    private boolean isDelete(final DataTreeModification<Node> modification) {
+        return ModificationType.DELETE == modification.getRootNode().getModificationType();
     }
 
     /**
      * All connectors disappeared from operational store (logical delete).
      */
-    private boolean isDeleteLogical(DataTreeModification<Node> modification) {
+    private boolean isDeleteLogical(final DataTreeModification<Node> modification) {
         final DataObjectModification<Node> rootNode = modification.getRootNode();
-        if (!safeConnectorsEmpty(rootNode.getDataBefore()) && safeConnectorsEmpty(rootNode.getDataAfter())) {
-            LOG.trace("Delete {} (logical)", ModificationUtil.nodeIdValue(modification));
-            return true;
-        }
+        return !safeConnectorsEmpty(rootNode.getDataBefore()) && safeConnectorsEmpty(rootNode.getDataAfter());
 
-        return false;
     }
 
-    private boolean isAdd(DataTreeModification<Node> modification) {
+    private boolean isAdd(final DataTreeModification<Node> modification) {
         final DataObjectModification<Node> rootNode = modification.getRootNode();
-        final Node dataAfter = rootNode.getDataAfter();
-        final Node dataBefore = rootNode.getDataBefore();
-
-        final boolean nodeAppearedInOperational = dataBefore == null && dataAfter != null;
-        if (nodeAppearedInOperational) {
-            LOG.trace("Add {} (physical)", ModificationUtil.nodeIdValue(modification));
-        }
-        return nodeAppearedInOperational;
+        return rootNode.getDataBefore() == null && rootNode.getDataAfter() != null;
     }
 
     /**
      * All connectors appeared in operational store (logical add).
      */
-    private boolean isAddLogical(DataTreeModification<Node> modification) {
+    private boolean isAddLogical(final DataTreeModification<Node> modification) {
         final DataObjectModification<Node> rootNode = modification.getRootNode();
-        if (safeConnectorsEmpty(rootNode.getDataBefore()) && !safeConnectorsEmpty(rootNode.getDataAfter())) {
-            LOG.trace("Add {} (logical)", ModificationUtil.nodeIdValue(modification));
-            return true;
-        }
-
-        return false;
+        return safeConnectorsEmpty(rootNode.getDataBefore()) && !safeConnectorsEmpty(rootNode.getDataAfter());
     }
 
-    private Optional<ListenableFuture<Boolean>> reconciliation(DataTreeModification<Node> modification) throws InterruptedException {
+    /**
+     * If node is present in config DS diff between wanted configuration (in config DS) and actual device
+     * configuration (coming from operational) should be calculated and sent to device.
+     * @param modification from DS
+     * @return optional syncup future
+     * @throws InterruptedException from syncup
+     */
+    private Optional<ListenableFuture<Boolean>> reconciliation(final DataTreeModification<Node> modification)
+            throws InterruptedException {
         final NodeId nodeId = ModificationUtil.nodeId(modification);
         final Optional<FlowCapableNode> nodeConfiguration = configDao.loadByNodeId(nodeId);
 
         if (nodeConfiguration.isPresent()) {
-            LOG.debug("Reconciliation: {}", nodeId.getValue());
+            LOG.debug("Reconciliation {}: {}", dsType(), nodeId.getValue());
             final InstanceIdentifier<FlowCapableNode> nodePath = InstanceIdentifier.create(Nodes.class)
                     .child(Node.class, new NodeKey(ModificationUtil.nodeId(modification)))
                     .augmentation(FlowCapableNode.class);
-            final FlowCapableNode fcNode = ModificationUtil.flowCapableNodeAfter(modification);
-            return Optional.of(reactor.syncup(nodePath, nodeConfiguration.get(), fcNode, dsType()));
+            final FlowCapableNode fcOperationalNode = ModificationUtil.flowCapableNodeAfter(modification);
+            final SyncupEntry syncupEntry = new SyncupEntry(nodeConfiguration.get(), LogicalDatastoreType.CONFIGURATION,
+                                                            fcOperationalNode, dsType());
+            return Optional.of(reactor.syncup(nodePath, syncupEntry));
         } else {
             LOG.debug("Config not present for reconciliation: {}", nodeId.getValue());
+            reconciliationRegistry.unregisterIfRegistered(nodeId);
             return skipModification(modification);
         }
     }
 
-    private boolean isRegisteredAndConsistentForReconcile(DataTreeModification<Node> modification) {
+    private boolean isConsistentForReconcile(final DataTreeModification<Node> modification) {
         final NodeId nodeId = PathUtil.digNodeId(modification.getRootPath().getRootIdentifier());
-
-        if (!reconciliationRegistry.isRegistered(nodeId)) {
-            return false;
-        }
-
         final FlowCapableStatisticsGatheringStatus gatheringStatus = modification.getRootNode().getDataAfter()
                 .getAugmentation(FlowCapableStatisticsGatheringStatus.class);
 
@@ -221,19 +203,17 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
                 return true;
             }
         } catch (ParseException e) {
-            LOG.error("Timestamp parsing error {}", e);
+            LOG.warn("Timestamp parsing error {}", e);
         }
         LOG.debug("Fresh operational not present: {}", nodeId.getValue());
         return false;
     }
 
-    private static boolean safeConnectorsEmpty(Node node) {
+    private static boolean safeConnectorsEmpty(final Node node) {
         if (node == null) {
             return true;
         }
-
         final List<NodeConnector> nodeConnectors = node.getNodeConnector();
-
         return nodeConnectors == null || nodeConnectors.isEmpty();
     }
 
@@ -241,5 +221,4 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener<Node>
     public LogicalDatastoreType dsType() {
         return LogicalDatastoreType.OPERATIONAL;
     }
-    
 }