Richard Eckart de Castilho created RAT-553:
----------------------------------------------
Summary: NPE with multi-threaded builds
Key: RAT-553
URL: https://issues.apache.org/jira/browse/RAT-553
Project: Apache RAT
Issue Type: Task
Affects Versions: 0.18
Reporter: Richard Eckart de Castilho
Hitting this intermittently with `mvn -T <N>` on a multi-module project that
has `.gitignore` files:
{noformat}
NullPointerException: Cannot invoke
"...AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at
AbstractFileProcessorBuilder.build(AbstractFileProcessorBuilder.java:133){noformat}
I've also seen what looked like a ConcurrentModificationExcepton in the past
from the same area — possibly the same bug.
StandardCollection caches one GitIgnoreBuilder instance and hands it to every
caller. AbstractFileProcessorBuilder.levelBuilders is an instance field that
build() mutates and clear()s. With parallel module builds, two threads call
build() on the same singleton and trample each other's map — get(0) returns
null, or the keySet iteration in createMatcherSetList blows up with a
ConcurrentModificationExcepton.
The mojo declares threadSafe = true, so Maven happily runs it in parallel — but
the shared mutable state in the builders means that promise isn't actually true.
(Btw. `HgIgnoreBuilder` seems to have a mutable `state` field that may have the
same issue.)
I'm seeing this with 0.18. I think 0.16 still worked ok.
Workaround that worked for me — turn off SCM ignore parsing so the racy code
path isn't hit:
{noformat}
<configuration>
<parseSCMIgnoresAsExcludes>false</parseSCMIgnoresAsExcludes>
</configuration>{noformat}
----
{noformat}
Error: Failed to execute goal org.apache.rat:apache-rat-plugin:0.18:check
(default) on project inception-workload: Execution default of goal
org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null -> [Help
1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal
org.apache.rat:apache-rat-plugin:0.18:check (default) on project
inception-workload: Execution default of goal
org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:333)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default
of goal org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo
(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583)
Caused by: java.lang.NullPointerException: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at
org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder.build
(AbstractFileProcessorBuilder.java:133)
at
org.apache.rat.config.exclusion.ExclusionProcessor.lambda$extractFileProcessors$0
(ExclusionProcessor.java:232)
at org.apache.commons.collections4.Transformer.apply (Transformer.java:47)
at org.apache.commons.collections4.iterators.TransformIterator.transform
(TransformIterator.java:138)
at org.apache.commons.collections4.iterators.TransformIterator.next
(TransformIterator.java:102)
at java.util.Iterator.forEachRemaining (Iterator.java:133)
at org.apache.rat.utils.ExtendedIterator.forEachRemaining
(ExtendedIterator.java:130)
at org.apache.rat.config.exclusion.ExclusionProcessor.extractFileProcessors
(ExclusionProcessor.java:234)
at org.apache.rat.config.exclusion.ExclusionProcessor.getNameMatcher
(ExclusionProcessor.java:208)
at org.apache.rat.ReportConfiguration.getDocumentExcluder
(ReportConfiguration.java:434)
at org.apache.rat.mp.AbstractRatMojo.getConfiguration
(AbstractRatMojo.java:546)
at org.apache.rat.mp.RatCheckMojo.getConfiguration (RatCheckMojo.java:166)
at org.apache.rat.mp.RatCheckMojo.execute (RatCheckMojo.java:205)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo
(DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583)
Error: Failed to execute goal org.apache.rat:apache-rat-plugin:0.18:check
(default) on project inception-io-tei: Execution default of goal
org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null -> [Help
1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal
org.apache.rat:apache-rat-plugin:0.18:check (default) on project
inception-io-tei: Execution default of goal
org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:333)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default
of goal org.apache.rat:apache-rat-plugin:0.18:check failed: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo
(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583)
Caused by: java.lang.NullPointerException: Cannot invoke
"org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder$LevelBuilder.asMatcherSet()"
because the return value of "java.util.SortedMap.get(Object)" is null
at
org.apache.rat.config.exclusion.fileProcessors.AbstractFileProcessorBuilder.build
(AbstractFileProcessorBuilder.java:133)
at
org.apache.rat.config.exclusion.ExclusionProcessor.lambda$extractFileProcessors$0
(ExclusionProcessor.java:232)
at org.apache.commons.collections4.Transformer.apply (Transformer.java:47)
at org.apache.commons.collections4.iterators.TransformIterator.transform
(TransformIterator.java:138)
at org.apache.commons.collections4.iterators.TransformIterator.next
(TransformIterator.java:102)
at java.util.Iterator.forEachRemaining (Iterator.java:133)
at org.apache.rat.utils.ExtendedIterator.forEachRemaining
(ExtendedIterator.java:130)
at org.apache.rat.config.exclusion.ExclusionProcessor.extractFileProcessors
(ExclusionProcessor.java:234)
at org.apache.rat.config.exclusion.ExclusionProcessor.getNameMatcher
(ExclusionProcessor.java:208)
at org.apache.rat.ReportConfiguration.getDocumentExcluder
(ReportConfiguration.java:434)
at org.apache.rat.mp.AbstractRatMojo.getConfiguration
(AbstractRatMojo.java:546)
at org.apache.rat.mp.RatCheckMojo.getConfiguration (RatCheckMojo.java:166)
at org.apache.rat.mp.RatCheckMojo.execute (RatCheckMojo.java:205)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo
(DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2
(MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute
(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000
(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run
(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute
(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute
(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject
(LifecycleModuleBuilder.java:105)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:193)
at
org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call
(MultiThreadedBuilder.java:180)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
at java.util.concurrent.FutureTask.run (FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:642)
at java.lang.Thread.run (Thread.java:1583){noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)