[jbosstools-issues] [JBoss JIRA] (ERT-499) Deadlock DependencyGraphImpl and ComponentCore [EBZ#511793]

Friendly Jira Robot (JIRA) issues at jboss.org
Thu Apr 6 10:30:00 EDT 2017


Friendly Jira Robot created ERT-499:
---------------------------------------

             Summary: Deadlock DependencyGraphImpl and ComponentCore [EBZ#511793]
                 Key: ERT-499
                 URL: https://issues.jboss.org/browse/ERT-499
             Project: Eclipse Release Train
          Issue Type: Task
          Components: WTP Common Tools
            Reporter: Friendly Jira Robot


We have some code that creates a project and then installs a custom facet.  We're seeing a deadlock with the DependencyGraphImpl's GraphUpdateJob.

Our code creates the project and then uses FacetedProject#modify() to install our own facet in the project.  It hangs attempting to acquire the project's lock.  But it has already acquired the ComponentImplManager's synchronization lock (stack frame marked with XXX):

Thread [ModalContext] (Suspended (entry into method getProjectLockObject in EMFWorkbenchEditContextFactory))	
	owns: ComponentImplManager  (id=218)	
	owns: CreateAppEngineStandardWtpProject  (id=219)	
	EMFWorkbenchEditContextFactory.getProjectLockObject(IProject) line: 63	
	EMFWorkbenchEditContextFactory.createEMFContext(IProject, IEMFContextContributor) line: 79	
	WorkbenchResourceHelperBase.createEMFContext(IProject, IEMFContextContributor) line: 249	
	ModuleCoreNature(EMFNature).createEmfContext() line: 105	
	ModuleCoreNature(EMFNature).getEmfContextBase() line: 229	
	ModuleCoreNature(EditModelNature).getEmfContext() line: 61	
	ModuleCoreNature.getModuleStructuralModelForWrite(Object) line: 303	
	StructureEdit.<init>(ModuleCoreNature, boolean) line: 329	
	StructureEdit.getStructureEditForRead(IProject) line: 119	
	VirtualComponent.createResource() line: 121	
	VirtualComponent.initializeResource() line: 113	
	VirtualComponent.<init>(IProject, IPath) line: 148	
XXX	ComponentImplManager.createComponent(IProject, boolean) line: 250	
	ComponentCore.createComponent(IProject, boolean) line: 84	
	WebFacetInstallDelegate.setContentPropertyIfNeeded(IDataModel, IPath, IProject) line: 221	
	WebFacetInstallDelegate.execute(IProject, IProjectFacetVersion, Object, IProgressMonitor) line: 86	
	FacetedProject.callDelegate(IProjectFacetVersion, IDelegate, Object, Object, IProgressMonitor) line: 1477	
	FacetedProject.modifyInternal(Set<Action>, IProgressMonitor) line: 441	
	FacetedProject.mergeChangesInternal(IFacetedProjectWorkingCopy, IProgressMonitor) line: 1181	
	FacetedProject.access$2(FacetedProject, IFacetedProjectWorkingCopy, IProgressMonitor) line: 1117	
	FacetedProject$1.run(IProgressMonitor) line: 324	
	Workspace.run(ICoreRunnable, ISchedulingRule, int, IProgressMonitor) line: 2240	
	Workspace.run(IWorkspaceRunnable, ISchedulingRule, int, IProgressMonitor) line: 2267	
	FacetedProject.modify(Set<Action>, IProgressMonitor) line: 339	
	AppEngineStandardFacet.installAppEngineFacet(IFacetedProject, boolean, IProgressMonitor) line: 150	
	CreateAppEngineStandardWtpProject.execute(IProgressMonitor) line: 103	
	CreateAppEngineStandardWtpProject(WorkspaceModifyOperation).lambda$0(InvocationTargetException[], IProgressMonitor) line: 107	
	1612372028.run(IProgressMonitor) line: not available	
	Workspace.run(ICoreRunnable, ISchedulingRule, int, IProgressMonitor) line: 2240	
	Workspace.run(IWorkspaceRunnable, ISchedulingRule, int, IProgressMonitor) line: 2267	
	CreateAppEngineStandardWtpProject(WorkspaceModifyOperation).run(IProgressMonitor) line: 128	
	ModalContext$ModalContextThread.run() line: 119	


The project creation spawns a GraphUpdateJob that call ComponentImplManager#createComponent(IProject).  This method first acquires the associated project lock, and then attempts to call ComponentImplManager#createComponent(IProject,boolean), which is a synchronized method.

Thread [Worker-0] (Suspended (entry into method getProjectLockObject in EMFWorkbenchEditContextFactory))	
	EMFWorkbenchEditContextFactory.getProjectLockObject(IProject) line: 63	
	ComponentImplManager.createComponent(IProject) line: 207	
	ComponentCore.createComponent(IProject) line: 64	
	DependencyGraphImpl$GraphUpdateJob$1.run() line: 494	
	SafeRunner.run(ISafeRunnable) line: 42	
	DependencyGraphImpl$GraphUpdateJob.run(IProgressMonitor) line: 462	
	Worker.run() line: 56	

If the GraphUpdateJob acquires the project lock first, we have deadlock as our ModalContext thread has the ComponentImplManager's synchronization lock.



--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the jbosstools-issues mailing list