From 08a8eebb292fe7400bef71bc31324f6c9fbe8fff Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 24 Jun 2019 11:21:26 +0200 Subject: [PATCH] ModuleInfoBackedContext cache 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 (cherry picked from commit 0a247c177f5e774e453328a24b231773f85581ca) --- .../adapter/test/AbstractSchemaAwareTest.java | 10 +++--- .../impl/ModuleInfoBackedContext.java | 31 +++++++++++++++++++ .../spec/reflect/BindingReflections.java | 5 ++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java index 8d01ed15c2..f327ae1a6a 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java @@ -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, SchemaContext>() { @Override public SchemaContext load(final Set 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()); } /** diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java index 9bf375f716..d12dcfe5bf 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java @@ -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 { + private static final LoadingCache, ModuleInfoBackedContext>> CONTEXT_CACHES = CacheBuilder.newBuilder() + .weakKeys().build(new CacheLoader, ModuleInfoBackedContext>>() { + @Override + public LoadingCache, ModuleInfoBackedContext> load( + final ClassLoadingStrategy strategy) { + return CacheBuilder.newBuilder().weakValues().build( + new CacheLoader, ModuleInfoBackedContext>() { + @Override + public ModuleInfoBackedContext load(final Set 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 infos) { + return CONTEXT_CACHES.getUnchecked(loadingStrategy).getUnchecked(infos); + } + public static ModuleInfoBackedContext create() { return new ModuleInfoBackedContext(getTCCLClassLoadingStrategy()); } diff --git a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java index 0a4bbfee85..546b6a4542 100644 --- a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java +++ b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java @@ -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 cacheModuleInfos(final ClassLoader loader) throws ExecutionException { - return MODULE_INFO_CACHE.get(loader); + public static ImmutableSet cacheModuleInfos(final ClassLoader loader) { + return MODULE_INFO_CACHE.getUnchecked(loader); } private static void collectYangModuleInfo(final YangModuleInfo moduleInfo, -- 2.36.6