Uploaded image for project: 'Magnolia'
  1. Magnolia
  2. MAGNOLIA-7115

Parsing of yaml fragment attempts to mutate immutable map

    XMLWordPrintable

Details

    • Bug
    • Resolution: Obsolete
    • Neutral
    • None
    • 5.5.5
    • yaml
    • None
    • Kromeriz 132
    • 3

    Description

      If there is a parsing error, it causes the yaml parser to stop working entirely, until the node is restarted. Just redeploying corrected/new yaml is insufficient to get a node to work again, and on startup no yaml in any light module that would be processed after the failing one will get processed at all, which is rather fragile and will show up in the definitions app as unrelated broken definitions where some parts of a definition are available to the resources loader, while other includes aren't available in the resource loader, despite being available on the filesystem, due to the yaml parser crashing completely.

      How to reproduce

      Imagine that you have a light-module(my-module) that define an app(my-app), and you include a file to be included into my-app definition (/my-module/my-app/common-options.yaml):

      - name: internalLink
        label: Internal link
      - name: externalLink
        label: External link
      - name: productLink
        label: Product link
      

      It throwns an exception:

      2017-08-15 17:23:31,680 | ERROR | localhost-startStop-1 | info.magnolia.module.ModuleManagerImpl |  | Can't start module ui-framework
      java.lang.UnsupportedOperationException
              at com.google.common.collect.ImmutableMap.put(ImmutableMap.java:326)
              at info.magnolia.config.source.yaml.YamlDefinitionProvider.resolve(YamlDefinitionProvider.java:188)
              at info.magnolia.config.source.yaml.YamlDefinitionProvider.getDelegate(YamlDefinitionProvider.java:120)
              at info.magnolia.config.registry.AbstractDefinitionProviderWrapper.getMetadata(AbstractDefinitionProviderWrapper.java:56)
              at info.magnolia.config.registry.RegistryMap.asStringKey(RegistryMap.java:147)
              at info.magnolia.config.registry.RegistryMap.put(RegistryMap.java:94)
              at info.magnolia.config.registry.AbstractRegistry.register(AbstractRegistry.java:98)
              at info.magnolia.ui.api.app.registry.AppDescriptorRegistry.register(AppDescriptorRegistry.java:86)
              at info.magnolia.config.source.yaml.YamlConfigurationSource.loadAndRegister(YamlConfigurationSource.java:101)
              at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource$LoadAndRegisterFunction.doWith(AbstractFileResourceConfigurationSource.java:253)
              at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource$LoadAndRegisterFunction.doWith(AbstractFileResourceConfigurationSource.java:249)
              at info.magnolia.resourceloader.util.VoidFunction.apply(VoidFunction.java:49)
              at info.magnolia.resourceloader.util.VoidFunction.apply(VoidFunction.java:46)
              at info.magnolia.resourceloader.util.PredicatedResourceVisitor.visitFile(PredicatedResourceVisitor.java:120)
              at info.magnolia.resourceloader.util.ResourceTreeWalker.traverse(ResourceTreeWalker.java:61)
              at info.magnolia.resourceloader.util.ResourceTreeWalker.traverse(ResourceTreeWalker.java:57)
              at info.magnolia.resourceloader.util.ResourceTreeWalker.traverse(ResourceTreeWalker.java:57)
              at info.magnolia.resourceloader.util.ResourceTreeWalker.traverse(ResourceTreeWalker.java:57)
              at info.magnolia.resourceloader.util.ResourceTreeWalker.traverse(ResourceTreeWalker.java:57)
              at info.magnolia.resourceloader.AbstractResourceOrigin.traverseWith(AbstractResourceOrigin.java:80)
              at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.start(AbstractFileResourceConfigurationSource.java:115)
              at info.magnolia.config.source.yaml.YamlConfigurationSourceBuilder.bindTo(YamlConfigurationSourceBuilder.java:96)
              at info.magnolia.config.source.yaml.YamlConfigurationSourceBuilder.bindWithDefaults(YamlConfigurationSourceBuilder.java:103)
              at info.magnolia.ui.framework.UiFrameworkModule.start(UiFrameworkModule.java:81)
              at info.magnolia.module.ModuleManagerImpl.startModule(ModuleManagerImpl.java:436)
              at info.magnolia.module.ModuleManagerImpl.startModules(ModuleManagerImpl.java:371)
              at info.magnolia.module.ui.ModuleManagerNullUI.onStartup(ModuleManagerNullUI.java:74)
              at info.magnolia.cms.beans.config.ConfigLoader.load(ConfigLoader.java:145)
              at info.magnolia.init.MagnoliaServletContextListener$1.doExec(MagnoliaServletContextListener.java:259)
              at info.magnolia.context.MgnlContext$VoidOp.exec(MgnlContext.java:429)
              at info.magnolia.context.MgnlContext$VoidOp.exec(MgnlContext.java:426)
              at info.magnolia.context.MgnlContext.doInSystemContext(MgnlContext.java:400)
              at info.magnolia.init.MagnoliaServletContextListener.startServer(MagnoliaServletContextListener.java:256)
              at info.magnolia.init.MagnoliaServletContextListener.contextInitialized(MagnoliaServletContextListener.java:182)
              at info.magnolia.init.MagnoliaServletContextListener.contextInitialized(MagnoliaServletContextListener.java:128)
              at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727)
              at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189)
              at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
              at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
              at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
              at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
              at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:596)
              at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1805)
              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
              at java.util.concurrent.FutureTask.run(FutureTask.java:266)
              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
              at java.lang.Thread.run(Thread.java:745)
      

      Checklists

        Acceptance criteria

        Attachments

          Issue Links

            Activity

              People

                rsiska Robert Šiška
                miruela Mercedes Iruela
                Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved:

                  Checklists

                    Bug DoR
                    Task DoD