Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 397439

Summary: Infinite loop in WeakHashMap (calling put method from WorkbenchServiceRegistry getService)
Product: [RT] RAP Reporter: erru <erru>
Component: WorkbenchAssignee: Project Inbox <rap-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P2    
Version: 2.0   
Target Milestone: 3.0 RC3   
Hardware: PC   
OS: Windows 7   
Whiteboard:

Description erru CLA 2013-01-04 07:32:19 EST
When running great many requests on a Tomcat server, there are some UIThreads not working properly.
Endless loops occur, when the method getService in WorkbenchServiceRegistry calls put method in java.util.WeakHashMap.
I looked in JConsole and saw 2 threads. CPU load of the associated workerthread is 100%.

1. thread

Name: UIThread [3F8B04D002E83CC303A2A615C647AE57]
State: RUNNABLE
Total blocked: 91  Total waited: 0

Stack trace: 
java.util.WeakHashMap.put(WeakHashMap.java:430)
org.eclipse.ui.internal.services.WorkbenchServiceRegistry.getService(WorkbenchServiceRegistry.java:105)
org.eclipse.ui.internal.services.ServiceLocator.getService(ServiceLocator.java:173)
org.eclipse.ui.internal.WorkbenchWindow.getService(WorkbenchWindow.java:4164)
org.eclipse.ui.internal.menus.LegacyActionPersistence.<init>(LegacyActionPersistence.java:234)
org.eclipse.ui.internal.WorkbenchWindow.initializeDefaultServices(WorkbenchWindow.java:4155)
org.eclipse.ui.internal.WorkbenchWindow.<init>(WorkbenchWindow.java:387)
org.eclipse.ui.internal.tweaklets.Workbench3xImplementation.createWorkbenchWindow(Workbench3xImplementation.java:29)
org.eclipse.ui.internal.Workbench.newWorkbenchWindow(Workbench.java:1933)
org.eclipse.ui.internal.Workbench.access$11(Workbench.java:1931)
org.eclipse.ui.internal.Workbench$16.runWithException(Workbench.java:1244)
org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32)
org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:230)
org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
org.eclipse.swt.widgets.Display.syncExec(Display.java:1045)
org.eclipse.ui.internal.StartupThreading.runWithWorkbenchExceptions(StartupThreading.java:55)
org.eclipse.ui.internal.Workbench.busyOpenWorkbenchWindow(Workbench.java:1242)
org.eclipse.ui.internal.Workbench.doOpenFirstTimeWindow(Workbench.java:2061)
org.eclipse.ui.internal.Workbench.openFirstTimeWindow(Workbench.java:1992)
org.eclipse.ui.internal.WorkbenchConfigurer.openFirstTimeWindow(WorkbenchConfigurer.java:188)
org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:790)
org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1640)
org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32)
org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:230)
org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
org.eclipse.swt.widgets.Display.syncExec(Display.java:1045)
org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:110)
org.eclipse.ui.internal.Workbench.init(Workbench.java:1635)
org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2655)
org.eclipse.ui.internal.Workbench.access$5(Workbench.java:2530)
org.eclipse.ui.internal.Workbench$5.run(Workbench.java:701)
org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:684)
org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:157)
mail.EntryPoint1.createUI(EntryPoint1.java:103)
org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:186)
org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:298)
   - locked org.eclipse.rap.rwt.internal.lifecycle.UIThread@6b2f7535
java.lang.Thread.run(Thread.java:636)
org.eclipse.rap.rwt.internal.lifecycle.UIThread.run(UIThread.java:104)


2. thread

Name: UIThread [701BE6EECB650EB4F6DDB772FADA40B3]
State: RUNNABLE
Total blocked: 28  Total waited: 0

Stack trace: 
java.util.WeakHashMap.put(WeakHashMap.java:430)
org.eclipse.ui.internal.services.WorkbenchServiceRegistry.getService(WorkbenchServiceRegistry.java:105)
org.eclipse.ui.internal.services.ServiceLocator.getService(ServiceLocator.java:173)
org.eclipse.ui.internal.Workbench$40.runWithException(Workbench.java:1899)
org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32)
org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:230)
org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
org.eclipse.swt.widgets.Display.syncExec(Display.java:1045)
org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:110)
org.eclipse.ui.internal.Workbench.initializeDefaultServices(Workbench.java:1895)
org.eclipse.ui.internal.Workbench.init(Workbench.java:1593)
org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2655)
org.eclipse.ui.internal.Workbench.access$5(Workbench.java:2530)
org.eclipse.ui.internal.Workbench$5.run(Workbench.java:701)
org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:684)
org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:157)
mail.EntryPoint1.createUI(EntryPoint1.java:103)
org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:186)
org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:298)
   - locked org.eclipse.rap.rwt.internal.lifecycle.UIThread@7a275e18
java.lang.Thread.run(Thread.java:636)
org.eclipse.rap.rwt.internal.lifecycle.UIThread.run(UIThread.java:104)




Isn“t it necassary to synchronize the Hashmaps in java.util during access?


erru
Comment 1 Ivan Furnadjiev CLA 2013-01-08 04:20:50 EST
WeakHashMap is not synchronized as it's JavaDoc states. The WorkbenchServiceRegistry is static - shared by all UI sessions. The WorkbenchServiceRegistry code is the original RCP code and maybe we have to adjust it to multi-user environment.
Comment 2 Ivan Furnadjiev CLA 2015-05-29 05:59:26 EDT
It seems a known problem that accesing the WeakHashMap unsynchronized from multiple threads may lead to endless loop. See [1] and [2].

[1] http://www.adam-bien.com/roller/abien/entry/endless_loops_in_unsychronized_weakhashmap
[2] https://java.net/jira/browse/JAVASERVERFACES-2544
Comment 3 Ivan Furnadjiev CLA 2015-05-29 06:12:06 EDT
Pending change: https://git.eclipse.org/r/#/c/48938/
Comment 4 Ivan Furnadjiev CLA 2015-05-29 08:27:23 EDT
Change submitted.