package org.opendaylight.controller.clustering.test.internal;
+import java.net.InetAddress;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
ci.println(cacheName + " is no longer being monitored for updates");
}
+ public void _myController(CommandInterpreter ci) {
+ if (this.icluster == null) {
+ ci.println("\nNo Clustering services available");
+ return;
+ }
+ ci.println("This Controller : " +icluster.getMyAddress().getHostAddress());
+ }
+
+ public void _getClusterNodes(CommandInterpreter ci) {
+ if (this.icluster == null) {
+ ci.println("\nNo Clustering services available");
+ return;
+ }
+ for (InetAddress address : icluster.getClusteredControllers()) {
+ ci.println("\t"+address.getHostAddress());
+ }
+ }
+
public void _listcaches(CommandInterpreter ci) {
if (this.icluster == null) {
ci.println("\nNo Clustering services available");
}
}
- @SuppressWarnings("deprecation") //TODO: remove call to deprecated amIStandby
- public void _getRole(CommandInterpreter ci) {
- if (this.icluster == null) {
- ci.println("\nNo Clustering services available");
- return;
- }
- String role = "Active";
- if (this.icluster.amIStandby()) {
- role = "Standby";
- }
- ci.println("My role is: " + role);
- }
-
- @SuppressWarnings("deprecation") //TODO: remove call to deprecated getActiveAddres
- public void _getActive(CommandInterpreter ci) {
- if (this.icluster == null) {
- ci.println("\nNo Clustering services available");
- return;
- }
- ci.println("Current active address is "
- + this.icluster.getActiveAddress());
- }
-
@SuppressWarnings("deprecation") //TODO: remove use of deprecated listenRoleChange
public void _listenActive(CommandInterpreter ci) {
if (this.icluster == null) {
help.append("\tunlistenActive - UNListen to Active updates\n");
help.append("\tdestroy - Destroy a cache\n");
help.append("\tcreate - Create a cache\n");
- help.append("\tgetRole - Tell if active or standby\n");
- help.append("\tgetActive - Report the IP address of Active\n");
- help
- .append("\tputComplex - Fill a more complex data structure\n");
- help
- .append("\tupdateComplex - Update the value of a more complex data structure\n");
- help
- .append("\tgetLogLevel - Get the loglevel for the logger specified\n");
- help
- .append("\tsetLogLevel - Set the loglevel for the logger specified\n");
+ help.append("\tmyController - Print this controller's Cluster identifier\n");
+ help.append("\tgetClusterNodes - Print all the controllers that make this cluster\n");
+ help.append("\tputComplex - Fill a more complex data structure\n");
+ help.append("\tupdateComplex - Update the value of a more complex data structure\n");
+ help.append("\tgetLogLevel - Get the loglevel for the logger specified\n");
+ help.append("\tsetLogLevel - Set the loglevel for the logger specified\n");
return help.toString();
}
}
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import javax.transaction.SystemException;
+
import org.opendaylight.controller.clustering.services.CacheConfigException;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
}
}
+ boolean retry = false;
for (InetAddress c : toRemove) {
log.debug("Removing Controller : {} from the Connections table", c);
for (Iterator<Node> nodeIterator = nodeConnections.keySet().iterator();nodeIterator.hasNext();) {
Set <InetAddress> oldControllers = nodeConnections.get(node);
Set <InetAddress> newControllers = new HashSet<InetAddress>(oldControllers);
if (newControllers.remove(c)) {
- boolean replaced = false;
try {
- replaced = nodeConnections.replace(node, oldControllers, newControllers);
+ clusterServices.tbegin();
+ if (!nodeConnections.replace(node, oldControllers, newControllers)) {
+ log.debug("Replace Failed for {} ", node.toString());
+ retry = true;
+ clusterServices.trollback();
+ break;
+ } else {
+ clusterServices.tcommit();
+ }
} catch (Exception e) {
- log.debug("Replace exception : ", e);
- replaced = false;
- }
- if (!replaced) {
+ log.error("Exception in replacing nodeConnections ", e);
+ retry = false;
try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- }
- handleClusterViewChanged();
+ clusterServices.trollback();
+ } catch (Exception e1) {}
+ break;
}
}
}
}
+ if (retry) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ handleClusterViewChanged();
+ }
}
public Set<Node> getNodes(InetAddress controller) {
if (oldControllers != null && oldControllers.contains(controller)) {
Set<InetAddress> newControllers = new HashSet<InetAddress>(oldControllers);
if (newControllers.remove(controller)) {
- if (newControllers.size() > 0) {
- boolean replaced = false;
- try {
- replaced = nodeConnections.replace(node, oldControllers, newControllers);
- } catch (Exception e) {
- log.debug("Replace exception : ", e);
- replaced = false;
- }
- if (!replaced) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
+ try {
+ clusterServices.tbegin();
+ if (newControllers.size() > 0) {
+ if (!nodeConnections.replace(node, oldControllers, newControllers)) {
+ clusterServices.trollback();
+ try {
+ Thread.sleep(100);
+ } catch ( InterruptedException e) {}
+ return removeNodeFromController(node, controller);
}
- return removeNodeFromController(node, controller);
+ } else {
+ nodeConnections.remove(node);
}
- } else {
- nodeConnections.remove(node);
+ clusterServices.tcommit();
+ } catch (Exception e) {
+ log.error("Excepion in removing Controller from a Node", e);
+ try {
+ clusterServices.trollback();
+ } catch (Exception e1) {
+ log.error("Error Rolling back the node Connections Changes ", e);
+ }
+ return new Status(StatusCode.INTERNALERROR);
}
+
}
}
return new Status(StatusCode.SUCCESS);
}
newControllers.add(controller);
- if (nodeConnections.putIfAbsent(node, newControllers) != null) {
- log.debug("PutIfAbsent failed {} to {}", controller.getHostAddress(), node.toString());
- /*
- * This check is needed again to take care of the case where some schemes
- * would not allow nodes to be connected to multiple controllers.
- * Hence, if putIfAbsent fails, that means, some other controller is competing
- * with this controller to take hold of a Node.
- */
- if (isConnectionAllowed(node)) {
- log.debug("Trying to replace old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(),
- controller.getHostAddress(), node.toString());
- if (!nodeConnections.replace(node, oldControllers, newControllers)) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
+ try {
+ clusterServices.tbegin();
+ if (nodeConnections.putIfAbsent(node, newControllers) != null) {
+ log.debug("PutIfAbsent failed {} to {}", controller.getHostAddress(), node.toString());
+ /*
+ * This check is needed again to take care of the case where some schemes
+ * would not allow nodes to be connected to multiple controllers.
+ * Hence, if putIfAbsent fails, that means, some other controller is competing
+ * with this controller to take hold of a Node.
+ */
+ if (isConnectionAllowed(node)) {
+ if (!nodeConnections.replace(node, oldControllers, newControllers)) {
+ clusterServices.trollback();
+ try {
+ Thread.sleep(100);
+ } catch ( InterruptedException e) {}
+ log.debug("Replace failed... old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(),
+ controller.getHostAddress(), node.toString());
+ return putNodeToController(node, controller);
+ } else {
+ log.debug("Replace successful old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(),
+ controller.getHostAddress(), node.toString());
}
- log.debug("Replace failed... old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(),
- controller.getHostAddress(), node.toString());
- return putNodeToController(node, controller);
} else {
- log.debug("Replace successful old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(),
- controller.getHostAddress(), node.toString());
+ clusterServices.trollback();
+ return new Status(StatusCode.CONFLICT);
}
} else {
- return new Status(StatusCode.CONFLICT);
+ log.debug("Added {} to {}", controller.getHostAddress(), node.toString());
}
- } else {
- log.debug("Added {} to {}", controller.getHostAddress(), node.toString());
+ clusterServices.tcommit();
+ } catch (Exception e) {
+ log.error("Excepion in adding Controller to a Node", e);
+ try {
+ clusterServices.trollback();
+ } catch (Exception e1) {
+ log.error("Error Rolling back the node Connections Changes ", e);
+ }
+ return new Status(StatusCode.INTERNALERROR);
}
return new Status(StatusCode.SUCCESS);
}
}
try {
- clusterServices.createCache("connectionmanager."+name+".nodeconnections", EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
+ clusterServices.createCache("connectionmanager."+name+".nodeconnections", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL));
} catch (CacheExistException cee) {
log.error("\nCache already exists - destroy and recreate if needed");
} catch (CacheConfigException cce) {