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 146696 - expensive use of EDT for reading XML configuration data
Summary: expensive use of EDT for reading XML configuration data
Status: NEW
Alias: None
Product: cnd
Classification: Unclassified
Component: Project (show other bugs)
Version: 6.x
Hardware: All All
: P4 blocker (vote)
Assignee: Alexander Simon
URL:
Keywords: PERFORMANCE
: 96889 145899 149282 174285 (view as bug list)
Depends on: 146715
Blocks: 145899
  Show dependency tree
 
Reported: 2008-09-09 20:01 UTC by Thomas Preisler
Modified: 2017-02-02 14:06 UTC (History)
5 users (show)

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments
screenshot (81.33 KB, image/jpeg)
2008-09-09 20:03 UTC, Thomas Preisler
Details
request to review patch (9.89 KB, patch)
2008-09-23 09:00 UTC, Alexander Simon
Details | Diff
last state of bug investigation (21.96 KB, patch)
2008-09-24 18:07 UTC, Alexander Simon
Details | Diff
stack traceses (11.02 KB, text/plain)
2008-10-30 15:03 UTC, Alexander Simon
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Preisler 2008-09-09 20:01:05 UTC
I'm getting this quite often this morning:

java.lang.Exception: Not allowed to use EDT for reading XML descriptor of project!
        at org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptorProvider.getConfigurationDescriptor(ConfigurationDescriptorProvider.java:87)
        at org.netbeans.modules.cnd.makeproject.ui.MakeLogicalViewProvider.getMakeConfigurationDescriptor(MakeLogicalViewProvider.java:777)
        at org.netbeans.modules.cnd.makeproject.ui.MakeLogicalViewProvider.createLogicalView(MakeLogicalViewProvider.java:152)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.logicalViewForProject(ProjectsRootNode.java:300)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.createNodes(ProjectsRootNode.java:261)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.createNodes(ProjectsRootNode.java:219)
        at org.openide.nodes.Children$Keys$KE.nodes(Children.java:1572)
        at org.openide.nodes.ChildrenArray.nodesFor(ChildrenArray.java:168)
        at org.openide.nodes.EntrySupport$Default$Info.nodes(EntrySupport.java:926)
        at org.openide.nodes.EntrySupport$Default.updateAdd(EntrySupport.java:506)
        at org.openide.nodes.EntrySupport$Default.setEntries(EntrySupport.java:339)
        at org.openide.nodes.Children$Keys$2.run(Children.java:1466)
        at org.openide.util.Mutex.postRequest(Mutex.java:1251)
        at org.openide.util.Mutex.postWriteRequest(Mutex.java:582)
        at org.openide.nodes.Children$Keys.applyKeys(Children.java:1475)
        at org.openide.nodes.Children$Keys.setKeys(Children.java:1419)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.propertyChange(ProjectsRootNode.java:318)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:270)
        at org.netbeans.modules.project.ui.OpenProjectList$4.run(OpenProjectList.java:637)
        at org.netbeans.modules.project.ui.OpenProjectList$4.run(OpenProjectList.java:636)
        at org.openide.util.Mutex$1AWTWorker.run(Mutex.java:1370)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:180)
        at java.awt.Dialog$1.run(Dialog.java:535)
        at java.awt.Dialog$2.run(Dialog.java:563)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:561)
        at java.awt.Component.show(Component.java:1302)
        at java.awt.Component.setVisible(Component.java:1255)
        at org.netbeans.modules.project.ui.OpenProjectList.open(OpenProjectList.java:516)
        at org.netbeans.modules.project.ui.actions.NewProject$2.run(NewProject.java:214)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

It happens when I create a new project or open an existing one! The project is unusable and Close is the only available action. Reopening the project seems to bypass the error but not always.

Regression most likely related to:
changeset 6fec6735b1ec in main
details: http://hg.netbeans.org/main?cmd=changeset;node=6fec6735b1ec
description:
	fixing IZ#145899: Do not ever block EDT with hacks like Task.waitFinished()

Vladimir, you should consider backing out 6fec6735b1ec?
Comment 1 Thomas Preisler 2008-09-09 20:03:58 UTC
Created attachment 69447 [details]
screenshot
Comment 2 Vladimir Voskresensky 2008-09-09 22:27:47 UTC
java.lang.Exception: Not allowed to use EDT for reading XML descriptor of project!
        at
org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptorProvider.getConfigurationDescriptor(ConfigurationDescriptorProvider.java:87)
        at
org.netbeans.modules.cnd.makeproject.MakeProjectEncodingQueryImpl.getMakeConfigurationDescriptor(MakeProjectEncodingQueryImpl.java:107)
        at
org.netbeans.modules.cnd.makeproject.MakeProjectEncodingQueryImpl.getEncoding(MakeProjectEncodingQueryImpl.java:74)
        at
