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 (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.(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?