Chronicle Queue报Unsigned Int 31-bit越界异常,求原因分析
Chronicle Queue 5.16.16 追加消息时触发UInt31范围异常的问题排查
使用Chronicle-Queue 5.16.16版本追加消息时,出现如下异常:
2023-05-17 16:02:38 [Thread-12] WARN - Unsigned Int 31-bit 3544677295290987316 out of range java.lang.IllegalArgumentException: Unsigned Int 31-bit 3544677295290987316 out of range at net.openhft.chronicle.core.Maths.toUInt31(Maths.java:367) at net.openhft.chronicle.queue.impl.single.SCQIndexing.sequenceForPosition(SCQIndexing.java:500) at net.openhft.chronicle.queue.impl.single.SCQIndexing.lastSequenceNumber(SCQIndexing.java:665) at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueStore.lastSequenceNumber(SingleChronicleQueueStore.java:253) at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.writeHeader(SingleChronicleQueueExcerpts.java:387) at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.openContext(SingleChronicleQueueExcerpts.java:402) at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.writingDocument(SingleChronicleQueueExcerpts.java:366) at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.writingDocument(SingleChronicleQueueExcerpts.java:346)
可能的触发原因:
- 索引文件损坏:SCQIndexing负责管理队列的索引数据,若队列的索引文件(如
.cq4系列索引文件)因异常关机、磁盘IO故障、多进程非法共享队列等情况损坏,会导致读取到错误的位置数值,远超UInt31的合法范围(UInt31最大值为2^31-1=2147483647)。 - 配置错误:如果错误修改了队列索引相关的配置参数,比如强制设置了超出UInt31范围的位置值,或者启用了与当前版本不兼容的索引模式,会引发数值计算时的非法值。
- 版本兼容性问题:从低版本Chronicle Queue升级到5.16.16时,旧版本的索引格式可能与新版本不兼容,读取旧索引数据时会解析出无效数值。
- 并发操作违规:多进程共享同一队列,或多线程操作时未遵循队列的并发使用规范,可能导致索引文件被并发写入破坏,产生无效的位置数据。
内容的提问来源于stack exchange,提问作者akavalevich
相关产品推荐
相关产品推荐

