#26499·pulsar

[错误] isCursorDataFullyPersistable 忽略批量索引永久性限制

作者: void-ptr974创建于 2026年9月8日更新于 2026年9月8日

报告前搜索

QQ 读取发布政策

  • 我知道不支持的版本不会得到错误修正. 我在 " 师 " 分会转载了这个问题。

QQ 用户环境

  • 版本:master' (ce607988747')。
  • 构成部分:管理领导 ' 、管理领导 ' 。

QQ 问题描述

ManagedCursorImpl.isCursorDataFullyPersistable ()'即使配置的批量索引持久性限制使一些部分批量ACK记录无法被保存,仍可返回真实'。 该方法检查的是全输入删除范围限制,但不检查单独的批次记录限制.

  • 触发情况

被存储的批量条目可以包含多条消息. 如果只承认其中的一些, Cursor 会保留一些信件的位图 。 批量索引持久性限制每部分确认的批量条目计算出1个记录,而不是批量内的信息或比特.

考虑三个条目E1,E2和E3,每个条目包含一个A口信和一个B口信. 承认每个 A 信息,并将每个 B 信息留待处理。 Cursor有三批ACK记录,没有全输入删除范围.

用 “ maxBatchDeletedIndex ToPersist=2” 、 “isCursorDataFullyPersistable() ” 返回“ true” , 但明确的 Cursor- state 写法只保存了三批记录中的两封。 同样的不匹配现象也发生在全输入范围采集非空但自有限度的情况下.

预期:不应报告超过批量记录持久性限值的ACK状态为完全可持久性。

影响

批量持久性限制有意将超量ACK记录放入内存. 如果在省略状态保存之前恢复了Cursor,则受影响的消息可能再次被发送. 这里的问题不在于所配置的截断本身,而在于持久性检查并没有报告.

两种多消费者调度器的安装在启用“发送PauseOnAckStatePersistentEnabled”时都参考了这一检查。 批量记录只留下`真实'的结果,因此不会使检查暂停发送。 现行暂停政策是否应涵盖这一额外限制是下文指出的政策问题。

  • 转载问题

这些步骤利用管理引导器的API来制造一个持久的“管理者”。

  1. 在 " 管理者 " 中,设置了 " 删除AtBatch IndexLevelEnable= true " 、 " 最大删除Index ToPersist=2 " 和 " 喉咙MarkDelete=0 " 。 上一个设定防止了利率限制延迟Cursor-state在下文写明.
  2. 增加一个更早的条目E0,然后是批次条目E1、E2和E3。 Mark-delate E0在三批货仍未被确认的情况下,并等待Cursor-状态书写完成.
  3. 单独确认每个A信息,将每个B信息留待处理。 现在内存中有三批ACK记录,没有全输入删除范围.
  4. 呼叫 . . . . . . .