Hey, guys.
I found a deadlock with openfire clusters.
When enabled cluster,
system-clustering.jsp calls
ClusterManager.setClusteringEnabled (true) method.
Then sets clustering.enabled is true,
When the listener is triggered after setting all parameters PropertyEventDispatcher listener, when triggered to ClusterManager internal listener calls ClusterManager.startup () method.
When you call to ClusterManager.fireJoinedCluster method will result in a deadlock.
Look at this.
Thread [Jetty-QTP-AdminConsole-53] (Suspended) | |||
owns: ClusterListener (id=126) | |||
owns: Class<T> (com.nqsky.cloud.cluster.ClusterManager) (id=94) | |||
owns: XMLProperties (id=127) | |||
waited by: Daemon Thread [ClusterManager events dispatcher] (Running) | |||
ClusterManager.fireJoinedCluster(boolean) line: 185 | |||
ClusterListener.joinCluster() line: 566 | |||
ClusterListener.<init>(Cluster) line: 149 | |||
ClusteredCacheFactory.startCluster() line: 142 | |||
CacheFactory.startClustering() line: 631 | |||
ClusterManager.startup() line: 308 | |||
ClusterManager$1.xmlPropertySet(String, Map<String,Object>) line: 59 | |||
PropertyEventDispatcher.dispatchEvent(String, EventType, Map<String,Object>) line: 101 | |||
XMLProperties.setProperty(String, String) line: 682 | |||
NQSkyGlobals.setXMLProperty(String, String) line: 449 | |||
ClusterManager.setClusteringEnabled(boolean) line: 349 | |||
system_002dclustering_jsp._jspService(HttpServletRequest, HttpServletResponse) line: 104 | |||
system_002dclustering_jsp(HttpJspBase).service(HttpServletRequest, HttpServletResponse) line: 97 | |||
system_002dclustering_jsp(HttpServlet).service(ServletRequest, ServletResponse) line: 820 | |||
ServletHolder.handle(Request, ServletRequest, ServletResponse) line: 547 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1359 | |||
PageFilter.parsePage(HttpServletRequest, HttpServletResponse, FilterChain) line: 118 | |||
PageFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 52 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1330 | |||
LocaleFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 78 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1330 | |||
SetCharacterEncodingFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 50 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1330 | |||
PluginFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 78 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1330 | |||
AuthCheckFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 164 | |||
ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1330 | |||
ServletHandler.doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 478 | |||
ServletHandler(ScopedHandler).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 119 | |||
ConstraintSecurityHandler(SecurityHandler).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 520 | |||
SessionHandler.doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 227 | |||
WebAppContext(ContextHandler).doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 941 | |||
ServletHandler.doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 409 | |||
SessionHandler.doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 186 | |||
WebAppContext(ContextHandler).doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 875 | |||
WebAppContext(ScopedHandler).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 117 | |||
ContextHandlerCollection.handle(String, Request, HttpServletRequest, HttpServletResponse) line: 250 | |||
HandlerCollection.handle(String, Request, HttpServletRequest, HttpServletResponse) line: 149 | |||
Server(HandlerWrapper).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 110 | |||
Server.handle(HttpConnection) line: 349 | |||
SelectChannelConnector$SelectChannelHttpConnection(HttpConnection).handleRequest () line: 441 | |||
HttpConnection$RequestHandler.content(Buffer) line: 936 | |||
HttpParser.parseNext() line: 801 | |||
HttpParser.parseAvailable() line: 224 | |||
SelectChannelConnector$SelectChannelHttpConnection(AsyncHttpConnection).handle() line: 51 | |||
SelectChannelEndPoint.handle() line: 586 | |||
SelectChannelEndPoint$1.run() line: 44 | |||
QueuedThreadPool.runJob(Runnable) line: 598 | |||
QueuedThreadPool$3.run() line: 533 | |||
Thread.run() line: 744 |
I'm thinking about whether to CacheFactory.startClustering on the other thread.
However, this method will immediately return false CacheFactory.isClusteringStarted lead looks like a cluster fails to start, guys have any good ideas?