[ http://issues.apache.org/jira/browse/HIVEMIND-104?page=comments#action_61833 ] Howard M. Lewis Ship commented on HIVEMIND-104: -----------------------------------------------
I think removing the synchronized keyword from the checkShutdown() method may do the trick; it opens a tiny window where the shutdown flag may be set and a caller will not see it, but that flag doesn't change values more than once anyway. Still this is troubling. Perhaps the Registry should expose a mutex object to synchronize against, rather than having lots of synchronized methods that can deadlock as in this case? That will single thread much more of the (service and configuration creation) behavior of HiveMind, which may not be a bad thing. > Thread Deadlock > --------------- > > Key: HIVEMIND-104 > URL: http://issues.apache.org/jira/browse/HIVEMIND-104 > Project: HiveMind > Type: Bug > Components: framework > Versions: 1.1 > Environment: HiveMind 1.1-alpha-3 > Reporter: Howard M. Lewis Ship > > Occasionally my Tapestry applications seem to lock up. Just happened when I > was in the debugger and I was able to pause and see what the contention is. > Thread [http-8080-Processor25] (Suspended) > > PooledServiceModel.returnServiceToPool(PooledServiceModel$PooledService) > line: 213 > > PooledServiceModel.unbindPooledServiceFromCurrentThread(PooledServiceModel$PooledService) > line: 248 > PooledServiceModel.access$100(PooledServiceModel, > PooledServiceModel$PooledService) line: 38 > PooledServiceModel$PooledService.threadDidCleanup() line: 96 > ThreadEventNotifierImpl.fireThreadCleanup() line: 75 > $ThreadEventNotifier_102f0461661.fireThreadCleanup() line: not available > RegistryInfrastructureImpl.cleanupThread() line: 420 > RegistryImpl.cleanupThread() line: 86 > ApplicationPortlet.render(RenderRequest, RenderResponse) line: 165 > PortletApplicationHandler.render_aroundBody8(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: 226 > > PortletApplicationHandler.render_aroundBody9$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletFilterAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 458 > > PortletApplicationHandler.render_aroundBody10(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody11$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletContentAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 340 > > PortletApplicationHandler.render_aroundBody12(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody13$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletCacheAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 172 > > PortletApplicationHandler.render_aroundBody14(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody15$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletSecurityAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 738 > > PortletApplicationHandler.render_aroundBody16(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody17$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletMonitorAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 628 > PortletApplicationHandler.process(ServletContext, HttpServletRequest, > HttpServletResponse, Input, Output, PortletWindowInternal, boolean) line: 226 > ServletWrapper.service(HttpServletRequest, HttpServletResponse) line: 70 > ServletWrapper(HttpServlet).service(ServletRequest, ServletResponse) > line: 802 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 237 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > ApplicationDispatcher.invoke(ServletRequest, ServletResponse) line: 704 > ApplicationDispatcher.doInclude(ServletRequest, ServletResponse) line: > 590 > ApplicationDispatcher.include(ServletRequest, ServletResponse) line: 510 > PortletContainerDispatcher.dispatch(HttpServletRequest, > HttpServletResponse, String) line: 370 > PortletContainerDispatcher.process(HttpServletRequest, > HttpServletResponse, Input, boolean) line: 310 > PortletContainerDispatcher.render(HttpServletRequest, > HttpServletResponse, RenderInput) line: 271 > PortletContainerServiceImpl.render(HttpServletRequest, > HttpServletResponse, RenderInput) line: 144 > PortletRenderer.encodeChildren(FacesContext, UIComponent) line: 100 > UIPortlet(UIComponentBase).encodeChildren(FacesContext) line: 693 > ContainerRowRenderer.renderViewMode(FacesContext, UIContainer) line: 40 > ContainerRowRenderer(ContainerRenderer).encodeChildren(FacesContext, > UIComponent) line: 34 > UIContainer(UIComponentBase).encodeChildren(FacesContext) line: 693 > PortalRenderer(HtmlBasicRenderer).renderChildren(FacesContext, > UIComponent) line: 63 > PortalRenderer.encodeChildren(FacesContext, UIComponent) line: 58 > UIPortal(UIComponentBase).encodeChildren(FacesContext) line: 693 > ExoPortalViewHandler.renderView(FacesContext, UIViewRoot) line: 63 > RenderResponsePhase.execute(FacesContext) line: 87 > LifecycleImpl.phase(PhaseId, Phase, FacesContext) line: 200 > LifecycleImpl.render(FacesContext) line: 117 > FacesServlet.service(ServletRequest, ServletResponse) line: 198 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 237 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > PrivateRequestFilter.doFilter(ServletRequest, ServletResponse, > FilterChain) line: 82 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 186 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > StandardWrapperValve.invoke(Request, Response, ValveContext) line: 214 > StandardValveContext.invokeNext(Request, Response) line: 104 > StandardPipeline.invoke(Request, Response) line: 520 > StandardContextValve.invokeInternal(Wrapper, Request, Response) line: > 198 > StandardContextValve.invoke(Request, Response, ValveContext) line: 152 > StandardValveContext.invokeNext(Request, Response) line: 104 > FormAuthenticator(AuthenticatorBase).invoke(Request, Response, > ValveContext) line: 540 > StandardValveContext.invokeNext(Request, Response) line: 102 > StandardPipeline.invoke(Request, Response) line: 520 > StandardHostValve.invoke(Request, Response, ValveContext) line: 137 > StandardValveContext.invokeNext(Request, Response) line: 104 > ErrorReportValve.invoke(Request, Response, ValveContext) line: 117 > StandardValveContext.invokeNext(Request, Response) line: 102 > StandardPipeline.invoke(Request, Response) line: 520 > StandardEngineValve.invoke(Request, Response, ValveContext) line: 109 > StandardValveContext.invokeNext(Request, Response) line: 104 > StandardPipeline.invoke(Request, Response) line: 520 > StandardEngine(ContainerBase).invoke(Request, Response) line: 929 > CoyoteAdapter.service(Request, Response) line: 160 > Http11Processor.process(InputStream, OutputStream) line: 799 > Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, > Object[]) line: 705 > TcpWorkerThread.runIt(Object[]) line: 577 > ThreadPool$ControlRunnable.run() line: 683 > ThreadWithAttributes(Thread).run() line: 536 > private synchronized void returnServiceToPool(PooledService pooled) > { > if (_servicePool == null) // line 213 > _servicePool = new ArrayList(); > _servicePool.add(pooled); > } > and > Thread [http-8080-Processor22] (Suspended) > RegistryInfrastructureImpl.checkShutdown() line: 345 > RegistryInfrastructureImpl.getServicePoint(String, Module) line: 153 > RegistryInfrastructureImpl.getService(String, Class, Module) line: 168 > ModuleImpl.getService(String, Class) line: 97 > ServiceTranslator.translate(Module, Class, String, Location) line: 40 > > BuilderPropertyFacet.getFacetValue(ServiceImplementationFactoryParameters, > Class) line: 41 > BuilderFactoryLogic.wireProperty(Object, BuilderFacet) line: 357 > BuilderFactoryLogic.setProperties(Object) line: 320 > BuilderFactoryLogic.createService() line: 77 > > BuilderFactory.createCoreServiceImplementation(ServiceImplementationFactoryParameters) > line: 42 > InvokeFactoryServiceConstructor.constructCoreServiceImplementation() > line: 84 > > PooledServiceModel(AbstractServiceModelImpl).constructCoreServiceImplementation() > line: 106 > PooledServiceModel.constructPooledService() line: 223 > PooledServiceModel.obtainPooledService() line: 196 > PooledServiceModel.getServiceImplementationForCurrentThread() line: 180 > $ApplicationStateManager_102f04616a3._service() line: not available > $ApplicationStateManager_102f04616a3.flush() line: not available > $ApplicationStateManager_102f04616a4.flush() line: not available > BaseEngine(AbstractEngine).service(WebRequest, WebResponse) line: 312 > InvokeEngineTerminator.service(WebRequest, WebResponse) line: 60 > RenderRequestServicerToWebRequestServicerBridge.service(RenderRequest, > RenderResponse) line: 49 > ApplicationPortlet.render(RenderRequest, RenderResponse) line: 157 > PortletApplicationHandler.render_aroundBody8(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: 226 > > PortletApplicationHandler.render_aroundBody9$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletFilterAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 458 > > PortletApplicationHandler.render_aroundBody10(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody11$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletContentAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 340 > > PortletApplicationHandler.render_aroundBody12(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody13$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletCacheAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 172 > > PortletApplicationHandler.render_aroundBody14(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody15$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletSecurityAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 738 > > PortletApplicationHandler.render_aroundBody16(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse) line: not available > > PortletApplicationHandler.render_aroundBody17$advice(PortletApplicationHandler, > Portlet, RenderRequest, RenderResponse, PortletMonitorAspect, Portlet, > RenderRequest, RenderResponse, AroundClosure) line: 628 > PortletApplicationHandler.process(ServletContext, HttpServletRequest, > HttpServletResponse, Input, Output, PortletWindowInternal, boolean) line: 226 > ServletWrapper.service(HttpServletRequest, HttpServletResponse) line: 70 > ServletWrapper(HttpServlet).service(ServletRequest, ServletResponse) > line: 802 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 237 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > ApplicationDispatcher.invoke(ServletRequest, ServletResponse) line: 704 > ApplicationDispatcher.doInclude(ServletRequest, ServletResponse) line: > 590 > ApplicationDispatcher.include(ServletRequest, ServletResponse) line: 510 > PortletContainerDispatcher.dispatch(HttpServletRequest, > HttpServletResponse, String) line: 370 > PortletContainerDispatcher.process(HttpServletRequest, > HttpServletResponse, Input, boolean) line: 310 > PortletContainerDispatcher.render(HttpServletRequest, > HttpServletResponse, RenderInput) line: 271 > PortletContainerServiceImpl.render(HttpServletRequest, > HttpServletResponse, RenderInput) line: 144 > PortletRenderer.encodeChildren(FacesContext, UIComponent) line: 100 > UIPortlet(UIComponentBase).encodeChildren(FacesContext) line: 693 > ContainerRowRenderer.renderViewMode(FacesContext, UIContainer) line: 40 > ContainerRowRenderer(ContainerRenderer).encodeChildren(FacesContext, > UIComponent) line: 34 > UIContainer(UIComponentBase).encodeChildren(FacesContext) line: 693 > PortalRenderer(HtmlBasicRenderer).renderChildren(FacesContext, > UIComponent) line: 63 > PortalRenderer.encodeChildren(FacesContext, UIComponent) line: 58 > UIPortal(UIComponentBase).encodeChildren(FacesContext) line: 693 > ExoPortalViewHandler.renderView(FacesContext, UIViewRoot) line: 63 > RenderResponsePhase.execute(FacesContext) line: 87 > LifecycleImpl.phase(PhaseId, Phase, FacesContext) line: 200 > LifecycleImpl.render(FacesContext) line: 117 > FacesServlet.service(ServletRequest, ServletResponse) line: 198 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 237 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > PrivateRequestFilter.doFilter(ServletRequest, ServletResponse, > FilterChain) line: 82 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 186 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: > 157 > StandardWrapperValve.invoke(Request, Response, ValveContext) line: 214 > StandardValveContext.invokeNext(Request, Response) line: 104 > StandardPipeline.invoke(Request, Response) line: 520 > StandardContextValve.invokeInternal(Wrapper, Request, Response) line: > 198 > StandardContextValve.invoke(Request, Response, ValveContext) line: 152 > StandardValveContext.invokeNext(Request, Response) line: 104 > FormAuthenticator(AuthenticatorBase).invoke(Request, Response, > ValveContext) line: 540 > StandardValveContext.invokeNext(Request, Response) line: 102 > StandardPipeline.invoke(Request, Response) line: 520 > StandardHostValve.invoke(Request, Response, ValveContext) line: 137 > StandardValveContext.invokeNext(Request, Response) line: 104 > ErrorReportValve.invoke(Request, Response, ValveContext) line: 117 > StandardValveContext.invokeNext(Request, Response) line: 102 > StandardPipeline.invoke(Request, Response) line: 520 > StandardEngineValve.invoke(Request, Response, ValveContext) line: 109 > StandardValveContext.invokeNext(Request, Response) line: 104 > StandardPipeline.invoke(Request, Response) line: 520 > StandardEngine(ContainerBase).invoke(Request, Response) line: 929 > CoyoteAdapter.service(Request, Response) line: 160 > Http11Processor.process(InputStream, OutputStream) line: 799 > Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, > Object[]) line: 705 > TcpWorkerThread.runIt(Object[]) line: 577 > ThreadPool$ControlRunnable.run() line: 683 > ThreadWithAttributes(Thread).run() line: 536 > private synchronized void checkShutdown() > { > if (_shutdown) // Line 345 > throw new > ApplicationRuntimeException(HiveMindMessages.registryShutdown()); > } > Are the only threads in the application anywhere near HiveMind. > Unfortunately, I was running with JDK 1.4, so I can't use Eclipse's debugger > to get at threads and monitors. > This is something that needs more attention ... and I can't see how they > would be conflicting. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]