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

Parsing of yaml fragment attempts to mutate immutable map

XMLWordPrintable

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

      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)
      

        Acceptance criteria

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

                Created:
                Updated:
                Resolved:

                  Bug DoR
                  Task DoD