Controller initiated connections always connect to one manager 58/27458/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Fri, 25 Sep 2015 04:19:01 +0000 (09:49 +0530)
committerAnil Vishnoi <vishnoianil@gmail.com>
Fri, 25 Sep 2015 17:49:26 +0000 (17:49 +0000)
listening in ptcp: mode. In clustered mode, all the three controller
will connect to the device, and in case any of the connection will flip
that instance will remove OvsdbNode from operational data store because
it will see only one manager in manager list. But because switch is
listening in passive mode, there can be multiple connection to same manager.
To handle this scenario, this patch adds number_of_connection attribute
to OvsdbNodeAugmentation to maintain the number of active connection to
specific manager. In case of switch initiated connection this value is
going to be 1 for each manager, but in case switch listening in passive
mode, this value will represent active connections (extraced from
Manager tables status column n_connections attributes).

Change-Id: I910104a5109b5bed6af7786a7692c617bd4305b7
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
southbound/southbound-api/src/main/yang/ovsdb.yang
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbManagersRemovedCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbNodeRemoveCommand.java

index effd652c9003c978dd7eaafb2c619d3aab1b31f1..b828acc18055daf7fd192d840b29fe7be774b99a 100755 (executable)
@@ -470,7 +470,7 @@ module ovsdb {
                 type string;
             }
          }
-         
+
          list manager-entry {
             description "Node managers info";
             config false;
@@ -479,9 +479,12 @@ module ovsdb {
                 description "Uri that user set to connect to the controller";
                 type inet:uri;
             }
-            leaf is-connected {
+            leaf connected {
                 type boolean;
             }
+            leaf number_of_connections {
+                type uint32;
+            }
         }
      }
 
