From 75b981ae4337a9849073e5ea4bbeb6901b67bd83 Mon Sep 17 00:00:00 2001 From: Anil Vishnoi Date: Fri, 25 Sep 2015 09:49:01 +0530 Subject: [PATCH] Controller initiated connections always connect to one manager 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 --- .../southbound-api/src/main/yang/ovsdb.yang | 7 +++-- .../ovsdb/southbound/SouthboundMapper.java | 16 ++++++++++- .../md/OvsdbManagersRemovedCommand.java | 28 ++++++++++++++----- .../md/OvsdbNodeRemoveCommand.java | 18 ++++++++++-- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/southbound/southbound-api/src/main/yang/ovsdb.yang b/southbound/southbound-api/src/main/yang/ovsdb.yang index effd652c9..b828acc18 100755 --- a/southbound/southbound-api/src/main/yang/ovsdb.yang +++ b/southbound/southbound-api/src/main/yang/ovsdb.yang @@ -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; + } } } diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java index 5e96678ba..f0db949e8 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundMapper.java @@ -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 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()); } } diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbManagersRemovedCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbManagersRemovedCommand.java index 08b7757fe..42aff407d 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbManagersRemovedCommand.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbManagersRemovedCommand.java @@ -35,12 +35,14 @@ public class OvsdbManagersRemovedCommand extends AbstractTransactionCommand { private Map oldOpenVSwitchRows; private Map removedManagerRows; private Map updatedOpenVSwitchRows; + private Map 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 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 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 updatedManager : updatedManagerRows.entrySet()) { + if (updatedManager.getValue().getTargetColumn().getData() + .equals(removedManager.getTargetColumn().getData())) { + return true; + } + } + return false; + } } diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbNodeRemoveCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbNodeRemoveCommand.java index 57154d8c6..66b8c0745 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbNodeRemoveCommand.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbNodeRemoveCommand.java @@ -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; } -- 2.36.6