[MAGNOLIA-8605] NullPointerExceptions NPEs when starting Magnolia 6.3 in development mode Created: 02/Nov/22  Updated: 30/May/23  Resolved: 30/May/23

Status: Closed
Project: Magnolia
Component/s: configuration, resource-loader, yaml
Affects Version/s: 6.3.0
Fix Version/s: 6.3.0

Type: Bug Priority: Major
Reporter: Janek Valgma Assignee: Michael Duerig
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Using demo from https://nexus.magnolia-cms.com/content/groups/public/info/magnolia/bundle/magnolia-community-demo-webapp/6.3-SNAPSHOT/ on Windows 10


Attachments: Text File DevelopmentModeClasspathFile.patch     Text File magnolia-error.log    
Issue Links:
Relates
relates to MAGNOLIA-6612 DevelopmentModeClasspathFile should u... Accepted
causality
caused by MAGNOLIA-8440 Replace Reflections library with Clas... Closed
duplicate
Template:
Acceptance criteria:
Empty
Task DoD:
[X]* Doc/release notes changes? Comment present?
[X]* Downstream builds green?
[X]* Solution information and context easily available?
[X]* Tests
[X]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:
Work Started:

 Description   

Steps to reproduce

  1. Navigate to magnolia-6.3-SNAPSHOT\apache-tomcat-9.0.64\bin and run with magnolia_control.bat start
  2. In http://localhost:8080/ install required packages
  3. After everything is installed and Magnolia started, close it
  4. Change property magnolia.develop from 'false' to 'true' in magnolia-6.3-SNAPSHOT\apache-tomcat-9.0.64\webapps\magnoliaAuthor\WEB-INF\config\default\magnolia.properties
  5. Run Magnolia again as described in step 1.

Actual results

ERROR info.magnolia.config.source.yaml.YamlConfigurationSource 02.11.2022 14:45:24 -- 1 severe problems have been encountered:
ERROR info.magnolia.config.source.yaml.YamlConfigurationSource 02.11.2022 14:45:24 -- 
Severity type:   SEVERE 
Title:           /: [Definition resolution] - Parsing configuration data from [/ui-admincentral/fieldTypes/timeZone.yaml] failed 
Problem details: Failed to parse YAML file:
Null pointer
java.lang.NullPointerException: null
ERROR info.magnolia.config.source.yaml.YamlConfigurationSource 02.11.2022 14:45:24 -- 1 severe problems have been encountered:
ERROR info.magnolia.config.source.yaml.YamlConfigurationSource 02.11.2022 14:45:24 -- 
Severity type:   SEVERE 
Title:           /: [Definition resolution] - Parsing configuration data from [/ui-framework/fieldTypes/basicUpload.yaml] failed 
Problem details: Failed to parse YAML file:
I o: Resource is already open -- cannot open it again without first calling close()
java.io.IOException: Resource is already open -- cannot open it again without first calling close()
    at io.github.classgraph.ClasspathElementZip$1.open(ClasspathElementZip.java:386) ~[classgraph-4.8.149.jar:4.8.149]
    at info.magnolia.resourceloader.classpath.service.impl.devmode.DevelopmentModeClasspathFile.openStream(DevelopmentModeClasspathFile.java:80) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.classpath.ClasspathResourceOrigin.doOpenStream(ClasspathResourceOrigin.java:152) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.classpath.ClasspathResourceOrigin.doOpenStream(ClasspathResourceOrigin.java:67) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.AbstractResourceOrigin.openStream(AbstractResourceOrigin.java:190) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.AbstractResourceOrigin.openReader(AbstractResourceOrigin.java:203) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.AbstractResource.openReader(AbstractResource.java:109) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.layered.LayeredResourceOrigin.openReader(LayeredResourceOrigin.java:204) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.layered.LayeredResourceOrigin.openReader(LayeredResourceOrigin.java:72) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.resourceloader.AbstractResource.openReader(AbstractResource.java:109) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.YamlReader.doReadWithDependencies(YamlReader.java:119) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.YamlReader.readWithDependencies(YamlReader.java:100) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.YamlReader.readWithDependencies(YamlReader.java:96) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.YamlDefinitionProvider.getYamlConversionResult(YamlDefinitionProvider.java:85) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.AbstractYamlDefinitionProvider.resolve(AbstractYamlDefinitionProvider.java:198) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.AbstractYamlDefinitionProvider.getDelegate(AbstractYamlDefinitionProvider.java:133) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.registry.AbstractDefinitionProviderWrapper.getMetadata(AbstractDefinitionProviderWrapper.java:56) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.registry.RegistryMap.asStringKey(RegistryMap.java:184) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.registry.RegistryMap.put(RegistryMap.java:98) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.register(AbstractFileResourceConfigurationSource.java:190) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.YamlConfigurationSource.loadAndRegister(YamlConfigurationSource.java:115) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.lambda$start$2(AbstractFileResourceConfigurationSource.java:138) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    ...
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) ~[?:?]
    at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.start(AbstractFileResourceConfigurationSource.java:136) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at java.util.ArrayList.forEach(ArrayList.java:1541) ~[?:?]
    at info.magnolia.config.source.composite.CompositeConfigurationSource.start(CompositeConfigurationSource.java:77) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.decoration.DecoratingConfigurationSource.start(DecoratingConfigurationSource.java:87) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.decoration.YamlDecorationConfigurationSource.start(YamlDecorationConfigurationSource.java:112) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.config.source.ConfigurationSourceFactory$DefaultConfigSourcesBuilder.build(ConfigurationSourceFactory.java:245) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
    at info.magnolia.ui.UiFrameworkJcrModule.lambda$start$1(UiFrameworkJcrModule.java:128) ~[magnolia-ui-framework-jcr-6.3-SNAPSHOT.jar:?]
    at java.util.Optional.ifPresent(Optional.java:183) ~[?:?]
    at info.magnolia.ui.UiFrameworkJcrModule.start(UiFrameworkJcrModule.java:122) ~[magnolia-ui-framework-jcr-6.3-SNAPSHOT.jar:?]
    ...
    at info.magnolia.init.MagnoliaServletContextListener.contextInitialized(MagnoliaServletContextListener.java:136) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
    ...

