Cache YangModuleInfo type name 17/89017/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 18 Dec 2019 09:05:15 +0000 (10:05 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 10 Apr 2020 08:22:22 +0000 (10:22 +0200)
Analysis of a heap dump shows we are creating a number of instances
pointing to the same type for the purposes of having the QNAME constant.

As we have the context in which we are creating YangModuleInfo,
instantiate a primitive cache to de-duplicate these definitions.

JIRA: MDSAL-515
Change-Id: I9bb52d04627e91eac3adff672b06f6340cac157f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleContext.java

index 447ba7cb804a0a02e22bd449b7243de00ea5d440..768e22acf5dc67d6a48916b037755f30c34bb149 100644 (file)
@@ -455,8 +455,7 @@ abstract class AbstractTypeGenerator {
                 final GeneratedTypeBuilder builder = typeProvider.newGeneratedTypeBuilder(JavaTypeName.create(
                     packageNameForGeneratedType(context.modulePackageName(), action.getPath()),
                     BindingMapping.getClassName(qname)));
-                qnameConstant(builder, JavaTypeName.create(context.modulePackageName(),
-                    BindingMapping.MODULE_INFO_CLASS_NAME), qname.getLocalName());
+                qnameConstant(builder, context.moduleInfoType(), qname.getLocalName());
 
                 annotateDeprecatedIfNecessary(action, builder);
                 builder.addImplementsType(keyType != null ? keyedListAction(parent, keyType, input, output)
@@ -543,7 +542,7 @@ abstract class AbstractTypeGenerator {
     private Type createRpcContainer(final ModuleContext context, final String rpcName, final RpcDefinition rpc,
             final ContainerSchemaNode schema, final Type type) {
         processUsesAugments(schema, context, false);
-        final GeneratedTypeBuilder outType = addRawInterfaceDefinition(
+        final GeneratedTypeBuilder outType = addRawInterfaceDefinition(context,
             JavaTypeName.create(context.modulePackageName(), rpcName + BindingMapping.getClassName(schema.getQName())),
             schema);
         addImplementedInterfaceFromUses(schema, outType);
@@ -713,8 +712,7 @@ abstract class AbstractTypeGenerator {
         newType.setModuleName(module.getName());
         newType.setSchemaPath(identity.getPath());
 
-        qnameConstant(newType, JavaTypeName.create(context.modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME),
-            identity.getQName().getLocalName());
+        qnameConstant(newType, context.moduleInfoType(), identity.getQName().getLocalName());
 
         context.addIdentityType(identity, newType);
     }
@@ -1167,7 +1165,7 @@ abstract class AbstractTypeGenerator {
     private void choiceToGeneratedType(final ModuleContext context, final GeneratedTypeBuilder parent,
             final ChoiceSchemaNode choiceNode, final boolean inGrouping) {
         if (!choiceNode.isAddedByUses()) {
-            final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(
+            final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(context,
                 JavaTypeName.create(packageNameForGeneratedType(context.modulePackageName(), choiceNode.getPath()),
                 BindingMapping.getClassName(choiceNode.getQName())), choiceNode);
             choiceTypeBuilder.addImplementsType(choiceIn(parent));
@@ -1184,7 +1182,7 @@ abstract class AbstractTypeGenerator {
     private void opaqueToGeneratedType(final ModuleContext context, final GeneratedTypeBuilder parent,
             final DataSchemaNode anyNode) {
         if (!anyNode.isAddedByUses()) {
-            final GeneratedTypeBuilder anyxmlTypeBuilder = addRawInterfaceDefinition(
+            final GeneratedTypeBuilder anyxmlTypeBuilder = addRawInterfaceDefinition(context,
                 JavaTypeName.create(packageNameForGeneratedType(context.modulePackageName(), anyNode.getPath()),
                 BindingMapping.getClassName(anyNode.getQName())), anyNode);
             anyxmlTypeBuilder.addImplementsType(opaqueObject(anyxmlTypeBuilder)).addImplementsType(childOf(parent));
@@ -1696,7 +1694,7 @@ abstract class AbstractTypeGenerator {
             name = JavaTypeName.create(packageName, BindingMapping.getClassName(schemaNode.getQName()));
         }
 
-        final GeneratedTypeBuilder it = addRawInterfaceDefinition(name, schemaNode);
+        final GeneratedTypeBuilder it = addRawInterfaceDefinition(context, name, schemaNode);
         it.addImplementsType(baseInterface);
         if (!(schemaNode instanceof GroupingDefinition)) {
             it.addImplementsType(augmentable(it));
@@ -1727,7 +1725,8 @@ abstract class AbstractTypeGenerator {
      *             <li>if schemaNode name is null</li>
      *             </ul>
      */
-    private GeneratedTypeBuilder addRawInterfaceDefinition(final JavaTypeName identifier, final SchemaNode schemaNode) {
+    private GeneratedTypeBuilder addRawInterfaceDefinition(final ModuleContext context, final JavaTypeName identifier,
+            final SchemaNode schemaNode) {
         checkArgument(schemaNode != null, "Data Schema Node cannot be NULL.");
         checkArgument(schemaNode.getQName() != null, "QName for Data Schema Node cannot be NULL.");
         final String schemaNodeName = schemaNode.getQName().getLocalName();
@@ -1735,10 +1734,9 @@ abstract class AbstractTypeGenerator {
 
         // FIXME: Validation of name conflict
         final GeneratedTypeBuilder newType = typeProvider.newGeneratedTypeBuilder(identifier);
-        final Module module = findParentModule(schemaContext, schemaNode);
-        qnameConstant(newType, JavaTypeName.create(BindingMapping.getRootPackageName(module.getQNameModule()),
-            BindingMapping.MODULE_INFO_CLASS_NAME), schemaNode.getQName().getLocalName());
+        qnameConstant(newType, context.moduleInfoType(), schemaNode.getQName().getLocalName());
 
+        final Module module = context.module();
         addCodegenInformation(newType, module, schemaNode);
         newType.setSchemaPath(schemaNode.getPath());
         newType.setModuleName(module.getName());
index 617189b9ce9c8af3b694ad5add045c5a57050bd5..9b323e512b619eed454cc7fe0d2be53d728e0908 100644 (file)
@@ -75,6 +75,7 @@ public final class ModuleContext implements Mutable {
     private final Map<JavaTypeName, SchemaNode> nameMapping = new HashMap<>();
 
     private GeneratedTypeBuilder moduleNode;
+    private JavaTypeName moduleInfoType;
     private String modulePackageName;
 
     ModuleContext(final Module module) {
@@ -85,7 +86,7 @@ public final class ModuleContext implements Mutable {
         return module;
     }
 
-    String modulePackageName() {
+    @NonNull String modulePackageName() {
         String ret = modulePackageName;
         if (ret == null) {
             modulePackageName = ret = BindingMapping.getRootPackageName(module.getQNameModule());
@@ -93,6 +94,14 @@ public final class ModuleContext implements Mutable {
         return ret;
     }
 
+    @NonNull JavaTypeName moduleInfoType() {
+        JavaTypeName ret = moduleInfoType;
+        if (ret == null) {
+            moduleInfoType = ret = JavaTypeName.create(modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME);
+        }
+        return ret;
+    }
+
     List<Type> getGeneratedTypes() {
         List<Type> result = new ArrayList<>();