sofastack / sofa-jraft

A production-grade java implementation of RAFT consensus algorithm.
https://www.sofastack.tech/projects/sofa-jraft/
Apache License 2.0
3.52k stars 1.12k forks source link

在这种情况下是不是会出现死锁? #1107

Closed ye-xiaowei closed 3 weeks ago

ye-xiaowei commented 3 weeks ago

Your question

在下面这种情况下是不是会出现死锁?

FSMCaller-Disruptor 线程 destroy Replicator,期间还有2个线程在等待 ThreadId 的锁释放

  1. ScheduleThreadPool 线程 heatbeat onTimeout()
  2. Append-Entries-Thread-Send 线程 onRpcReturned()

然后 destroy 完成,先唤醒了 ScheduleThreadPool,但是他不释放锁因为已经 destroyed

} finally {
    // Maybe destroyed in callback
    if (!this.destroyed) {
        this.lock.unlock();
    }
}

所以锁被Schedule线程持有没释放,send 线程就一直卡住了

Environment

killme2008 commented 3 weeks ago

思考了下,确实有这个可能,这里应该无条件 unlock,不管是否 destroy

killme2008 commented 3 weeks ago

我也忘了当时为啥加这个检查了,可以提个 PR 来修复下。

ye-xiaowei commented 3 weeks ago

嗯嗯