org.netbeans.modules.projectapi.ProjectFileEncodingQueryImplementation.getEncoding(ProjectFileEncodingQueryImplementation.java:72)
        at org.netbeans.api.queries.FileEncodingQuery.getEncoding(FileEncodingQuery.java:91)
        at org.openide.text.DataEditorSupport.openDocument(DataEditorSupport.java:396)
        at org.openide.text.CloneableEditorSupport.open(CloneableEditorSupport.java:434)
        at org.netbeans.modules.cnd.modelutil.CsmUtilities$2.run(CsmUtilities.java:526)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Comment 3 Vladimir Voskresensky 2008-09-09 22:38:35 UTC
made soft notification
http://hg.netbeans.org/main?cmd=changeset;node=3717b7a373e3
Comment 4 Quality Engineering 2008-09-10 05:47:02 UTC
Integrated into 'main-golden', will be available in build *200809100201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/3717b7a373e3
User: Vladimir Voskresensky <vv159170@netbeans.org>
Log: fixup for IZ#146696: cannot open projects: Not allowed to use EDT...
Comment 5 Vladimir Voskresensky 2008-09-11 11:03:46 UTC
*** Issue 145899 has been marked as a duplicate of this issue. ***
Comment 6 Vladimir Voskresensky 2008-09-11 18:10:20 UTC
scratch of async root node:
http://hg.netbeans.org/main?cmd=changeset;node=99184c6bf3b1
Comment 7 Quality Engineering 2008-09-12 05:57:21 UTC
Integrated into 'main-golden', will be available in build *200809120201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/99184c6bf3b1
User: Vladimir Voskresensky <vv159170@netbeans.org>
Log: fixing IZ#146696: cannot open projects: Not allowed to use EDT...
Comment 8 Vladimir Voskresensky 2008-09-12 18:34:18 UTC
next fix
http://hg.netbeans.org/main?cmd=changeset;node=de0234f482e5
Comment 9 Quality Engineering 2008-09-13 05:19:04 UTC
Integrated into 'main-golden', will be available in build *200809130201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/de0234f482e5
User: Vladimir Voskresensky <vv159170@netbeans.org>
Log: fixing IZ#146696: cannot open projects: Not allowed to use EDT...
Comment 10 Vladimir Voskresensky 2008-09-15 13:45:12 UTC
changes were reverted:
http://hg.netbeans.org/main?cmd=changeset;node=69f18642bd02
Comment 11 Vladimir Voskresensky 2008-09-16 16:10:48 UTC
the same could be on removing project:
java.lang.Exception: Not allowed to use EDT for reading XML descriptor of project!
        at
org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptorProvider.getConfigurationDescriptor(ConfigurationDescriptorProvider.java:116)
        at
org.netbeans.modules.cnd.makeproject.MakeProjectConfigurationProvider.removePropertyChangeListener(MakeProjectConfigurationProvider.java:94)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.activeProjectChanged(ActiveConfigAction.java:421)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.refreshView(ActiveConfigAction.java:507)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.resultChanged(ActiveConfigAction.java:543)
        at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.openide.util.WeakListenerImpl$ProxyListener.invoke(WeakListenerImpl.java:449)
        at $Proxy2.resultChanged(Unknown Source)
        at org.openide.util.lookup.ProxyLookup$1Notify.run(ProxyLookup.java:173)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:179)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:119)
        at
org.netbeans.modules.project.ui.actions.LookupSensitiveAction$LastActivatedWindowLookup.updateLookups(LookupSensitiveAction.java:274)
        at
