This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 209815 - IAE from GlobalPathRegistry.unregister; multiple ClassPathProviderImpl's created for one project
Summary: IAE from GlobalPathRegistry.unregister; multiple ClassPathProviderImpl's crea...
Status: RESOLVED FIXED
Alias: None
Product: projects
Classification: Unclassified
Component: Generic Infrastructure (show other bugs)
Version: 7.2
Hardware: PC Linux
: P3 normal (vote)
Assignee: Jesse Glick
URL:
Keywords:
Depends on: 211021
Blocks: 205533
  Show dependency tree
 
Reported: 2012-03-21 01:01 UTC by Jesse Glick
Modified: 2012-04-11 14:30 UTC (History)
3 users (show)

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jesse Glick 2012-03-21 01:01:25 UTC
I have two projects open, a Maven jar project and an (EE 6) war project. Every time I shut down, I get

java.lang.IllegalArgumentException: Attempt to remove nonexistent path [/jdk/rt.jar:/jdk/etc.jar] from list of registered paths [[~/.m2/repository/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar:/jdk/rt.jar:/jdk/etc.jar]] for id classpath/boot. All paths: {JavascriptBootClassPath=[.../ide/jsstubs/allstubs.zip], classpath/execute=[warprj/target/classes, warprj/target/test-classes:warprj/target/classes:~/.m2/repository/javax/javaee-web-api/6.0/javaee-web-api-6.0.jar], classpath/compile=[~/.m2/repository/javax/javaee-web-api/6.0/javaee-web-api-6.0.jar, warprj/target/classes:~/.m2/repository/javax/javaee-web-api/6.0/javaee-web-api-6.0.jar], classpath/boot=[~/.m2/repository/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar:/jdk/rt.jar:/jdk/etc.jar], classpath/source=[warprj/src/main/java:warprj/src/main/webapp:warprj/src/main/resources, warprj/src/test/java:warprj/src/test/resources]}
	at org.netbeans.api.java.classpath.GlobalPathRegistry.unregister(GlobalPathRegistry.java:241)
	at org.netbeans.modules.maven.ProjectOpenedHookImpl.projectClosed(ProjectOpenedHookImpl.java:301)
	at org.netbeans.spi.project.ui.ProjectOpenedHook$1.projectClosed(ProjectOpenedHook.java:87)
	at org.netbeans.spi.project.ui.support.UILookupMergerSupport$OpenHookImpl.projectClosed(UILookupMergerSupport.java:211)
	at org.netbeans.spi.project.ui.ProjectOpenedHook$1.projectClosed(ProjectOpenedHook.java:87)
[catch] at org.netbeans.modules.project.ui.OpenProjectList.notifyClosed(OpenProjectList.java:1161)

Maybe related to recent changes to boot CP handling?
Comment 1 Milos Kleint 2012-04-03 11:39:48 UTC
The problem seems to be that an entirely new instance of ClassPathProviderImpl is pulled out of the hat (project lookup) in projectClosed(). That in turn creates new bootCp.


my first thought was that https://hg.netbeans.org/core-main/rev/1cfe2b43fe32 could be responsible, but backing up the revision had no visible effect. 

The problem is buried deep in project and general lookup infrastructure? jesse, yarda, any idea?
Comment 2 Jesse Glick 2012-04-03 15:41:37 UTC
I think it is a bug in LazyLookupProviders.
Comment 3 Jesse Glick 2012-04-03 16:29:48 UTC
I can reproduce the problem. I suspect the fault lies in the multiple service interfaces implemented by ClassPathProviderImpl, and/or the multilevel lookup wrapped used by Maven projects.

Unfortunately I am unable to reproduce in a unit test, even one loading CPPI specifically.

#205533 was resolved to be unresolved - sometimes >1 instance of a service is created and there is no known way to prevent that. (Meaning that GlobalPathRegistry just has to quietly ignore the problem.) However that was supposed to be random, whereas this seems to happen quite consistently.

I can fix this bug, but at the cost of introducing a memory leak:

diff --git a/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java b/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java
--- a/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java
+++ b/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java
@@ -82,8 +82,11 @@
      */
     public static LookupProvider forProjectServiceProvider(final Map<String,Object> attrs) throws ClassNotFoundException {
         return new LookupProvider() {
-            public Lookup createAdditionalLookup(final Lookup lkp) {
-                return new ProxyLookup() {
+            final Map<Lookup,Lookup> added = new WeakHashMap<Lookup,Lookup>();
+            @Override public synchronized Lookup createAdditionalLookup(final Lookup lkp) {
+                Lookup result = added.get(lkp);
+                if (result == null) {
+                    result = new ProxyLookup() {
                     Collection<String> serviceNames = Arrays.asList(((String) attrs.get("service")).split(",")); // NOI18N
                     @Override protected void beforeLookup(Template<?> template) {
                         safeToLoad();
@@ -128,6 +131,9 @@
                         }
                     }
                 };
+                added.put(lkp, result);
+                }
+                return result;
             }
         };
     }
Comment 4 Jesse Glick 2012-04-03 17:00:54 UTC
core-main #1ef82eb26a3b
Comment 5 Quality Engineering 2012-04-04 10:12:33 UTC
Integrated into 'main-golden', will be available in build *201204040400* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main-golden/rev/1ef82eb26a3b
User: Jesse Glick <jglick@netbeans.org>
Log: #209815: IAE from GlobalPathRegistry.unregister; multiple ClassPathProviderImpl's created for one project
Not fixing root problem - multiple CPPIs per Project - but working around symptom in GPR.
Comment 6 Quality Engineering 2012-04-06 10:07:40 UTC
Integrated into 'main-golden', will be available in build *201204060400* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main-golden/rev/631a163bf56e
User: Jesse Glick <jglick@netbeans.org>
Log: A bit more logging related to #209815.