index 5e96678ba775bfcab1bad2b773c750106e1b9ed0..f0db949e8748b4fab43ea9c53b66531bfd3fb24d 100644 (file)
@@ -64,6 +64,7 @@ import com.google.common.collect.ImmutableBiMap;
 
 public class SouthboundMapper {
     private static final Logger LOG = LoggerFactory.getLogger(SouthboundMapper.class);
+    private static final String N_CONNECTIONS_STR = "n_connections";
 
     private static NodeId createNodeId(OvsdbConnectionInstance client) {
         NodeKey key = client.getInstanceIdentifier().firstKeyOf(Node.class, NodeKey.class);
@@ -435,10 +436,23 @@ public class SouthboundMapper {
                                             final Manager manager) {
 
         if (manager != null && manager.getTargetColumn() != null) {
+            long numberOfConnections = 0;
             final String targetString = (String)manager.getTargetColumn().getData();
+
+            final Map<String, String> statusAttributeMap = manager.getStatusColumn().getData();
+            if (statusAttributeMap.containsKey(N_CONNECTIONS_STR)) {
+                String numberOfConnectionValueStr = statusAttributeMap.get(N_CONNECTIONS_STR);
+                numberOfConnections = Integer.parseInt(numberOfConnectionValueStr);
+            } else {
+                final boolean isConnected = manager.getIsConnectedColumn().getData();
+                if (isConnected) {
+                    numberOfConnections = 1;
+                }
+            }
             managerEntries.add(new ManagerEntryBuilder()
                     .setTarget(new Uri(targetString))
-                    .setIsConnected(manager.getIsConnectedColumn().getData()).build());
+                    .setNumberOfConnections(numberOfConnections)
+                    .setConnected(manager.getIsConnectedColumn().getData()).build());
         }
     }
 
index 08b7757fe83497fff7c10f49e9d885a4218ae77f..42aff407d8ef24b8943911742c9eec526477f7f3 100644 (file)
@@ -35,12 +35,14 @@ public class OvsdbManagersRemovedCommand extends AbstractTransactionCommand {
     private Map<UUID, OpenVSwitch> oldOpenVSwitchRows;
     private Map<UUID, Manager> removedManagerRows;
     private Map<UUID, OpenVSwitch> updatedOpenVSwitchRows;
+    private Map<UUID, Manager> updatedManagerRows;
 
     public OvsdbManagersRemovedCommand(OvsdbConnectionInstance key,
             TableUpdates updates, DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
         updatedOpenVSwitchRows = TyperUtils.extractRowsUpdated(OpenVSwitch.class, getUpdates(), getDbSchema());
         oldOpenVSwitchRows = TyperUtils.extractRowsOld(OpenVSwitch.class, getUpdates(), getDbSchema());
+        updatedManagerRows = TyperUtils.extractRowsUpdated(Manager.class, getUpdates(), getDbSchema());
         removedManagerRows = TyperUtils.extractRowsRemoved(Manager.class,
                 getUpdates(), getDbSchema());
     }
@@ -75,13 +77,16 @@ public class OvsdbManagersRemovedCommand extends AbstractTransactionCommand {
                 if (openVSwitch.getManagerOptionsColumn() == null
                         || !openVSwitch.getManagerOptionsColumn().getData().contains(managerUuid)) {
                     Manager manager = removedManagerRows.get(managerUuid);
-                    if (manager != null && manager.getTargetColumn() != null) {
-                        InstanceIdentifier<ManagerEntry> iid = ovsdbNodeIid
-                                .augmentation(OvsdbNodeAugmentation.class)
-                                .child(ManagerEntry.class,
-                                        new ManagerEntryKey(
-                                                new Uri(manager.getTargetColumn().getData())));
-                        result.add(iid);
+                    if (!checkIfManagerPresentInUpdatedManagersList(manager)) {
+                        if (manager != null && manager.getTargetColumn() != null) {
+                            InstanceIdentifier<ManagerEntry> iid = ovsdbNodeIid
+                                    .augmentation(OvsdbNodeAugmentation.class)
+                                    .child(ManagerEntry.class,
+                                            new ManagerEntryKey(
+                                                    new Uri(manager.getTargetColumn().getData())));
+                            result.add(iid);
+                        }
+
                     }
                 }
             }
@@ -89,5 +94,14 @@ public class OvsdbManagersRemovedCommand extends AbstractTransactionCommand {
         return result;
     }
 
+    private boolean checkIfManagerPresentInUpdatedManagersList(Manager removedManager) {
+        for (Map.Entry<UUID, Manager> updatedManager : updatedManagerRows.entrySet()) {
+            if (updatedManager.getValue().getTargetColumn().getData()
+                    .equals(removedManager.getTargetColumn().getData())) {
+                return true;
+            }
+        }
+        return false;
+    }
 
 }
index 57154d8c6055d7472edd8b7cc9bda961975b48a5..66b8c0745f1cc96e195a868efd093c82e4baf592 100644 (file)
@@ -26,6 +26,8 @@ import com.google.common.util.concurrent.CheckedFuture;
 
 public class OvsdbNodeRemoveCommand extends AbstractTransactionCommand {
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbNodeRemoveCommand.class);
+    private static final long ONE_CONNECTED_MANAGER = 1;
+    private static final long ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE = 1;
 
     public OvsdbNodeRemoveCommand(OvsdbConnectionInstance key,TableUpdates updates,DatabaseSchema dbSchema) {
         super(key,updates,dbSchema);
@@ -67,16 +69,28 @@ public class OvsdbNodeRemoveCommand extends AbstractTransactionCommand {
     }
 
     private boolean checkIfOnlyConnectedManager(OvsdbNodeAugmentation ovsdbNodeAugmentation) {
+        ManagerEntry onlyConnectedManager = null;
         if (ovsdbNodeAugmentation != null) {
             int connectedManager = 0;
             for (ManagerEntry manager : ovsdbNodeAugmentation.getManagerEntry()) {
-                if (manager.isIsConnected()) {
+                if (manager.isConnected()) {
                     connectedManager++;
-                    if (connectedManager > 1) {
+                    if (connectedManager > ONE_CONNECTED_MANAGER) {
                         return false;
                     }
+                    onlyConnectedManager = manager;
                 }
             }
+            if (connectedManager == 0) {
+                return true;
+            }
+        }
+        /*When switch is listening in passive mode, this number represent number of active connection to the device
+        This is to handle the controller initiated connection scenario, where all the controller will connect, but
+        switch will have only one manager.
+        */
+        if (onlyConnectedManager.getNumberOfConnections().longValue() > ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE) {
+            return false;
         }
         return true;
     }