org.netbeans.modules.project.ui.actions.LookupSensitiveAction$LastActivatedWindowLookup.propertyChange(LookupSensitiveAction.java:279)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at org.netbeans.core.windows.RegistryImpl.tryFireChanges(RegistryImpl.java:298)
        at org.netbeans.core.windows.RegistryImpl.selectedNodesChanged(RegistryImpl.java:233)
        at org.netbeans.core.windows.WindowManagerImpl.notifyRegistrySelectedNodesChanged(WindowManagerImpl.java:1016)
        at org.netbeans.core.windows.WindowManagerImpl.topComponentActivatedNodesChanged(WindowManagerImpl.java:1193)
        at org.openide.windows.TopComponent.setActivatedNodesImpl(TopComponent.java:314)
        at org.openide.windows.TopComponent.access$400(TopComponent.java:114)
        at org.openide.windows.TopComponent$SynchronizeNodes.run(TopComponent.java:1601)
        at org.openide.windows.TopComponent$SynchronizeNodes.resultChanged(TopComponent.java:1583)
        at org.openide.util.lookup.ProxyLookup$1Notify.run(ProxyLookup.java:173)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:179)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:119)
        at org.openide.explorer.DefaultEMLookup.updateLookups(DefaultEMLookup.java:131)
        at org.openide.explorer.DefaultEMLookup.propertyChange(DefaultEMLookup.java:163)
        at org.openide.util.WeakListenerImpl$PropertyChange.propertyChange(WeakListenerImpl.java:186)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at org.openide.explorer.ExplorerManager$2.run(ExplorerManager.java:855)
        at org.openide.util.Mutex.doEvent(Mutex.java:1335)
        at org.openide.util.Mutex.readAccess(Mutex.java:345)
        at org.openide.explorer.ExplorerManager.fireInAWT(ExplorerManager.java:852)
        at org.openide.explorer.ExplorerManager$1AtomicSetSelectedNodes.fire(ExplorerManager.java:272)
        at org.openide.explorer.ExplorerManager.setSelectedNodes(ExplorerManager.java:285)
        at org.openide.explorer.ExplorerManager$1SetExploredContextAndSelection.run(ExplorerManager.java:373)
        at org.openide.util.Mutex.readAccess(Mutex.java:362)
        at org.openide.explorer.ExplorerManager.setExploredContextAndSelection(ExplorerManager.java:400)
        at org.openide.explorer.view.BeanTreeView.selectionChanged(BeanTreeView.java:155)
        at org.openide.explorer.view.TreeView.callSelectionChanged(TreeView.java:781)
        at org.openide.explorer.view.TreeView$TreePropertyListener.run(TreeView.java:1375)
        at org.openide.util.Mutex.postRequest(Mutex.java:1262)
        at org.openide.util.Mutex.postReadRequest(Mutex.java:565)
        at org.openide.explorer.view.TreeView$TreePropertyListener.valueChanged(TreeView.java:1346)
        at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
        at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170)
        at javax.swing.JTree.setSelectionPath(JTree.java:1598)
        at org.openide.explorer.view.TreeView$ExplorerTree$ModelHandler.treeNodesRemoved(TreeView.java:2228)
        at javax.swing.tree.DefaultTreeModel.fireTreeNodesRemoved(DefaultTreeModel.java:530)
        at javax.swing.tree.DefaultTreeModel.nodesWereRemoved(DefaultTreeModel.java:310)
        at org.openide.explorer.view.NodeTreeModel$Listener.removed(NodeTreeModel.java:240)
        at org.openide.explorer.view.VisualizerChildren.removed(VisualizerChildren.java:245)
        at org.openide.explorer.view.VisualizerEvent$Removed.run(VisualizerEvent.java:132)
        at org.openide.util.Mutex.readAccess(Mutex.java:362)
        at org.openide.explorer.view.VisualizerNode$QP.run(VisualizerNode.java:708)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:177)
        at java.awt.Dialog$1.run(Dialog.java:1045)
        at java.awt.Dialog$3.run(Dialog.java:1097)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1095)
        at org.netbeans.core.windows.services.NbPresenter.superShow(NbPresenter.java:867)
        at org.netbeans.core.windows.services.NbPresenter.doShow(NbPresenter.java:901)
        at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:889)
        at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:109)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1355)
        at org.openide.util.Mutex.readAccess(Mutex.java:268)
        at org.netbeans.core.windows.services.NbPresenter.show(NbPresenter.java:874)
        at java.awt.Component.show(Component.java:1422)
        at java.awt.Component.setVisible(Component.java:1375)
        at java.awt.Window.setVisible(Window.java:806)
        at java.awt.Dialog.setVisible(Dialog.java:985)
        at
org.netbeans.modules.project.uiapi.DefaultProjectOperationsImplementation.showConfirmationDialog(DefaultProjectOperationsImplementation.java:688)
        at
org.netbeans.modules.project.uiapi.DefaultProjectOperationsImplementation.access$300(DefaultProjectOperationsImplementation.java:98)
        at
org.netbeans.modules.project.uiapi.DefaultProjectOperationsImplementation$GUIUserInputHandler.showConfirmationDialog(DefaultProjectOperationsImplementation.java:220)
        at
org.netbeans.modules.project.uiapi.DefaultProjectOperationsImplementation.deleteProject(DefaultProjectOperationsImplementation.java:196)
        at
org.netbeans.modules.project.uiapi.DefaultProjectOperationsImplementation.deleteProject(DefaultProjectOperationsImplementation.java:162)
        at
org.netbeans.spi.project.ui.support.DefaultProjectOperations.performDefaultDeleteOperation(DefaultProjectOperations.java:85)
        at org.netbeans.modules.cnd.makeproject.MakeActionProvider.invokeAction(MakeActionProvider.java:214)
        at org.netbeans.modules.project.ui.actions.ProjectAction.actionPerformed(ProjectAction.java:129)
        at org.netbeans.modules.project.ui.actions.LookupSensitiveAction.actionPerformed(LookupSensitiveAction.java:161)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1220)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1261)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Comment 12 Vladimir Voskresensky 2008-09-17 09:26:56 UTC
*** Issue 96889 has been marked as a duplicate of this issue. ***
Comment 13 Leonid Lenyashin 2008-09-22 13:58:29 UTC
Vladimir,

What is the chance that you have it fixed by Wed 6PM? Should I reassign this?

