Bug 550009 - UI freeze in org.eclipse.ui.dialogs.FilteredTree
Summary: UI freeze in org.eclipse.ui.dialogs.FilteredTree
Status: RESOLVED FIXED
Alias: None
Product: Platform
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 4.13   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: 4.13 M3   Edit
Assignee: Lars Vogel CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on: 550023
Blocks: 550126 550127
  Show dependency tree
 
Reported: 2019-08-13 08:47 EDT by Lars Vogel CLA
Modified: 2019-08-20 02:02 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Lars Vogel CLA 2019-08-13 08:47:05 EDT
I see the following UI freeze related to org.eclipse.ui.dialogs.FilteredTree.

Also relevant for org.eclipse.e4.ui.dialogs.filteredtree.FilteredTree IMHO.

I suggest to activate setUseHashlookup on both viewers.

Stack Trace
	at java.base@11.0.2/java.util.HashMap.hash(HashMap.java:339)
	at java.base@11.0.2/java.util.HashMap.compute(HashMap.java:1203)
	at org.eclipse.equinox.internal.p2.metadata.index.CapabilityIndex.<init>(CapabilityIndex.java:61)
	at org.eclipse.equinox.internal.p2.engine.Profile.getIndex(Profile.java:184)
	at org.eclipse.equinox.p2.query.ExpressionMatchQuery.perform(ExpressionMatchQuery.java:68)
	at org.eclipse.equinox.internal.p2.metadata.index.IndexProvider.query(IndexProvider.java:26)
	at org.eclipse.equinox.internal.p2.metadata.index.IndexProvider.query(IndexProvider.java:36)
	at org.eclipse.equinox.internal.p2.metadata.TranslationSupport.getLocalizationFragments(TranslationSupport.java:270)
	at org.eclipse.equinox.internal.p2.metadata.TranslationSupport.getLocalizedIUProperty(TranslationSupport.java:291)
	at org.eclipse.equinox.internal.p2.metadata.TranslationSupport.getIUProperty(TranslationSupport.java:174)
	at org.eclipse.equinox.internal.p2.metadata.InstallableUnit.getProperty(InstallableUnit.java:203)
	at org.eclipse.equinox.internal.p2.ui.viewers.IUComparator.compare(IUComparator.java:61)
	at org.eclipse.jface.viewers.ViewerComparator.lambda$0(ViewerComparator.java:206)
	at org.eclipse.jface.viewers.ViewerComparator$$Lambda$406/0x000000010094c840.compare(Unknown Source)
	at java.base@11.0.2/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
	at java.base@11.0.2/java.util.TimSort.sort(TimSort.java:220)
	at java.base@11.0.2/java.util.Arrays.sort(Arrays.java:1441)
	at org.eclipse.jface.viewers.ViewerComparator.sort(ViewerComparator.java:206)
	at org.eclipse.jface.viewers.AbstractTreeViewer.getSortedChildren(AbstractTreeViewer.java:644)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:815)
	at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:604)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:766)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalInitializeTree(AbstractTreeViewer.java:1586)
	at org.eclipse.jface.viewers.TreeViewer.internalInitializeTree(TreeViewer.java:780)
	at org.eclipse.jface.viewers.AbstractTreeViewer.lambda$1(AbstractTreeViewer.java:1571)
	at org.eclipse.jface.viewers.AbstractTreeViewer$$Lambda$407/0x000000010094cc40.run(Unknown Source)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1393)
	at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:363)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1354)
	at org.eclipse.jface.viewers.AbstractTreeViewer.inputChanged(AbstractTreeViewer.java:1565)
	at org.eclipse.ui.dialogs.FilteredTree$NotifyingTreeViewer.inputChanged(FilteredTree.java:863)
	at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:282)
	at org.eclipse.jface.viewers.StructuredViewer.setInput(StructuredViewer.java:1631)
	at org.eclipse.equinox.internal.p2.ui.dialogs.InstalledIUGroup.createViewer(InstalledIUGroup.java:78)
	at org.eclipse.equinox.internal.p2.ui.dialogs.StructuredIUGroup.createGroupComposite(StructuredIUGroup.java:81)
	at org.eclipse.equinox.internal.p2.ui.dialogs.InstalledIUGroup.<init>(InstalledIUGroup.java:54)
	at org.eclipse.equinox.p2.ui.InstalledSoftwarePage.createControl(InstalledSoftwarePage.java:98)
	at org.eclipse.ui.internal.about.InstallationDialog.tabSelected(InstallationDialog.java:242)
	at org.eclipse.ui.internal.about.InstallationDialog.createContents(InstallationDialog.java:219)
	at org.eclipse.jface.window.Window.create(Window.java:431)
	at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1094)
	at org.eclipse.jface.window.Window.open(Window.java:788)
	at org.eclipse.ui.internal.dialogs.AboutDialog.lambda$0(AboutDialog.java:134)
	at org.eclipse.ui.internal.dialogs.AboutDialog$$Lambda$1945/0x00000001016e7440.run(Unknown Source)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72)
	at org.eclipse.ui.internal.dialogs.AboutDialog.buttonPressed(AboutDialog.java:130)
	at org.eclipse.jface.dialogs.Dialog.lambda$0(Dialog.java:619)
	at org.eclipse.jface.dialogs.Dialog$$Lambda$806/0x0000000100f32440.accept(Unknown Source)
	at org.eclipse.swt.events.SelectionListener$1.widgetSelected(SelectionListener.java:84)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5618)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1405)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4882)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4406)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:823)
	at org.eclipse.jface.window.Window.open(Window.java:799)
	at org.eclipse.ui.internal.about.AboutHandler.execute(AboutHandler.java:31)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:283)
	at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:95)
	at jdk.internal.reflect.GeneratedMethodAccessor54.invoke(Unknown Source)
	at java.base@11.0.2/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@11.0.2/java.lang.reflect.Method.invoke(Method.java:566)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:318)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:252)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:173)
	at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156)
	at org.eclipse.core.commands.Command.executeWithChecks(Command.java:498)
	at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487)
	at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213)
	at org.eclipse.ui.internal.handlers.LegacyHandlerService.executeCommand(LegacyHandlerService.java:389)
	at org.eclipse.ui.internal.actions.CommandAction.runWithEvent(CommandAction.java:142)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:580)
	at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:412)
	at org.eclipse.jface.action.ActionContributionItem$$Lambda$340/0x00000001007a4840.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5618)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1405)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4882)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4406)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:635)
	at org.eclipse.ui.internal.Workbench$$Lambda$118/0x000000010036d840.run(Unknown Source)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:559)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base@11.0.2/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base@11.0.2/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base@11.0.2/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@11.0.2/java.lang.reflect.Method.invoke(Method.java:566)
	at app//org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:660)
	at app//org.eclipse.equinox.launcher.Main.basicRun(Main.java:597)
	at app//org.eclipse.equinox.launcher.Main.run(Main.java:1468)
	at app//org.eclipse.equinox.launcher.Main.main(Main.java:1441)
