Chronicle Queue无法获取表存储文件排他锁问题排查求助
Chronicle Queue锁异常问题:成因与解决办法
异常详情
Caused by: java.lang.IllegalStateException: Unable to claim exclusive exclusive lock on file /LargeBuffer/bawnmspc_BAW_CDC_EBS_PK_BAW_CDC_EBS_PK/4294163802/metadata.cq4t at net.openhft.chronicle.queue.impl.table.SingleTableStore.doWithLock(SingleTableStore.java:160) ~[chronicle-queue-5.21.96.jar:?] at net.openhft.chronicle.queue.impl.table.SingleTableStore.doWithExclusiveLock(SingleTableStore.java:125) ~[chronicle-queue-5.21.96.jar:?] at net.openhft.chronicle.queue.impl.table.SingleTableBuilder.build(SingleTableBuilder.java:137) ~[chronicle-queue-5.21.96.jar:?] at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder.initializeMetadata(SingleChronicleQueueBuilder.java:444) ~[chronicle-queue-5.21.96.jar:?] at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder.preBuild(SingleChronicleQueueBuilder.java:1077) ~[chronicle-queue-5.21.96.jar:?] at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueBuilder.build(SingleChronicleQueueBuilder.java:327) ~[chronicle-queue-5.21.96.jar:?]
问题成因
这是5.21.96版本Chronicle Queue的已知缺陷:队列初始化元数据表(metadata.cq4t)时,排他锁的获取逻辑存在漏洞,以下场景会触发异常:
- 之前使用该队列的进程异常退出,操作系统未自动释放文件锁;
- 同一队列被多个进程或重复初始化的线程同时访问,锁竞争处理逻辑失效;
- 文件系统对文件锁的支持存在延迟或异常。
解决办法
- 升级版本:该问题已在后续版本修复,直接升级到5.21.97及以上的稳定版本,可彻底解决此问题。
- 清理异常文件:若暂时无法升级,先停止所有使用该队列的进程,删除队列目录下的
metadata.cq4t文件,重启应用后Chronicle Queue会自动重建元数据文件。 - 规范初始化逻辑:确保同一队列在应用中仅初始化一次(用单例模式),避免多线程场景下重复创建
SingleChronicleQueue实例,减少锁竞争。
内容的提问来源于stack exchange,提问作者Anirudh Kashyap
相关产品推荐
相关产品推荐