Leonid.
Comment 14 Leonid Lenyashin 2008-09-22 14:52:09 UTC
Sasha, could you please take care of this issue, and let Vladimir to review the fix when it is ready. He has no time to
fix it himself.
Comment 15 Vladimir Voskresensky 2008-09-22 14:53:41 UTC
MakeProjectConfigurationProvider.addPropertyChangeListener is called by Project API from AWT as well (sometimes?), so it
should be fixed together with MakeProjectConfigurationProvider.removePropertyChangeListener
Comment 16 Alexander Simon 2008-09-23 09:00:30 UTC
Created attachment 70258 [details]
request to review patch
Comment 17 Alexander Simon 2008-09-23 09:04:08 UTC
Reassign to review fix
Comment 18 Vladimir Voskresensky 2008-09-23 19:03:21 UTC
I have reviewed the path and gave my advices for the preferred changes
Comment 19 Alexander Simon 2008-09-23 20:03:11 UTC
You solution does not work because logical view provider is a one of clients of make configuration descriptor.
I can pass to logical view provider incomplete make configuration descriptor.
But a lot of clients (in EDT too) get a make configuration descriptor.
So it is meaningless solution.
I see one unsafe way:
- do not wait reading in all clients.
- make sure that all clients get notification on descriptor reading.
It works, but now I see at least one problem:
Hack with "41" in MakeSources.initSources() should be rewritten.
Comment 20 Alexander Simon 2008-09-24 18:07:51 UTC
Created attachment 70504 [details]
last state of bug investigation
Comment 21 Alexander Simon 2008-09-24 18:18:13 UTC
Investigation shows that bug cannot be safely fixed.
So I remove stack trace and going to start waving process.
Change set:
http://hg.netbeans.org/main/rev/0dc779157cb3
Comment 22 Quality Engineering 2008-09-25 06:30:56 UTC
Integrated into 'main-golden', will be available in build *200809250201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/0dc779157cb3
User: Alexander Simon <alexvsimon@netbeans.org>
Log: start waving process for IZ#146696:expensive use of EDT for reading XML configuration data
Comment 23 Alexander Simon 2008-10-07 07:12:40 UTC
*** Issue 149282 has been marked as a duplicate of this issue. ***
Comment 24 Alexander Simon 2008-10-20 17:03:33 UTC
fixed, change set:
http://hg.netbeans.org/main/rev/dea75b342f7e
Comment 25 Quality Engineering 2008-10-21 04:09:31 UTC
Integrated into 'main-golden', will be available in build *200810210201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/dea75b342f7e
User: Alexander Simon <alexvsimon@netbeans.org>
Log: fixed: IZ#146696:expensive use of EDT for reading XML configuration data
Comment 26 Alexander Simon 2008-10-30 12:00:01 UTC
Fixing of the bug resulted in a lot of problem.
For example:
IZ#151743:Files view does not show source files from source roots
IZ#151273:Corrupted configurations.xml
To fix related bugs we have to change a lot of clients of protect configurations.
So I believe that bug should be resolved on NB project side.
IMHO NB project system should take into account projects that have in lookup class
org.netbeans.spi.project.ProjectConfigurationProvider
NB project system should not get configurations before provider load it.
It would be nice to have a event:
    String PROP_CONFIGURATIONS_READY = "configurations_ready"; // NOI18N
Comment 27 Alexander Simon 2008-10-30 13:55:19 UTC
roll back reading configurations in the request processor thread.
Change set:
http://hg.netbeans.org/main/rev/aaf6706d97a1
Comment 28 Alexander Simon 2008-10-30 15:03:04 UTC
Created attachment 72916 [details]
stack traceses
Comment 29 Alexander Simon 2008-10-30 15:13:32 UTC
Last 3 stack traces show:
- right IDE behavior on startup (reading configuration in request processor thread)
- wrong IDE behavior on create and open project (reading configuration in EDT thread)
So project system should not read configuration in EDT thread.
Reassign for evaluation.
Comment 30 Quality Engineering 2008-10-31 04:47:22 UTC
Integrated into 'main-golden', will be available in build *200810310201* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress)
Changeset: http://hg.netbeans.org/main/rev/aaf6706d97a1
User: Alexander Simon <alexvsimon@netbeans.org>
Log: fixing: IZ#146696:expensive use of EDT for reading XML configuration data
Comment 31 Vladimir Voskresensky 2008-11-28 12:23:07 UTC
Milos, what do you think will be the target milestone for this bug?
C++ team and our QA needs it to be fixed. Earlier is better.
Thanks,
Vladimir
Comment 32 Milos Kleint 2008-12-05 14:38:42 UTC
why was this moved to projects? I don't really care when you read some of your xml files, I suppose you should read then
on project opening or sometimes as early as project creation, to prevent the assert from showing.

I don't think there anything that can be done in projects. Please provide detailed advice and reasoning in case you
don't agree with my evaluation.

