[MAGNOLIA-7115] Parsing of yaml fragment attempts to mutate immutable map Created: 21/Aug/17  Updated: 31/Jan/18  Resolved: 31/Jan/18

Status: Closed
Project: Magnolia
Component/s: yaml
Affects Version/s: 5.5.5
Fix Version/s: None

Type: Bug Priority: Neutral
Reporter: Mercedes Iruela Assignee: Robert Šiška
Resolution: Obsolete Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
relation
is related to MAGNOLIA-6664 Inheritance of registry definitions f... Closed
is related to MAGNOLIA-7060 Override properties in YAML include Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Sprint: Kromeriz 132
Story Points: 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)

Generated at Mon Feb 12 04:20:51 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.