Additional Enhancements to the Endpoint RPC Registration 39/17739/8
authorKhaldoon Al-zoubi <khalAlzoubi@gmail.com>
Fri, 3 Apr 2015 20:23:57 +0000 (16:23 -0400)
committerKeith Burns <alagalah@gmail.com>
Sat, 25 Apr 2015 18:57:37 +0000 (18:57 +0000)
1- Allowed RPC registration to have its own dedicated thread pool since
   its shared among multiple renderers.
2- Made renderers only return their augmentations to RPC registration
   without being involved in building endpoints (which only handled by
   the RPC registry itself).

Change-Id: I5075404f2137ee5cb6df5bd5479dd8138ee4bb5c
Signed-off-by: Khaldoon Al-zoubi <khalAlzoubi@gmail.com>
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/endpoint/EndpointRpcRegistry.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/endpoint/EpRendererAugmentation.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointManager.java
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManager.java

index e94f2f17975b6c9ade4df161e929383a7991a944..bef2c5c30f1036c2bcc9eda099feef0f996d56ad 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.groupbasedpolicy.endpoint;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -44,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.has.endpoint.group.conditions.EndpointGroupConditionKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -90,17 +92,21 @@ public class EndpointRpcRegistry implements EndpointService {
      *            NULL
      */
     public static void register(DataBroker dataProvider,
-            RpcProviderRegistry rpcRegistry, ScheduledExecutorService executor,
+            RpcProviderRegistry rpcRegistry,
             EpRendererAugmentation epRendererAugmentation) {
-        if (dataProvider == null || rpcRegistry == null || executor == null) {
+        if (dataProvider == null || rpcRegistry == null) {
             if (epRendererAugmentation != null) {
-                LOG.warn("Couldn't register class {} for endpoint RPC because of missing required info");
+                LOG.warn("Couldn't register class {} for endpoint RPC because of missing required info", epRendererAugmentation);
             }
             return;
         }
         if (endpointRpcRegistry == null) {
             synchronized (EndpointRpcRegistry.class) {
                 if (endpointRpcRegistry == null) {
+                    ScheduledExecutorService executor = Executors
+                            .newScheduledThreadPool(Math
+                                    .max(Runtime.getRuntime()
+                                            .availableProcessors() * 3, 10));
                     endpointRpcRegistry = new EndpointRpcRegistry(dataProvider,
                             rpcRegistry, executor);
                 }
@@ -131,12 +137,35 @@ public class EndpointRpcRegistry implements EndpointService {
                 if (registeredRenderers.isEmpty()
                         && endpointRpcRegistry != null) {
                     endpointRpcRegistry.rpcRegistration.close();
+                    endpointRpcRegistry.executor.shutdown();
                     endpointRpcRegistry = null;
                 }
             }
         }
     }
 
+    public static Class<?> getAugmentationContextType(
+            final Augmentation<?> augmentation) {
+        if (augmentation == null) {
+            return null;
+        }
+        final Class<?>[] augmentationInterfaces = augmentation.getClass()
+                .getInterfaces();
+        if (augmentationInterfaces.length == 1) {
+            return augmentationInterfaces[0];
+        }
+        /*
+         * if here, then the way YANG tools generate augmentation code has
+         * changed, hence augmentation classes are not implemented by single
+         * interface anymore. This is very unlikely to happen, but if it did, we
+         * need to know about it in order to update this method.
+         */
+        LOG.error(
+                "YANG Generated Code has Changed -- augmentation object {} is NOT implemented by one interface anymore",
+                augmentation);
+        return null;
+    }
+
     /**
      * Constructor
      *
@@ -195,7 +224,13 @@ public class EndpointRpcRegistry implements EndpointService {
         for (Entry<String, EpRendererAugmentation> entry : registeredRenderers
                 .entrySet()) {
             try {
-                entry.getValue().buildEndpointAugmentation(eb, input);
+                Augmentation<Endpoint> augmentation = entry.getValue()
+                        .buildEndpointAugmentation(input);
+                if (augmentation != null) {
+                    @SuppressWarnings("unchecked")
+                    Class<? extends Augmentation<Endpoint>> augmentationType = (Class<? extends Augmentation<Endpoint>>) getAugmentationContextType(augmentation);
+                    eb.addAugmentation(augmentationType, augmentation);
+                }
             } catch (Throwable t) {
                 LOG.warn("Endpoint Augmentation error while processing "
                         + entry.getKey() + ". Reason: ", t);
@@ -217,7 +252,13 @@ public class EndpointRpcRegistry implements EndpointService {
         for (Entry<String, EpRendererAugmentation> entry : registeredRenderers
                 .entrySet()) {
             try {
-                entry.getValue().buildEndpointL3Augmentation(eb, input);
+                Augmentation<EndpointL3> augmentation = entry.getValue()
+                        .buildEndpointL3Augmentation(input);
+                if (augmentation != null) {
+                    @SuppressWarnings("unchecked")
+                    Class<? extends Augmentation<EndpointL3>> augmentationType = (Class<? extends Augmentation<EndpointL3>>) getAugmentationContextType(augmentation);
+                    eb.addAugmentation(augmentationType, augmentation);
+                }
             } catch (Throwable t) {
                 LOG.warn("L3 endpoint Augmentation error while processing "
                         + entry.getKey() + ". Reason: ", t);
index 1562a85ecdf71f833b2bd11c6f82fb4495d55842..c76244e6bf8b43260cdb1f0c80331ebc15446e56 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Huawei Technologies and others.  All rights reserved.
+ * Copyright (c) 2015 Huawei Technologies 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,
@@ -9,17 +9,16 @@ package org.opendaylight.groupbasedpolicy.endpoint;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 
 public interface EpRendererAugmentation {
 
-    void buildEndpointAugmentation(EndpointBuilder eb,
-            RegisterEndpointInput input);
+    Augmentation<Endpoint> buildEndpointAugmentation(RegisterEndpointInput input);
 
-    void buildEndpointL3Augmentation(EndpointL3Builder eb,
-            RegisterEndpointInput input);
+    Augmentation<EndpointL3> buildEndpointL3Augmentation(RegisterEndpointInput input);
 
     void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb,
             RegisterL3PrefixEndpointInput input);
index ff399324a86f9e96dcb9a1baab45b1d1f98be9fa..0d718c4711ad8bbaaa9b4efb2961761ce80c93b3 100644 (file)
@@ -43,6 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig.LearningMode;
@@ -55,6 +56,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -119,7 +121,7 @@ public class EndpointManager implements AutoCloseable, DataChangeListener
             SwitchManager switchManager) {
         this.executor = executor;
         this.dataProvider = dataProvider;
-        EndpointRpcRegistry.register(dataProvider, rpcRegistry, executor, endpointRpcAug);
+        EndpointRpcRegistry.register(dataProvider, rpcRegistry, endpointRpcAug);
         if (dataProvider != null) {
             listenerReg = dataProvider
                     .registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
@@ -285,20 +287,19 @@ public class EndpointManager implements AutoCloseable, DataChangeListener
     private class OfEndpointAug implements EpRendererAugmentation {
 
         @Override
-        public void buildEndpointAugmentation(EndpointBuilder eb,
-                RegisterEndpointInput input) {
-            // In order to support both the port-name and the data-path
-            // information, allow
+        public Augmentation<Endpoint> buildEndpointAugmentation(RegisterEndpointInput input) {
+            // In order to support both the port-name and the data-path information, allow
             // an EP to register without the augmentations, and resolve later.
             OfOverlayContextBuilder ictx = checkAugmentation(input);
             if (ictx != null) {
-                eb.addAugmentation(OfOverlayContext.class, ictx.build());
+                return ictx.build();
             }
+            return null;
         }
 
         @Override
-        public void buildEndpointL3Augmentation(EndpointL3Builder eb,
-                RegisterEndpointInput input) {
+        public Augmentation<EndpointL3> buildEndpointL3Augmentation(RegisterEndpointInput input) {
+            return null;
         }
 
         @Override
index 47b6c60c4cd80bcde430c1ddcd03189b5180a854..fe5bf2ce3eaf7ad657f9e1807722c4349b593c74 100644 (file)
@@ -63,6 +63,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev140528.OpflexOverlayContextL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev140528.OpflexOverlayContextL3Builder;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -110,7 +111,7 @@ public class EndpointManager implements AutoCloseable, DataChangeListener, RpcBr
             OpflexConnectionService connectionService, MitLib opflexLibrary) {
         this.executor = executor;
         this.dataProvider = dataProvider;
-        EndpointRpcRegistry.register(dataProvider, rpcRegistry, executor, endpointRpcAug);
+        EndpointRpcRegistry.register(dataProvider, rpcRegistry, endpointRpcAug);
 
         if (dataProvider != null) {
             listenerReg = dataProvider.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, endpointsIid, this,
@@ -163,15 +164,19 @@ public class EndpointManager implements AutoCloseable, DataChangeListener, RpcBr
     private class OfEndpointAug implements EpRendererAugmentation {
 
         @Override
-        public void buildEndpointAugmentation(EndpointBuilder eb, RegisterEndpointInput input) {
+        public Augmentation<Endpoint> buildEndpointAugmentation(RegisterEndpointInput input) {
             OpflexOverlayContextInput ictx = input.getAugmentation(OpflexOverlayContextInput.class);
-            eb.addAugmentation(OpflexOverlayContext.class, new OpflexOverlayContextBuilder(ictx).build());
+            if (ictx != null)
+                return new OpflexOverlayContextBuilder(ictx).build();
+            return null;
         }
 
         @Override
-        public void buildEndpointL3Augmentation(EndpointL3Builder eb, RegisterEndpointInput input) {
+        public Augmentation<EndpointL3> buildEndpointL3Augmentation(RegisterEndpointInput input) {
             OpflexOverlayContextInput ictx = input.getAugmentation(OpflexOverlayContextInput.class);
-            eb.addAugmentation(OpflexOverlayContextL3.class, new OpflexOverlayContextL3Builder(ictx).build());
+            if (ictx != null)
+                return new OpflexOverlayContextL3Builder(ictx).build();
+            return null;
         }
 
         @Override