Comment 33 Vladimir Voskresensky 2008-12-05 14:47:33 UTC
Milos, as you correctly pointed out one time we have to read our project data.
The point is that exactly project system is responsible for thread which ask project to be loaded

So:
- project system has *right* behavior on startup (reading configuration in request processor thread)
- project system has *wrong* behavior on create and open project during IDE session (force reading configuration in EDT
thread)
project system should be consistent and always ask read configuration out of EDT thread. The same as used on startup
"Load Open Projects" thread
Comment 34 Milos Kleint 2008-12-05 14:56:03 UTC
But your configuration file has nothing to do directly with the project system. As I see the stacktraces, you get them
on creation of nodes in projects view, when editor asks for encoding of file, when selection in projects view changes
and other places..

can you elaborate on "project system has *wrong* behavior on create and open project during IDE session (force reading
configuration in EDT thread)".... I can't seem to see what stacktraces are relevant to this claim.

Comment 35 Vladimir Voskresensky 2008-12-05 15:25:48 UTC
Oh, I see. Sorry for confusions.
We have fixed number of problem places already on our side (editor asks about encoding is one of them).
And the remains problems are related to creation of LogicalViews (project system responsibility, isn't it?)
So, in attached stacks:
http://www.netbeans.org/nonav/issues/showattachment.cgi/72916/open-project-EDT.txt
we see 3 thread traces how project system asks to create logical views:
1) open projects on IDE startup => this is not in AWT
2) create new project => this is in AWT
3) open project => in AWT again

As you know during the phase (1) project system itself creates "fake" project node with content "Initializing..." and
minimal context menu

So, we are asking to use the same approach for cases (2) and (3)

Hope, it's clearer now
Comment 36 Milos Kleint 2008-12-05 18:09:35 UTC
why is creating a node an expensive operation?
Comment 37 Alexander Simon 2008-12-05 18:17:16 UTC
>why is creating a node an expensive operation?
Because node info are stored in configuration xml file that can be very big
(for example 10Mb is ordinary size for medium projects).
So to create node CND should read whole configuration xml.
Comment 38 Milos Kleint 2008-12-05 18:27:19 UTC
and you need the 10 meg to display the name of the project, show icon or tooltip?


Comment 39 Alexander Simon 2008-12-05 18:44:29 UTC
>and you need the 10 meg to display the name of the project, show icon or tooltip?
This information is stored in project xml.
But NB needs more information:
- source roots
- menus
- children nodes
- and so on.
Uninformatively information can be accessed NB in EDT in arbitrary time and we have hanging UI.
I investigate a problem an tryed to do lazy reading configuration xm.
Result: a lot of cnd and NB stuff should be rewritten to support partly read configuration xm.
So if opening project in EDT requires to rewrite a lot of code it is better to rewrite opening project.
Comment 40 Vladimir Voskresensky 2008-12-05 21:18:53 UTC
some more comments:
- we have tried to return from creating logical view asap to prevent EDT block and used "Loading..." fake node to
asynchronously load our big configuration.xml file, but as soon as we returned project system starts to notify all
listeners through OpenProjects service about opened C++ project. 
- clients starts to ask C++ project about data and either block on that phase (again in EDT) or obtain "empty" data
- Opened Hook is called as well and it's again face project in not consistent state
=> that's why we have to stay with your workflow and block UI until project is read.

In fact, it's clear, that not only we faced this problem. Seems, performance team faced it as well in prev release, when
detected, that projects are opened in EDT during NB startup => the solution with fake nodes and "Opening projects" RP
was introduced.
Now we are asking Project API team to make next step and improve remain 2 usecases (creating project, opening project)
using the same RP "Opening projects" methodology.
So, I'm adding Jarda for possible help on solution
Comment 41 Milos Kleint 2008-12-06 07:39:00 UTC
you confuse a few things there. 
The project shall not be *loaded* in AWT (by ProjectManager), if it is it's a bug.
Creation of project node is a view operation, and therefore shall be quick and can be done in AWT.
Open project hooks shall not be called in AWT thread and they are not, AFAIK.
There are indeed some queries into project lookup that are done in AWT, IMHO it's the job of the previous steps (like
project loading, project opening (openhook) to get the project into shape that will allow fluent responses to such queries
Comment 42 Vladimir Voskresensky 2008-12-12 12:37:31 UTC
I tried to add some more laziness in our loading phase.
I had to prevent putting project into logical node lookup until full load and there is warning:

WARNING [org.netbeans.modules.project.ui.ProjectsRootNode]: Warning - project Application_15 failed to supply itself in
the lookup of the root node of its own logical view

Ok. may be it's fine. I'm putting it later on, but still some calls from project API system in EDT:
thread is blocked, because data is loading from XML in external thread and fills up source roots information

