TencentBlueKing/bk-job

fix: 分布式锁实现不正确

Closed this issue · 1 comments

Version / Branch / tag
3.8.x

出了什么问题?(What Happened?)
用的是ValueOperations<K, V>的这个方法:
Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit);
一直以来,这个实现就是不正确的,实际上是用的redis的SET指令,没有SETNX的效果。
image

如何复现?(How to reproduce?)
排查file-gateway重调度任务被多次触发时发现:
image
image

预期结果(What you expect?)
分布式锁正常工作,file-gateway重调度任务同一时刻只有一个触发。

查明是误判,SET指令加上NX参数后就是SETNX的效果。
file-gateway重调度任务被多次触发是因为快速地获取并释放了锁,之后被其他实例获取到了导致。