快速结论:Confluence 或 Jira 增量同步时,如果文档更新落在“水位线所在的那一分钟”内,本次同步与下次同步都不会收录该文档,表现为文档永久漏同步。优先排查水位线(watermark)的时间精度与客户端过滤条件是否一致。
适用环境:RAGFlow 的 Go 同步器(internal/syncer);涉及 Confluence、Jira 连接器。Issue 未提供操作系统、Python、CUDA、显卡等环境信息。
最快修复方案:升级到包含已合并 PR #21577 的版本,该 PR 将水位线窗口做钳制(clamp),使最近一分钟内更新的记录被重新读取。
注意事项:Issue 只说明修复已由 #21577 合并并有单元测试覆盖,未给出具体版本号;升级后请按“验证方法”确认时间边界场景。CQL/JQL 本身只支持分钟精度,这是该问题的根因,不能仅通过调大参数绕过。
问题场景
在 RAGFlow 中运行 Confluence 或 Jira 的增量同步任务。每轮同步结束时,Go 同步器把水位线推进到 time.Now().UTC(),下一轮从这一精确时刻开始。但 Confluence 的 CQL 和 Jira 的 JQL 只接受分钟精度(yyyy-MM-dd HH:mm),导致上一轮查询上界被向下取整、下一轮客户端过滤又排除了等于起始时刻的记录,落在该分钟区间 (floor(end), end] 内的页面或 Issue 永远不会被同步。Jira 侧还会因过滤使用未加缓冲的 windowStart,使 time_buffer_seconds(默认 60)失效。
报错原文
[Bug]: Confluence and Jira sync drop documents updated inside the watermark minute
TestConfluenceWindowKeepsWhatTheCQLAlreadyReturned
TestJiraSyncKeepsIssuesInsideTheWatermarkMinute
原因分析
最可能的原因是查询时间范围与客户端过滤时间范围不一致:
- 查询使用分钟精度,上界被
floor(end),因此本轮不包含(floor(end), end]内的更新。 - 下一轮查询下界为
floor(end),服务端会返回该分钟内的记录,但客户端过滤以未取整的start做排他比较,丢弃<= start的记录。 - Jira 的
buildJQL用time_buffer_seconds加宽下界,但NextBatch仍以未加缓冲的windowStart过滤,额外返回的记录被再次丢弃。
相关代码位置(Issue 指出):confluence.go:512 pageCQL、:523 attachmentCQL、:826 inConfluenceWindow;jira.go:210 buildJQL、:638 NextBatch;水位线传递见 sync_runner.go:101 与 sync_task.go:436。Bitbucket 使用 RFC3339Nano 时间戳,Airtable/DingTalk/Discord 已使用包含下界,因此不受影响。
环境排查
- 确认当前 RAGFlow 版本是否已包含 PR #21577 的修复合并。
- 确认问题连接器是否为 Confluence 或 Jira;其他连接器一般不受此问题影响。
- 检查同步任务的水位线(
poll_range_start)是否记录到秒级时间,而非分钟精度。 - 如使用 Jira,确认
time_buffer_seconds的实际过滤行为是否与 JQL 下界一致。 - 如需本地验证,可运行 Issue 提到的单元测试
TestConfluenceWindowKeepsWhatTheCQLAlreadyReturned与TestJiraSyncKeepsIssuesInsideTheWatermarkMinute。
解决步骤
- 将 RAGFlow 升级到包含 #21577 合并提交的版本。
- 升级后对受影响的 Confluence/Jira 数据源检查是否有缺失文档,必要时对怀疑落在水位线分钟的页面或 Issue 做一次重新同步或触发更新。
- 如果需要自行构建,确认过滤逻辑的下界改为由生成查询的同一辅助函数推导,并向下取整到分钟;Jira 侧需在应用时间缓冲之后再执行该过滤。
- 在本地运行上述两个单元测试,确认在当前代码上通过。
验证方法
构造 Issue 中的复现场景:在 T = 10:05:30 结束一轮同步,随后在 10:05:10 更新一个 Confluence 页面或 Jira Issue,再执行下一轮同步,确认该文档被收录而非被过滤丢弃。同时确认 TestConfluenceWindowKeepsWhatTheCQLAlreadyReturned 与 TestJiraSyncKeepsIssuesInsideTheWatermarkMinute 通过;对 Jira 还可检查设置 time_buffer_seconds 后,被加宽下界召回的记录不再被客户端过滤丢弃。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Connector OAuth credentials (access token, refresh token, client secret) are stored in plaintext in the database](https://www.chat-gpts.plus/wp-content/uploads/2026/11/17265-76d6b229-768x403.jpg)

![[Bug][ROCm]: ROCM_AITER_MLA can select an aiter MLA decode kernel that silently returns uncorrelated output (gqa_ratio=16, fp8 Q+KV, decode_](https://www.chat-gpts.plus/wp-content/uploads/2026/11/66141-f364a62a-768x403.jpg)