We’re facing an issue on our CI servers while building a fairly large multi-project (around 500 projects), with parallel and configuration-on-demand both enabled. Sometimes, Gradle just hangs while running, and the moment when it hangs seems to be random… I couldn’t find any pattern
You can have a look at the thread dump here: https://gist.github.com/Ithildir/8cc456669907a3527875. These parts are especially interesting:
"Task worker" prio=10 tid=0x096ef400 nid=0x7e14 runnable [0x073fd000] java.lang.Thread.State: RUNNABLE at java.util.WeakHashMap.get(WeakHashMap.java:471) at org.apache.ivy.core.module.id.ModuleId.intern(ModuleId.java:63) at org.apache.ivy.core.module.id.ModuleId.newInstance(ModuleId.java:48) at org.gradle.api.internal.artifacts.ivyservice.IvyUtil.createModuleId(IvyUtil.java:79) - locked <0x358744e8> (a java.lang.Object) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader$PomDependencyMgtElement.getExcludedModules(PomReader.java:529)
"Task worker Thread 2" prio=10 tid=0x096efc00 nid=0x7e15 waiting for monitor entry [0x071fd000] java.lang.Thread.State: BLOCKED (on object monitor) at org.gradle.api.internal.artifacts.ivyservice.IvyUtil.createModuleId(IvyUtil.java:78) - waiting to lock <0x358744e8> (a java.lang.Object) at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.DefaultExcludeRuleConverter.createExcludeRule(DefaultExcludeRuleConverter.java:30)
It really looks like GRADLE-3027, which is marked as resolved. If I understand, you centralized all the calls to Ivy’s
IvyUtil, so you could synchronize them and avoid the
WeakHashMap bug. However, this line in GradlePomModuleDescriptorBuilder does not use
IvyUtil. I did some debugging, and it seems that
ModuleId.intern (which is not thread-safe) is only called from
IvyUtil or from this Gradle class.
What do you think about it? For now, we’ll try to replace that call with
IvyUtil and use a patched version.