X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fforwardingrulesmanager%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwardingrulesmanager%2Finternal%2FForwardingRulesManager.java;h=c839d15f10c81308909a03f804e5587ec6ef612c;hb=19a34ba9057d07bfbcfb491786ffeb91f5b2c318;hp=4e6818c3062511b01c9b8f73d3f5fa610c73134d;hpb=90eed73c5c4dbd851fcb7665b20f6ac04dfa9dfd;p=controller.git diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java index 4e6818c306..c839d15f10 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java @@ -39,6 +39,7 @@ import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.connectionmanager.ConnectionLocality; import org.opendaylight.controller.connectionmanager.IConnectionManager; import org.opendaylight.controller.forwardingrulesmanager.FlowConfig; import org.opendaylight.controller.forwardingrulesmanager.FlowEntry; @@ -201,59 +202,6 @@ public class ForwardingRulesManager implements private ConcurrentMap workMonitor = new ConcurrentHashMap(); - /* - * Create an executor pool to create the distributionOrder, this is a stop - * gap solution caused by an issue with non-transactional caches in the - * implementation we use, being currently worked on. It has been noticed in - * fact that when non-transactional caches are being used sometime the key - * are no distributed to all the nodes properly. To workaround the issue - * transactional caches are being used, but there was a reason for using - * non-transactional caches to start with, in fact we needed to be able in - * the context of a northbound transaction to program the FRM entries - * irrespective of the fact that transaction would commit or no else we - * would not be able to achieve the entry programming and implement the - * scheme for recovery from network element failures. Bottom line, now in - * order to make sure an update on a transactional cache goes out while in a - * transaction that need to be initiated by a different thread. - */ - private ExecutorService executor; - - class DistributeOrderCallable implements Callable> { - private FlowEntryInstall e; - private FlowEntryInstall u; - private UpdateType t; - DistributeOrderCallable(FlowEntryInstall e, FlowEntryInstall u, UpdateType t) { - this.e = e; - this.u = u; - this.t = t; - } - - @Override - public Future call() throws Exception { - if (e == null || t == null) { - logsync.error("Unexpected null Entry up update type"); - return null; - } - // Create the work order and distribute it - FlowEntryDistributionOrder fe = - new FlowEntryDistributionOrder(e, t, clusterContainerService.getMyAddress()); - // First create the monitor job - FlowEntryDistributionOrderFutureTask ret = new FlowEntryDistributionOrderFutureTask(fe); - logsync.trace("Node {} not local so sending fe {}", e.getNode(), fe); - workMonitor.put(fe, ret); - if (t.equals(UpdateType.CHANGED)) { - // Then distribute the work - workOrder.put(fe, u); - } else { - // Then distribute the work - workOrder.put(fe, e); - } - logsync.trace("WorkOrder requested"); - // Now create an Handle to monitor the execution of the operation - return ret; - } - } - /** * @param e * Entry being installed/updated/removed @@ -273,25 +221,27 @@ public class ForwardingRulesManager implements } Node n = e.getNode(); - if (!connectionManager.isLocal(n)) { - Callable> worker = new DistributeOrderCallable(e, u, t); - if (worker != null) { - Future> workerRes = this.executor.submit(worker); - try { - return workerRes.get(); - } catch (InterruptedException e1) { - // we where interrupted, not a big deal. - return null; - } catch (ExecutionException e1) { - logsync.error( - "We got an execution exception {} we cannot much, so returning we don't have nothing to wait for", - e); - return null; - } + if (connectionManager.getLocalityStatus(n) == ConnectionLocality.NOT_LOCAL) { + // Create the work order and distribute it + FlowEntryDistributionOrder fe = + new FlowEntryDistributionOrder(e, t, clusterContainerService.getMyAddress()); + // First create the monitor job + FlowEntryDistributionOrderFutureTask ret = new FlowEntryDistributionOrderFutureTask(fe); + logsync.trace("Node {} not local so sending fe {}", n, fe); + workMonitor.put(fe, ret); + if (t.equals(UpdateType.CHANGED)) { + // Then distribute the work + workOrder.put(fe, u); + } else { + // Then distribute the work + workOrder.put(fe, e); } + logsync.trace("WorkOrder requested"); + // Now create an Handle to monitor the execution of the operation + return ret; } - logsync.trace("LOCAL Node {} so processing Entry:{} UpdateType:{}", n, e, t); + logsync.trace("Node {} could be local. so processing Entry:{} UpdateType:{}", n, e, t); return null; } @@ -1406,10 +1356,10 @@ public class ForwardingRulesManager implements EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache(WORKSTATUSCACHE, - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); clusterContainerService.createCache(WORKORDERCACHE, - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); } catch (CacheConfigException cce) { log.error("CacheConfigException"); @@ -2111,6 +2061,7 @@ public class ForwardingRulesManager implements * pratice to have in it's context operations that can take time, * hence moving off to a different thread for async processing. */ + private ExecutorService executor; @Override public void modeChangeNotify(final Node node, final boolean proactive) { Callable modeChangeCallable = new Callable() { @@ -3109,7 +3060,7 @@ public class ForwardingRulesManager implements return; } Node n = fei.getNode(); - if (connectionManager.isLocal(n)) { + if (connectionManager.getLocalityStatus(n) == ConnectionLocality.LOCAL) { logsync.trace("workOrder for fe {} processed locally", fe); // I'm the controller in charge for the request, queue it for // processing