X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconnectionmanager%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconnectionmanager%2Fscheme%2FAbstractScheme.java;h=1d0e86ecd167b3191290c269bb861cc08d9e05a7;hp=6b20909a877ce81de268c585c5e309be9fe7e2cf;hb=6fd408a04fe4a3611843e2246ece6d7c34b76903;hpb=24eac152c37605ee8aec5ec44b812bc2314795cc diff --git a/opendaylight/connectionmanager/implementation/src/main/java/org/opendaylight/controller/connectionmanager/scheme/AbstractScheme.java b/opendaylight/connectionmanager/implementation/src/main/java/org/opendaylight/controller/connectionmanager/scheme/AbstractScheme.java index 6b20909a87..1d0e86ecd1 100644 --- a/opendaylight/connectionmanager/implementation/src/main/java/org/opendaylight/controller/connectionmanager/scheme/AbstractScheme.java +++ b/opendaylight/connectionmanager/implementation/src/main/java/org/opendaylight/controller/connectionmanager/scheme/AbstractScheme.java @@ -1,7 +1,15 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.controller.connectionmanager.scheme; import java.net.InetAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; @@ -10,13 +18,12 @@ import java.util.Set; 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; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.connectionmanager.ConnectionMgmtScheme; +import org.opendaylight.controller.sal.connection.ConnectionLocality; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.utils.Status; import org.opendaylight.controller.sal.utils.StatusCode; @@ -36,15 +43,18 @@ public abstract class AbstractScheme { */ protected ConcurrentMap > nodeConnections; protected abstract boolean isConnectionAllowedInternal(Node node); - private String name; + private final String name; + private final String nodeConnectionsCacheName; protected AbstractScheme(IClusterGlobalServices clusterServices, ConnectionMgmtScheme type) { this.clusterServices = clusterServices; - if (type != null) name = type.name(); - else name = "UNKNOWN"; + name = (type != null ? type.name() : "UNKNOWN"); + nodeConnectionsCacheName = "connectionmanager."+name+".nodeconnections"; if (clusterServices != null) { allocateCaches(); retrieveCaches(); + } else { + log.error("Couldn't retrieve caches for scheme %s. Clustering service unavailable", name); } } @@ -73,8 +83,8 @@ public abstract class AbstractScheme { return isConnectionAllowedInternal(node); } - @SuppressWarnings("deprecation") public void handleClusterViewChanged() { + log.debug("Handling Cluster View changed notification"); List controllers = clusterServices.getClusteredControllers(); ConcurrentMap > controllerNodesMap = getControllerToNodesMap(); List toRemove = new ArrayList(); @@ -103,8 +113,8 @@ public abstract class AbstractScheme { clusterServices.tcommit(); } } catch (Exception e) { - log.error("Exception in replacing nodeConnections ", e); - retry = false; + log.debug("Exception in replacing nodeConnections ", e); + retry = true; try { clusterServices.trollback(); } catch (Exception e1) {} @@ -115,35 +125,30 @@ public abstract class AbstractScheme { } if (retry) { try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } + Thread.sleep(1000); + } catch (InterruptedException e) {} handleClusterViewChanged(); } } public Set getNodes(InetAddress controller) { - if (nodeConnections == null) return null; ConcurrentMap > controllerNodesMap = getControllerToNodesMap(); return controllerNodesMap.get(controller); } - @SuppressWarnings("deprecation") public Set getNodes() { return getNodes(clusterServices.getMyAddress()); } public Set getControllers(Node node) { if (nodeConnections != null) return nodeConnections.get(node); - return null; + return Collections.emptySet(); } public ConcurrentMap> getNodeConnections() { return nodeConnections; } - @SuppressWarnings("deprecation") public boolean isLocal(Node node) { if (nodeConnections == null) return false; InetAddress myController = clusterServices.getMyAddress(); @@ -151,14 +156,22 @@ public abstract class AbstractScheme { return (controllers != null && controllers.contains(myController)); } - @SuppressWarnings("deprecation") + public ConnectionLocality getLocalityStatus(Node node) { + if (nodeConnections == null) return ConnectionLocality.NOT_CONNECTED; + Set controllers = nodeConnections.get(node); + if (controllers == null || controllers.size() == 0) return ConnectionLocality.NOT_CONNECTED; + InetAddress myController = clusterServices.getMyAddress(); + return controllers.contains(myController) ? ConnectionLocality.LOCAL: + ConnectionLocality.NOT_LOCAL; + } + public Status removeNode (Node node) { return removeNodeFromController(node, clusterServices.getMyAddress()); } protected Status removeNodeFromController (Node node, InetAddress controller) { if (node == null || controller == null) { - return new Status(StatusCode.BADREQUEST); + return new Status(StatusCode.BADREQUEST, "Invalid Node or Controller Address Specified."); } if (clusterServices == null || nodeConnections == null) { @@ -185,7 +198,7 @@ public abstract class AbstractScheme { } clusterServices.tcommit(); } catch (Exception e) { - log.error("Excepion in removing Controller from a Node", e); + log.error("Exception in removing Controller from a Node", e); try { clusterServices.trollback(); } catch (Exception e1) { @@ -206,7 +219,7 @@ public abstract class AbstractScheme { */ private Status putNodeToController (Node node, InetAddress controller) { if (clusterServices == null || nodeConnections == null) { - return new Status(StatusCode.SUCCESS); + return new Status(StatusCode.INTERNALERROR, "Cluster service unavailable, or node connections info missing."); } log.debug("Trying to Put {} to {}", controller.getHostAddress(), node.toString()); @@ -238,13 +251,12 @@ public abstract class AbstractScheme { * with this controller to take hold of a Node. */ if (isConnectionAllowed(node)) { - if (!nodeConnections.replace(node, oldControllers, newControllers)) { + if (oldControllers == null || !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()); + log.debug("Retrying ... {} with {}", controller.getHostAddress(), node.toString()); return putNodeToController(node, controller); } else { log.debug("Replace successful old={} with new={} for {} to {}", oldControllers.toString(), newControllers.toString(), @@ -272,9 +284,16 @@ public abstract class AbstractScheme { public Status addNode (Node node, InetAddress controller) { if (node == null || controller == null) { + if (node == null) { + log.warn("addNode: node is null"); + } else if (controller == null) { + log.error("Failed to add node {}. The controller address retrieved from clusterServices is null.", node); + } return new Status(StatusCode.BADREQUEST); } - if (isLocal(node)) return new Status(StatusCode.SUCCESS); + if (isLocal(node)) { + return new Status(StatusCode.SUCCESS); + } if (isConnectionAllowed(node)) { return putNodeToController(node, controller); } else { @@ -282,40 +301,38 @@ public abstract class AbstractScheme { } } - @SuppressWarnings("deprecation") public Status addNode (Node node) { return addNode(node, clusterServices.getMyAddress()); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCaches() { if (this.clusterServices == null) { - log.error("un-initialized clusterServices, can't retrieve cache"); + log.error("Un-initialized Cluster Services, can't retrieve caches for scheme: {}", name); return; } - nodeConnections = (ConcurrentMap>) clusterServices.getCache("connectionmanager."+name+".nodeconnections"); + nodeConnections = (ConcurrentMap>) clusterServices.getCache(nodeConnectionsCacheName); if (nodeConnections == null) { - log.error("\nFailed to get caches"); + log.error("\nFailed to get cache: {}", nodeConnectionsCacheName); } } - @SuppressWarnings("deprecation") private void allocateCaches() { if (this.clusterServices == null) { - log.error("un-initialized clusterServices, can't create cache"); + log.error("Un-initialized clusterServices, can't create cache"); return; } try { - clusterServices.createCache("connectionmanager."+name+".nodeconnections", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + clusterServices.createCache(nodeConnectionsCacheName, EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); } catch (CacheExistException cee) { - log.error("\nCache already exists - destroy and recreate if needed"); + log.debug("\nCache already exists: {}", nodeConnectionsCacheName); } catch (CacheConfigException cce) { log.error("\nCache configuration invalid - check cache mode"); } catch (Exception e) { - e.printStackTrace(); + log.error("An error occured",e); } } }