"AWT-EventQueue-1" prio=3 tid=0x08cc4000 nid=0x1f waiting for monitor entry [0xc97fe000..0xc97ff9f0]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.netbeans.modules.cnd.makeproject.MakeSources.getSourceGroups(MakeSources.java:87)
        - waiting to lock <0xdb2ca808> (a org.netbeans.modules.cnd.makeproject.MakeSources)
        at org.netbeans.modules.project.ui.PhysicalView.createNodesForProject(PhysicalView.java:92)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.createNodes(ProjectsRootNode.java:259)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.createNodes(ProjectsRootNode.java:219)
        at org.openide.nodes.Children$Keys$KE.nodes(Children.java:1602)
        at org.openide.nodes.ChildrenArray.nodesFor(ChildrenArray.java:168)
        - locked <0xdb4a5ed8> (a org.openide.nodes.ChildrenArray)
        at org.openide.nodes.EntrySupport$Default$Info.nodes(EntrySupport.java:925)
        at org.openide.nodes.EntrySupport$Default.updateAdd(EntrySupport.java:505)
        at org.openide.nodes.EntrySupport$Default.setEntries(EntrySupport.java:345)
        at org.openide.nodes.Children$Keys$2.run(Children.java:1496)
        at org.openide.util.Mutex$1Exec.run(Mutex.java:1239)
        at org.openide.nodes.Children$ProjectManagerDeadlockDetector.execute(Children.java:1802)
        at org.openide.util.Mutex.postRequest(Mutex.java:1245)
        at org.openide.util.Mutex.postRequest(Mutex.java:1209)
        at org.openide.util.Mutex.postWriteRequest(Mutex.java:582)
        at org.openide.nodes.Children$Keys.applyKeys(Children.java:1505)
        at org.openide.nodes.Children$Keys.setKeys(Children.java:1449)
        at org.netbeans.modules.project.ui.ProjectsRootNode$ProjectChildren.propertyChange(ProjectsRootNode.java:318)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at org.netbeans.modules.project.ui.OpenProjectList$4.run(OpenProjectList.java:647)
        at org.netbeans.modules.project.ui.OpenProjectList$4.run(OpenProjectList.java:645)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1355)
        at org.openide.util.Mutex.readAccess(Mutex.java:268)
        at org.netbeans.modules.project.ui.OpenProjectList.doOpen(OpenProjectList.java:645)
        at org.netbeans.modules.project.ui.OpenProjectList.open(OpenProjectList.java:528)
        at org.netbeans.modules.project.ui.OpenProjectList.open(OpenProjectList.java:464)
        at org.netbeans.modules.project.ui.OpenProjectList.open(OpenProjectList.java:460)
        at org.netbeans.modules.project.ui.OpenProjectsTrampolineImpl.openAPI(OpenProjectsTrampolineImpl.java:72)
        at org.netbeans.api.project.ui.OpenProjects.open(OpenProjects.java:169)
        at
org.netbeans.modules.welcome.content.RecentProjectsPanel$OpenProjectAction.actionPerformed(RecentProjectsPanel.java:169)
        at org.netbeans.modules.welcome.content.ActionButton.actionPerformed(ActionButton.java:69)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6134)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5899)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
        at java.awt.Container.dispatchEventImpl(Container.java:2067)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Comment 43 Vladimir Voskresensky 2008-12-12 14:13:33 UTC
Hmm... if project wasn't added in lookup at the beginning, I've got exceptions on adding file (project is under vcs)

java.lang.AssertionError: Should have had a Project in lookup of
org.netbeans.modules.project.ui.ProjectsRootNode$BadgingNode@a6a478[Name=quote_1, displayName=quote_1]
	at org.netbeans.modules.project.ui.ProjectsRootNode.findNode(ProjectsRootNode.java:163)
	at org.netbeans.modules.project.ui.ProjectTab.selectNode(ProjectTab.java:527)
[catch] at org.netbeans.modules.project.ui.ProjectUtilities$3$1.run(ProjectUtilities.java:283)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Comment 44 Vladimir Voskresensky 2008-12-12 14:49:57 UTC
Another problem is configurations combobox in toolbar. Btw, it's very easy to emulate the same in Java. 
Just put Thread.sleep(15000) in J2SEConfigurationProvider.calculateConfigs and you will see frozen UI when select
project in project view:


"AWT-EventQueue-1" prio=3 tid=0x08ca3c00 nid=0x21 runnable [0x81bfd000..0x81bff9f0]
   java.lang.Thread.State: RUNNABLE
        at
org.netbeans.modules.java.j2seproject.J2SEConfigurationProvider.calculateConfigs(J2SEConfigurationProvider.java:173)
        at
