BUG 8280: TerminationPoint reconciliation fails 01/55901/1
authorVishal Thapar <vishal.thapar@ericsson.com>
Mon, 24 Apr 2017 12:25:39 +0000 (17:55 +0530)
committerVishal Thapar <vishal.thapar@ericsson.com>
Mon, 24 Apr 2017 12:25:39 +0000 (17:55 +0530)
TerminationPointConfigReconciliationTask is incorrectly setting up
BridgeOperationalState to be empty. This ends up triggering reconciliation
even for ports that are already present in switch.

When we try to add ports that are already present we get constraint
violation in transaction and as per OVSDB RFC it causes all operations in
that transaction to abort. This means that the ports that actually needede
to be reconciled never get added back.

Change-Id: I48819f46b6419c15a8ba85541b06551b950a3055
Signed-off-by: Vishal Thapar <vishal.thapar@ericsson.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/BridgeOperationalState.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/ovsdb/transact/TerminationPointCreateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/reconciliation/configuration/TerminationPointConfigReconciliationTask.java

index 95dc7021abd9c79b36aa5858d44935d8c57c7ffe..1bd0cd02df89e182ca976a75353b4a9abc37e5b2 100644 (file)
@@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
 
 public class BridgeOperationalState {
     private static final Logger LOG = LoggerFactory.getLogger(BridgeOperationalState.class);
-    private Map<InstanceIdentifier<Node>, Node> operationalNodes = new HashMap<>();
+    private final Map<InstanceIdentifier<Node>, Node> operationalNodes = new HashMap<>();
 
     public BridgeOperationalState(DataBroker db, AsyncDataChangeEvent<InstanceIdentifier<?>,
             DataObject> changes) {
@@ -103,6 +103,8 @@ public class BridgeOperationalState {
                         }
                     }
                 }
+            } else {
+                LOG.debug("TerminationPoints or Operational BridgeNode missing for {}", iid);
             }
         }
         return Optional.absent();
index 2014a1db14f88a232497e42398dac9e6413f176b..7386770890694ec9fbafd68905b0e5df264abee4 100644 (file)
@@ -107,8 +107,7 @@ public class TerminationPointCreateCommand implements TransactCommand {
                 createPort(terminationPoint, port, interfaceUuid);
                 transaction.add(op.insert(port).withId(portUuid));
                 LOG.info("Created Termination Point : {} with Uuid : {}",
-                        terminationPoint.getName(),
-                        terminationPoint.getPortUuid());
+                        terminationPoint.getName(),portUuid);
                 //Configure bridge with the above port details
                 Bridge bridge = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Bridge.class);
                 if (getBridge(entry.getKey(), nodes) != null) {
index 9d53869f983ecabf371e2040990ba45e93d538d1..56098345ecdfbb2016e360dd0f61140c83ae48f7 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.ovsdb.southbound.reconciliation.configuration;
 
-import com.google.common.base.Optional;
-
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -24,7 +22,6 @@ import org.opendaylight.ovsdb.southbound.ovsdb.transact.TerminationPointCreateCo
 import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager;
 import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationTask;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
@@ -59,13 +56,6 @@ public class TerminationPointConfigReconciliationTask extends ReconciliationTask
         LOG.debug("Reconcile Termination Point Configuration for node {}", ((Node) configData).getNodeId());
         final Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
         changes.putAll(SouthboundMapper.extractTerminationPointConfigurationChanges((Node) configData));
-        BridgeOperationalState bridgeOperationalState =
-            new BridgeOperationalState(reconciliationManager.getDb(), Collections.EMPTY_LIST) {
-                @Override
-                public Optional<TerminationPoint> getBridgeTerminationPoint(InstanceIdentifier<?> iid) {
-                    return Optional.absent();
-                }
-            };
 
         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvents = new AsyncDataChangeEvent() {
             @Override
@@ -100,7 +90,8 @@ public class TerminationPointConfigReconciliationTask extends ReconciliationTask
         };
 
         connectionInstance.transact(new TerminationPointCreateCommand(),
-                bridgeOperationalState, changeEvents, instanceIdentifierCodec);
+                        new BridgeOperationalState(reconciliationManager.getDb(), changeEvents),
+                        changeEvents, instanceIdentifierCodec);
 
         return true;
     }