Comment 1 Eclipse Genie CLA 2019-08-13 08:48:13 EDT
New Gerrit change created: https://git.eclipse.org/r/147615
Comment 2 Lars Vogel CLA 2019-08-13 11:56:00 EDT
For record tracking: Andrey and Julian added the following:(summary by me, please correct, if summery is not correct). 

----
Making FilteredTree using hashCode may affect customers with broken hash/equals implementations for with mutable hashCode.
He suggested to change the concrete uses of this code in platform, and may be to provide a different constructor.
----

So we can:

1.) Add new option to opt-in (client stays slow)
2.) document the change and allow clients to opt-out

FilteredTree from e4 has not been released as API, so I will change it directly. This leaves the option:

3.) Leave and deprecated ui.FilteredTree pointing to the new e4 one (which was anymore the plan long term as the ui one cannot be used by e4 RCP applications)
Comment 3 Michael Keppler CLA 2019-08-14 10:55:26 EDT
I tried the same global enabling of setHashLookup(true) for CheckboxTreeViewer in bug 546450, and that was also rejected. I guess you may experience the same problems with this approach of setting it globally.
Comment 4 Lars Vogel CLA 2019-08-14 11:12:38 EDT
(In reply to Michael Keppler from comment #3)
> I tried the same global enabling of setHashLookup(true) for
> CheckboxTreeViewer in bug 546450, and that was also rejected. I guess you
> may experience the same problems with this approach of setting it globally.

Indeed. But I could switch to the e4 FilteredTree, which we forgot to release as API in the past. Forgetfulness pays out in this case.. ;-)
Comment 5 Lars Vogel CLA 2019-08-15 08:55:30 EDT
(In reply to Michael Keppler from comment #3)
> I tried the same global enabling of setHashLookup(true) for
> CheckboxTreeViewer in bug 546450, and that was also rejected. I guess you
> may experience the same problems with this approach of setting it globally.

As suggested by Andrey, I created a new constructor which allows to activate this. I also deprecated the old one, so that clients are guided to use the new constructor and tried to make it obvious in the Javadoc, that "true" is the right choice.
Comment 7 Eclipse Genie CLA 2019-08-15 12:17:24 EDT Comment hidden (obsolete)
Comment 8 Eclipse Genie CLA 2019-08-15 12:26:53 EDT
New Gerrit change created: https://git.eclipse.org/r/147790
Comment 10 Eclipse Genie CLA 2019-08-16 03:39:13 EDT
New Gerrit change created: https://git.eclipse.org/r/147816
Comment 12 Andrey Loskutov CLA 2019-08-16 10:29:34 EDT
This caused releng test fail, see https://download.eclipse.org/eclipse/downloads/drops4/I20190816-0155/compilelogs/platform.doc.isv.javadoc.txt

../../../eclipse.platform.ui/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/FilteredTree.java:236: warning: empty <p> tag
	 * <p>
	   ^
1 warning

The line in question is now 242. Please fix.
Comment 13 Lars Vogel CLA 2019-08-20 02:02:58 EDT
(In reply to Andrey Loskutov from comment #12)
> This caused releng test fail, see
> https://download.eclipse.org/eclipse/downloads/drops4/I20190816-0155/
> compilelogs/platform.doc.isv.javadoc.txt
> 
> ../../../eclipse.platform.ui/bundles/org.eclipse.ui.workbench/Eclipse
> UI/org/eclipse/ui/dialogs/FilteredTree.java:236: warning: empty <p> tag
> 	 * <p>
> 	   ^
> 1 warning
> 
> The line in question is now 242. Please fix.

Done