Development notes

This is happening because start() method in AbstractFileResourceConfigurationSource is being called twice, from DecoratingConfigurationSource.start() and ConfigurationSourceFactory$DefaultConfigSourcesBuilder.build(). When in production mode (magnolia.develop=false) this does not cause issues because actual opening of yaml resources does not result in opening jars, they are read internally. When in development mode, yaml files are read with classgraph in ClasspathElementZip, on the second run of the start() method a different Resource instance is created for the same path/file so the isOpen() check is false in ClasspathElementZip -> newResource -> open() and the error appears when it starts reading the same file that has not been previously closed.



 Comments   
Comment by Mercedes Iruela [ 03/Nov/22 ]

Hello Janek,

Magnolia 6.3 is in development at the moment, this brach has not been released yet so you are just seeing a SNAPSHOT. I am closing this ticket then, FYI, last available Magnolia release is 6.2.25.

Best regards,
Mercedes

Comment by Janek Valgma [ 09/Nov/22 ]

Workaround described in liked issue MAGNOLIA-6612 and my comment there fixes this problem.

Comment by Mikaël Geljić [ 24/May/23 ]

Update: bug is still present, encountering a slightly different trace nowadays:

2023-05-24 09:39:01,797 ERROR agnolia.config.source.yaml.YamlConfigurationSource: 1 severe problems have been encountered:
2023-05-24 09:39:01,797 ERROR agnolia.config.source.yaml.YamlConfigurationSource: 
Severity type:   SEVERE 
Title:           /: [Definition resolution] - Parsing configuration data from [/periscope-core/config.yaml] failed 
Problem details: Failed to parse YAML file:
Null pointer: Cannot invoke "java.nio.channels.FileChannel.read(java.nio.ByteBuffer, long)" because "this.fileChannel" is null
java.lang.NullPointerException: Cannot invoke "java.nio.channels.FileChannel.read(java.nio.ByteBuffer, long)" because "this.fileChannel" is null
	at nonapi.io.github.classgraph.fileslice.reader.RandomAccessFileChannelReader.read(RandomAccessFileChannelReader.java:97) ~[classgraph-4.8.157.jar:4.8.157]
	at nonapi.io.github.classgraph.fileslice.reader.RandomAccessFileChannelReader.readInt(RandomAccessFileChannelReader.java:160) ~[classgraph-4.8.157.jar:4.8.157]
	at nonapi.io.github.classgraph.fastzipfilereader.FastZipEntry.getSlice(FastZipEntry.java:194) ~[classgraph-4.8.157.jar:4.8.157]
	at io.github.classgraph.ClasspathElementZip$1.open(ClasspathElementZip.java:390) ~[classgraph-4.8.157.jar:4.8.157]
	at info.magnolia.resourceloader.classpath.service.impl.devmode.DevelopmentModeClasspathFile.openStream(DevelopmentModeClasspathFile.java:80) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.classpath.ClasspathResourceOrigin.doOpenStream(ClasspathResourceOrigin.java:152) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.classpath.ClasspathResourceOrigin.doOpenStream(ClasspathResourceOrigin.java:67) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.AbstractResourceOrigin.openStream(AbstractResourceOrigin.java:190) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.AbstractResourceOrigin.openReader(AbstractResourceOrigin.java:203) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.AbstractResource.openReader(AbstractResource.java:109) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.layered.LayeredResourceOrigin.openReader(LayeredResourceOrigin.java:204) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.layered.LayeredResourceOrigin.openReader(LayeredResourceOrigin.java:72) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.resourceloader.AbstractResource.openReader(AbstractResource.java:109) ~[magnolia-resource-loader-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.YamlReader.doReadWithDependencies(YamlReader.java:119) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.YamlReader.readWithDependencies(YamlReader.java:100) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.YamlReader.readWithDependencies(YamlReader.java:96) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.YamlDefinitionProvider.getYamlConversionResult(YamlDefinitionProvider.java:85) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.AbstractYamlDefinitionProvider.resolve(AbstractYamlDefinitionProvider.java:198) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.AbstractYamlDefinitionProvider.getDelegate(AbstractYamlDefinitionProvider.java:133) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.registry.AbstractDefinitionProviderWrapper.getMetadata(AbstractDefinitionProviderWrapper.java:56) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.registry.RegistryMap.asStringKey(RegistryMap.java:184) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.registry.RegistryMap.put(RegistryMap.java:98) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.register(AbstractFileResourceConfigurationSource.java:190) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.YamlConfigurationSource.loadAndRegister(YamlConfigurationSource.java:115) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.lambda$start$2(AbstractFileResourceConfigurationSource.java:138) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[?:?]
	at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource.start(AbstractFileResourceConfigurationSource.java:136) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at java.util.Arrays$ArrayList.forEach(Arrays.java:4204) ~[?:?]
	at info.magnolia.config.source.composite.CompositeConfigurationSource.start(CompositeConfigurationSource.java:77) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.decoration.DecoratingConfigurationSource.start(DecoratingConfigurationSource.java:87) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.decoration.YamlDecorationConfigurationSource.start(YamlDecorationConfigurationSource.java:112) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.source.decoration.YamlDecorationConfigurationSource.<init>(YamlDecorationConfigurationSource.java:107) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.module.ModuleConfigurationSourceFactory$2$1.<init>(ModuleConfigurationSourceFactory.java:111) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.module.ModuleConfigurationSourceFactory$2.build(ModuleConfigurationSourceFactory.java:111) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.module.ModuleConfigurationRegistry.start(ModuleConfigurationRegistry.java:94) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.config.module.ModuleConfigurationRegistry.lambda$new$0(ModuleConfigurationRegistry.java:79) ~[magnolia-configuration-6.3-SNAPSHOT.jar:?]
	at info.magnolia.module.PopulateModulesEvent.dispatch(PopulateModulesEvent.java:46) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.module.PopulateModulesEvent.dispatch(PopulateModulesEvent.java:42) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.event.SimpleEventBus.fireEvent(SimpleEventBus.java:75) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.module.ModuleManagerImpl.startModules(ModuleManagerImpl.java:355) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.module.ui.ModuleManagerWebUI.onStartup(ModuleManagerWebUI.java:78) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.cms.beans.config.ConfigLoader.load(ConfigLoader.java:147) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.init.MagnoliaServletContextListener$1.doExec(MagnoliaServletContextListener.java:284) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.context.MgnlContext$VoidOp.exec(MgnlContext.java:407) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.context.MgnlContext$VoidOp.exec(MgnlContext.java:404) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.context.MgnlContext.doInSystemContext(MgnlContext.java:378) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.init.MagnoliaServletContextListener.startServer(MagnoliaServletContextListener.java:281) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.init.MagnoliaServletContextListener.contextInitialized(MagnoliaServletContextListener.java:195) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
	at info.magnolia.init.MagnoliaServletContextListener.contextInitialized(MagnoliaServletContextListener.java:136) ~[magnolia-core-6.3-SNAPSHOT.jar:?]
Comment by Mikaël Geljić [ 25/May/23 ]

I just attached the quick'n dirty patch that does the trick for me; it would be worth abstracting away the "URL resolution cascade" between jarResource, resourceUrl, classpathLocation, since similar logic is used or would need to be on other methods.

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