ModuleInfoBackedContext cache 07/84407/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 24 Jun 2019 09:21:26 +0000 (11:21 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 13 Sep 2019 15:49:09 +0000 (17:49 +0200)
ModuleInfoBackedContext can be effectively cached based on
the set of class loading strategy and infos that go into it. This
patch adds such a cache.

JIRA: MDSAL-418
Change-Id: Icbb7ac5270c76c374a6e839010090a002b0ab176
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 0a247c177f5e774e453328a24b231773f85581ca)

binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java

index 8d01ed15c253c1d63d7b38a4a0badca5c0a3d61e..f327ae1a6ab46570e8537ceb100549bedced0215 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
 import org.junit.Before;
+import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
@@ -23,9 +24,9 @@ public abstract class AbstractSchemaAwareTest {
             CacheBuilder.newBuilder().weakValues().build(new CacheLoader<Set<YangModuleInfo>, SchemaContext>() {
                 @Override
                 public SchemaContext load(final Set<YangModuleInfo> key) {
-                    final ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create();
-                    moduleContext.addModuleInfos(key);
-                    return moduleContext.tryToCreateSchemaContext().get();
+                    return ModuleInfoBackedContext.cacheContext(
+                        GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), ImmutableSet.copyOf(key))
+                            .tryToCreateSchemaContext().get();
                 }
             });
 
@@ -39,8 +40,7 @@ public abstract class AbstractSchemaAwareTest {
     }
 
     protected SchemaContext getSchemaContext() throws Exception {
-        // ImmutableSet guarantees non-null
-        return SCHEMA_CONTEXT_CACHE.getUnchecked(ImmutableSet.copyOf(getModuleInfos()));
+        return SCHEMA_CONTEXT_CACHE.getUnchecked(getModuleInfos());
     }
 
     /**
index 9bf375f7162161a1f6667e26bf20e63488ac7f48..d12dcfe5bfe95b7ad726e378d97732e929e50b25 100644 (file)
@@ -7,11 +7,17 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl;
 
+import com.google.common.annotations.Beta;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.lang.ref.WeakReference;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
@@ -36,12 +42,37 @@ import org.slf4j.LoggerFactory;
 public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
         implements ModuleInfoRegistry, SchemaContextProvider, SchemaSourceProvider<YangTextSchemaSource> {
 
+    private static final LoadingCache<ClassLoadingStrategy,
+        LoadingCache<ImmutableSet<YangModuleInfo>, ModuleInfoBackedContext>> CONTEXT_CACHES = CacheBuilder.newBuilder()
+            .weakKeys().build(new CacheLoader<ClassLoadingStrategy,
+                LoadingCache<ImmutableSet<YangModuleInfo>, ModuleInfoBackedContext>>() {
+                    @Override
+                    public LoadingCache<ImmutableSet<YangModuleInfo>, ModuleInfoBackedContext> load(
+                            final ClassLoadingStrategy strategy) {
+                        return CacheBuilder.newBuilder().weakValues().build(
+                            new CacheLoader<Set<YangModuleInfo>, ModuleInfoBackedContext>() {
+                                @Override
+                                public ModuleInfoBackedContext load(final Set<YangModuleInfo> key) {
+                                    final ModuleInfoBackedContext context = ModuleInfoBackedContext.create(strategy);
+                                    context.addModuleInfos(key);
+                                    return context;
+                                }
+                            });
+                    }
+            });
+
     private final YangTextSchemaContextResolver ctxResolver = YangTextSchemaContextResolver.create("binding-context");
 
     private ModuleInfoBackedContext(final ClassLoadingStrategy loadingStrategy) {
         this.backingLoadingStrategy = loadingStrategy;
     }
 
+    @Beta
+    public static ModuleInfoBackedContext cacheContext(final ClassLoadingStrategy loadingStrategy,
+            final ImmutableSet<YangModuleInfo> infos) {
+        return CONTEXT_CACHES.getUnchecked(loadingStrategy).getUnchecked(infos);
+    }
+
     public static ModuleInfoBackedContext create() {
         return new ModuleInfoBackedContext(getTCCLClassLoadingStrategy());
     }
index 0a4bbfee858af5fbbff8a03c12806a65d5222950..546b6a4542858c887251571497242170f0565647 100644 (file)
@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.Set;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -374,8 +373,8 @@ public final class BindingReflections {
      * @return Set of {@link YangModuleInfo} available for supplied classloader.
      */
     @Beta
-    public static ImmutableSet<YangModuleInfo> cacheModuleInfos(final ClassLoader loader) throws ExecutionException {
-        return MODULE_INFO_CACHE.get(loader);
+    public static ImmutableSet<YangModuleInfo> cacheModuleInfos(final ClassLoader loader) {
+        return MODULE_INFO_CACHE.getUnchecked(loader);
     }
 
     private static void collectYangModuleInfo(final YangModuleInfo moduleInfo,