Apache Ignite Bug:GridDiscoveryManager.java致服务节点崩溃
Ignite分段检测配置引发空指针崩溃问题
配置了segmentationResolver,将分段策略设为RESTART_JVM,同时把segmentationCheckFreq设为0(表示基于拓扑变化触发分段检查),但该场景下集群节点会出现崩溃。
代码逻辑矛盾分析
在GridDiscoveryManager.java的3130行,处理节点离开事件(EVT_NODE_LEFT)时,仅判断是否配置了解析器就调度分段检查:
case EVT_NODE_LEFT: { // Check only if resolvers were configured. if (hasRslvrs) segChkWrk.scheduleSegmentCheck();
但segChkWrk对象仅在segmentationCheckFreq设为非零值时才会初始化,相关逻辑在1087行:
// Start segment check worker only if frequency is greater than 0. if (hasRslvrs && segChkFreq > 0) { segChkWrk = new SegmentCheckWorker(); segChkThread = new IgniteThread(segChkWrk);
这就导致当拓扑变化触发检查时,segChkWrk为空,直接抛出空指针异常,引发节点崩溃。
重现步骤
- 配置分段解析器
- 将
segmentationCheckFreq设置为0 - 停止集群中的一个节点,其余节点会因空指针崩溃
报错日志
2024-06-20 16:06:51,030 UTC+0530 ERROR [disco-event-worker-#45%as%] org.apache.ignite.internal.managers.discovery.GridDiscoveryManager -- Exception in discovery event worker thread. java.lang.NullPointerException: Cannot invoke "org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$SegmentCheckWorker.scheduleSegmentCheck()" because the return value of "org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.access$11600(org.apache.ignite.internal.managers.discovery.GridDiscoveryManager)" is null at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$DiscoveryWorker.body0(GridDiscoveryManager.java:3133) ~[ignite-core-2.16.0.jar:2.16.0] at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$DiscoveryWorker.body(GridDiscoveryManager.java:3060) ~[ignite-core-2.16.0.jar:2.16.0] at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125) ~[ignite-core-2.16.0.jar:2.16.0] at java.lang.Thread.run(Thread.java:1583) ~[?:?] 2024-06-20 16:06:51,711 UTC+0530 ERROR [disco-event-worker-#45%as%] org.apache.ignite.logger.jcl.JclLogger -- Critical system error detected. Will be handled accordingly to configured handler [hnd=StopNodeOrHaltFailureHandler [tryStop=false, timeout=0, super=AbstractFailureHandler [ignoredFailureTypes=UnmodifiableSet []]], failureCtx=FailureContext [type=SYSTEM_WORKER_TERMINATION, err=java.lang.NullPointerException: Cannot invoke "o.a.i.i.managers.discovery.GridDiscoveryManager$SegmentCheckWorker.scheduleSegmentCheck()" because the return value of "o.a.i.i.managers.discovery.GridDiscoveryManager.access$11600(o.a.i.i.managers.discovery.GridDiscoveryManager)" is null]] java.lang.NullPointerException: Cannot invoke "org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$SegmentCheckWorker.scheduleSegmentCheck()" because the return value of "org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.access$11600(org.apache.ignite.internal.managers.discovery.GridDiscoveryManager)" is null at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$DiscoveryWorker.body0(GridDiscoveryManager.java:3133) ~[ignite-core-2.16.0.jar:2.16.0] at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$DiscoveryWorker.body(GridDiscoveryManager.java:3060) ~[ignite-core-2.16.0.jar:2.16.0] at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125) ~[ignite-core-2.16.0.jar:2.16.0] at java.lang.Thread.run(Thread.java:1583) ~[?:?]
内容的提问来源于stack exchange,提问作者Lakshmikantha Reddy
相关产品推荐
相关产品推荐

