[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: |
|
||||||||||||
| 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)
|