org.netbeans.modules.java.j2seproject.J2SEConfigurationProvider.getConfigurations(J2SEConfigurationProvider.java:192)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction$8.run(ActiveConfigAction.java:480)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction$8.run(ActiveConfigAction.java:478)
        at org.openide.util.Mutex.readAccess(Mutex.java:285)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.getConfigurations(ActiveConfigAction.java:478)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.activeProjectChanged(ActiveConfigAction.java:445)
        - locked <0x9135cbe0> (a org.netbeans.modules.project.ui.actions.ActiveConfigAction)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.refreshView(ActiveConfigAction.java:518)
        at org.netbeans.modules.project.ui.actions.ActiveConfigAction.resultChanged(ActiveConfigAction.java:554)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.openide.util.WeakListenerImpl$ProxyListener.invoke(WeakListenerImpl.java:449)
        at $Proxy2.resultChanged(Unknown Source)
        at org.openide.util.lookup.ProxyLookup$1Notify.run(ProxyLookup.java:173)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:179)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:119)
        at
org.netbeans.modules.project.ui.actions.LookupSensitiveAction$LastActivatedWindowLookup.updateLookups(LookupSensitiveAction.java:274)
        at
org.netbeans.modules.project.ui.actions.LookupSensitiveAction$LastActivatedWindowLookup.propertyChange(LookupSensitiveAction.java:279)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at org.netbeans.core.windows.RegistryImpl.tryFireChanges(RegistryImpl.java:299)
        at org.netbeans.core.windows.RegistryImpl.selectedNodesChanged(RegistryImpl.java:234)
        at org.netbeans.core.windows.WindowManagerImpl.notifyRegistrySelectedNodesChanged(WindowManagerImpl.java:1038)
        at org.netbeans.core.windows.WindowManagerImpl.topComponentActivatedNodesChanged(WindowManagerImpl.java:1218)
        at org.openide.windows.TopComponent.setActivatedNodesImpl(TopComponent.java:314)
        at org.openide.windows.TopComponent.access$400(TopComponent.java:114)
        at org.openide.windows.TopComponent$SynchronizeNodes.run(TopComponent.java:1601)
        at org.openide.windows.TopComponent$SynchronizeNodes.resultChanged(TopComponent.java:1583)
        at org.openide.util.lookup.ProxyLookup$1Notify.run(ProxyLookup.java:173)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:179)
        at org.openide.util.lookup.ProxyLookup.setLookups(ProxyLookup.java:119)
        at org.openide.explorer.DefaultEMLookup.updateLookups(DefaultEMLookup.java:131)
        at org.openide.explorer.DefaultEMLookup.propertyChange(DefaultEMLookup.java:163)
        at org.openide.util.WeakListenerImpl$PropertyChange.propertyChange(WeakListenerImpl.java:186)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at org.openide.explorer.ExplorerManager$2.run(ExplorerManager.java:865)
        at org.openide.util.Mutex.doEvent(Mutex.java:1335)
        at org.openide.util.Mutex.readAccess(Mutex.java:345)
        at org.openide.explorer.ExplorerManager.fireInAWT(ExplorerManager.java:862)
        at org.openide.explorer.ExplorerManager$1AtomicSetSelectedNodes.fire(ExplorerManager.java:282)
        at org.openide.explorer.ExplorerManager.setSelectedNodes(ExplorerManager.java:293)
        at org.openide.explorer.ExplorerManager$1SetExploredContextAndSelection.run(ExplorerManager.java:381)
        at org.openide.util.Mutex.readAccess(Mutex.java:362)
        at org.openide.util.Mutex$1R.run(Mutex.java:1301)
        at org.openide.util.Mutex.doWrapperAccess(Mutex.java:1318)
        at org.openide.util.Mutex.readAccess(Mutex.java:351)
        at org.openide.explorer.ExplorerManager.setExploredContextAndSelection(ExplorerManager.java:408)
        at org.openide.explorer.view.BeanTreeView.selectionChanged(BeanTreeView.java:155)
        at org.openide.explorer.view.TreeView.callSelectionChanged(TreeView.java:782)
        at org.openide.explorer.view.TreeView$TreePropertyListener.run(TreeView.java:1384)
        at org.openide.util.Mutex$1Exec.run(Mutex.java:1239)
        at org.openide.nodes.Children$ProjectManagerDeadlockDetector.execute(Children.java:1802)
        at org.openide.util.Mutex.postRequest(Mutex.java:1245)
        at org.openide.util.Mutex.postRequest(Mutex.java:1209)
        at org.openide.util.Mutex.postReadRequest(Mutex.java:565)
        at org.openide.explorer.view.TreeView$TreePropertyListener.valueChanged(TreeView.java:1355)
        at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
        at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170)
        at javax.swing.JTree.setSelectionPath(JTree.java:1598)
        at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2316)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3525)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressedDND(BasicTreeUI.java:3502)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3461)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
        at java.awt.Component.processMouseEvent(Component.java:6131)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5899)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3962)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
        at java.awt.Container.dispatchEventImpl(Container.java:2067)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Comment 45 Vladimir Voskresensky 2008-12-12 14:53:05 UTC
