Ivy
  1. Ivy
  2. IVY-1362

Memory leak and infinite loop in ModuleId.java

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.2.0
    • Fix Version/s: 2.3.0-RC2
    • Component/s: Core
    • Labels:
      None
    • Environment:

      Eclipse / IvyDE

      Description

      ModuleId tries save memory by interning objects. This ModuleId cache is not synchronized and when it is mutated from concurrent threads it is possible that the WeakHashMap will contain a loop. As described in the blog post: "A Beautiful Race Condition"

      The same issue and a memory leak was fixed in IVY-791.

      Stacktrace of a hanging thread
      java.lang.Thread.State: RUNNABLE
      	at java.util.WeakHashMap.get(Unknown Source)
      	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.apache.ivy.core.module.id.ModuleRevisionId.newInstance(ModuleRevisionId.java:100)
      	at org.apache.ivy.plugins.parser.m2.PomModuleDescriptorBuilder.addDependency(PomModuleDescriptorBuilder.java:285)
      	at org.apache.ivy.plugins.parser.m2.PomModuleDescriptorParser.parseDescriptor(PomModuleDescriptorParser.java:262)
      	at org.apache.ivy.plugins.parser.m2.PomModuleDescriptorParser.parseDescriptor(PomModuleDescriptorParser.java:108)
      	at org.apache.ivy.core.cache.DefaultRepositoryCacheManager$MyModuleDescriptorProvider.provideModule(DefaultRepositoryCacheManager.java:659)
      	at org.apache.ivy.core.cache.ModuleDescriptorMemoryCache.getStale(ModuleDescriptorMemoryCache.java:68)
      	at org.apache.ivy.core.cache.DefaultRepositoryCacheManager.getStaledMd(DefaultRepositoryCacheManager.java:676)
      	at org.apache.ivy.core.cache.DefaultRepositoryCacheManager.cacheModuleDescriptor(DefaultRepositoryCacheManager.java:993)
      	at org.apache.ivy.plugins.resolver.BasicResolver.parse(BasicResolver.java:546)
      	at org.apache.ivy.plugins.resolver.BasicResolver.getDependency(BasicResolver.java:266)
      	at org.apache.ivy.plugins.resolver.IBiblioResolver.getDependency(IBiblioResolver.java:503)
      	at org.apache.ivy.plugins.resolver.ChainResolver.getDependency(ChainResolver.java:104)
      	at org.apache.ivy.plugins.resolver.ChainResolver.getDependency(ChainResolver.java:104)
      	at org.apache.ivy.plugins.resolver.ChainResolver.getDependency(ChainResolver.java:104)
      	at org.apache.ivy.core.resolve.IvyNode.loadData(IvyNode.java:169)
      	at org.apache.ivy.core.resolve.VisitNode.loadData(VisitNode.java:287)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:696)
      	at org.apache.ivy.core.resolve.ResolveEngine.doFetchDependencies(ResolveEngine.java:781)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:704)
      	at org.apache.ivy.core.resolve.ResolveEngine.doFetchDependencies(ResolveEngine.java:769)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:704)
      	at org.apache.ivy.core.resolve.ResolveEngine.doFetchDependencies(ResolveEngine.java:769)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:704)
      	at org.apache.ivy.core.resolve.ResolveEngine.doFetchDependencies(ResolveEngine.java:781)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:704)
      	at org.apache.ivy.core.resolve.ResolveEngine.doFetchDependencies(ResolveEngine.java:781)
      	at org.apache.ivy.core.resolve.ResolveEngine.fetchDependencies(ResolveEngine.java:704)
      	at org.apache.ivy.core.resolve.ResolveEngine.getDependencies(ResolveEngine.java:576)
      	at org.apache.ivy.core.resolve.ResolveEngine.resolve(ResolveEngine.java:237)
      	at org.apache.ivy.Ivy.resolve(Ivy.java:512)
      	at org.apache.ivyde.eclipse.cpcontainer.IvyResolveJobThread.resolve(IvyResolveJobThread.java:224)
      	at org.apache.ivyde.eclipse.cpcontainer.IvyResolveJobThread.run(IvyResolveJobThread.java:127)
      

        Activity

        Hide
        Maarten Coene added a comment -

        Fixed in the next release. Thanks for reporting.

        Show
        Maarten Coene added a comment - Fixed in the next release. Thanks for reporting.
        Hide
        Marcell Hegedus added a comment -

        Memory leak is not fixed. Please check the diff of IVY-791. This should be the same patch.

        Show
        Marcell Hegedus added a comment - Memory leak is not fixed. Please check the diff of IVY-791 . This should be the same patch.
        Hide
        Maarten Coene added a comment - - edited

        Thanks for verifying, I did my homework again and hopefully it is ok now?

        Show
        Maarten Coene added a comment - - edited Thanks for verifying, I did my homework again and hopefully it is ok now?
        Hide
        Marcell Hegedus added a comment -

        Verified again and it is ok. Thank you!

        Show
        Marcell Hegedus added a comment - Verified again and it is ok. Thank you!

          People

          • Assignee:
            Maarten Coene
            Reporter:
            Marcell Hegedus
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development