数据丢失场景下执行ttl策略时可能存在误删除未过期数据

背景:我们在测试数据丢失场景的容错和恢复,发现OpFindNewest类在查找需要删除的Position过程中:
1、如果查找第一个Position就报NonRecoverableLedgerException,会调用readEntryFailed,仅删除当前searchPosition(即开始位置)的数据,5分钟定时任务执行如果还是报同样的错,还只是仅删除一个Position的数据,这样会导致磁盘空间无法回收
1、如果查找第一个Position是成功的,但在查找结束位置Position过程中,如果报NonRecoverableLedgerException,会调用readEntryFailed把当前Position前面的数据全部删除(如果当前Position对应的Ledger丢失了),这样可能会导致当前Position前面全部数据都被删除,而前面的数据可能是未过期的(这个问题仅通过看代码推测)

这两个问题请大佬确认下

问题1:有相关的报错截图吗?有的话,建议可以把操作的步骤和结果整理到 github issue上,方便后续的解决和追踪。
问题2:最好有相关的测试可以验证你的推测,有利于问题的解决。

1、第一个问题日志:

2022-06-16 20:01:45.0984 [BookKeeperClientWorker-OrderedExecutor-61-0] WARN org.apache.pulsar.broker.service.persistent.PersistentMessageExpiryMonitor - [persistent://qlm-test/qlm-ns/qlm-test-partition-5][qlm-sub] read failed from ledger at position:Optional[17636:857539] : No such ledger exists on Metadata Server
2022-06-16 20:01:45.0984 [BookKeeperClientWorker-OrderedExecutor-61-0] INFO org.apache.pulsar.broker.service.persistent.PersistentMessageExpiryMonitor - [persistent://qlm-test/qlm-ns/qlm-test-partition-5][qlm-sub] Expiring all messages until position 17636:857539

2、这个问题看代码应该比较明显吧。假设走了三步state=searching,searchPosition已经更新了,但这时抛出NonRecoverableLedgerException,调用readEntryFailed会把searchPosition前面的数据都会删除。但searchPosition前面部分除了startPosition位置是确认过期的之外,全部都还没确认过期吧?