Hmm. In J2SE project nobody caches configurations, so I/O for reading is everytime, i.e. during display of project's
context menu
Comment 46 Jesse Glick 2008-12-12 17:10:13 UTC
"I had to prevent putting project into logical node lookup until full load" - this is bad. The Project object should be
constructed quickly, and requests for objects from its Lookup should be honored quickly. It is OK for method calls on
resulting services to take more time.

j2seproject could indeed cache configurations, though they are pretty fast to load without caching anyway - a handful of
very short *.properties files.

Separate issues may be filed (independently please) for PhysicalView.createNodesForProject and
ActiveConfigAction.refreshView to run off EQ in case the project's impls of Sources and ProjectConfigurationProvider
cannot be made fast.

Seems to me that the root issue is using a 10Mb XML file for project settings. This seems absurd.
Comment 47 Thomas Preisler 2008-12-12 18:16:02 UTC
Implementing http://www.netbeans.org/issues/show_bug.cgi?id=121295 should help on the size of the xml file. I also have other ideas how we can save 
space so we should be able to reduce the size of the xml significantly in the future.
Comment 48 Alexander Simon 2008-12-13 09:20:04 UTC
>Seems to me that the root issue is using a 10Mb XML file for project settings. This seems absurd.
It is a C/C++ specific.
CND has to have configuration for each source/header/folder.
In compare with Java CND can support project with 10K sources.
What will IDE do if you try to open 600 projects from trunk?
It is not ordinary operation for NB team.
Opening all sources of operating system is ordinary operation for C developers.
Seem to me NB platform has a lack of scalability.
Comment 49 Vladimir Voskresensky 2008-12-15 10:29:11 UTC
Jesse, I can file separate issues for everything, but our experience shows, that 
Project system could be more reliable in "slow" I/O system...

From implementers of project system SPI point of view: the most comfortable for us is to have the same behavior of
Project System as on IDE startup:
- the fake project node quickly displayed in Project view in "Initializing..." mode.
- then real project node replaces fake one after project data is loaded and only at that time OpenProjects fire event
about new project
+ that would be consistent

Your are right, Java project system is "lucky", because mostly doing it's I/O in EDT on small property files.
Although, how can we claim, that "fast" I/O in EDT is fine? Does anything fast enough in "network" filesystems? :-)

Our projects would benefit from having the phase in Project System to complete "loading" data before it's available for
global actions Build/Run/Debug/Configurations... (and they are available as soon as Project is in lookup of logical view
node)
Comment 50 Jesse Glick 2008-12-15 18:16:30 UTC
"CND has to have configuration for each source/header/folder" - well unless you can optimize this in common cases, or at
least avoid loading parts of that config that are not immediately needed, you will have some performance issues. XML is
a poor choice of formats for anything critical to performance, especially when a huge amount of information is being
persisted.

Barring format improvements, you will need to request asynch impls of PhysicalView and ActiveConfigAction; or else have
your Sources and ProjectConfigurationProvider impls initially return dummy results, then later fire changes and return
correct results.
Comment 51 Thomas Preisler 2009-02-05 16:44:28 UTC
From Simon:

I like element's names in the first part of xml:
 <logicalFolder name="root" displayName="root" projectFiles="true">
   <df name="clucene-core-0.9.21b" root=".">
     <df name="src">
       <df name="CLucene">
         <df name="analysis">
           <df name="standard">
             <in>StandardAnalyzer.cpp</in>
Could we also use short names in configurations part of xml?
     <item path="src/CLucene/index/DocumentWriter.cpp" ex="false" tool="1">
       <ccCompilerTool>
         <includeDirectories>
           <directoryPath>src/CLucene/store</directoryPath>
           <directoryPath>src/CLucene/document</directoryPath>
           <directoryPath>src/CLucene/analysis</directoryPath>
           <directoryPath>src/CLucene/search</directoryPath>
         </includeDirectories>
         <preprocessorList>
           <Elem>DLL_EXPORT=1</Elem>
           <Elem>PIC=1</Elem>
         </preprocessorList>
       </ccCompilerTool>
     </item>
We also can save space and time if xml will use attributes instead nested nodes:
           <directoryPath name="src/CLucene/store"/>
           <Elem name="DLL_EXPORT" value="1"/>
With short names (up - user path, um - user macros):
           <up name="src/CLucene/store"/>
           <um name="DLL_EXPORT" value="1"/>
It makes sense also for <in> elements:
           <in name="StandardAnalyzer.cpp"/>

Comment 52 Thomas Preisler 2009-02-12 21:22:15 UTC
Implemented many xml improvements reducing the size of configurations.xml with more than 50% in many cases helping on performance. The core issues ( 
configurations.xml is still large and is read from EDT) has not been solved with these changes so issue will not be closed. I will downgrade to P3 for now and 
work on other improvements in the future.
Comment 53 Vladimir Voskresensky 2009-10-13 13:38:05 UTC
*** Issue 174285 has been marked as a duplicate of this issue. ***
Comment 54 Alexander Pepin 2010-04-03 19:00:59 UTC
Downgraded, feel free to escalate if it's still an issue