Skip to content

修复 Add/Search 短暂缺表失败,增加默认 5 秒的可配置恢复窗口 - #23

Merged
loveRhythm1990 merged 1 commit into
mainfrom
fix/missing-table-retry-20261020
Oct 21, 2026
Merged

loveRhythm1990 merged 1 commit into
mainfrom
fix/missing-table-retry-20261020

Conversation

@loveRhythm1990

Copy link
Copy Markdown
Contributor

并发创建用户库时,Memoria 已完成建表,后续另一条数据库连接仍可能短暂返回缺表错误。mb 目前会立即结束 Add/Search;即使写入已提交,也可能把后续读取失败返回给客户端。

本次在 mb 的 HTTP 边界增加针对已识别缺表错误的有限恢复:

  • 仅匹配 Memoria HTTP 500 中的 mem_* 缺表错误:1064/42000 的指定 parser 消息,或 1146/42S02 的 no such table 消息。普通 500、语法错误、认证/参数错误、限流和传输异常不进入此重试。
  • MEMORIA_CATALOG_RETRY_TIMEOUT_SECONDS 默认 5 秒,支持 0~120 秒的有限数值,0 关闭;Helm 对应 catalogRetryTimeoutSeconds。
  • 从首次匹配错误开始,同一次 Add/Search 的写入、读取、检索和全部分片共用一个单调时钟窗口,不逐次或逐分片重置。退避从 0.5 秒开始、上限 1 秒;退避、重试排队和重试 I/O 均受剩余窗口及原请求/可见性预算约束。
  • 写入仅重试带原始 key 和原始内容的原子幂等接口;已知 memory ID 后只做读取/检索验证。先前写入结果不确定时,即使后一次连接未发送,也保持“结果不确定”的恢复语义。
  • 等待时释放后端 slot;日志仅包含重试序号与等待时长,不输出上游错误正文、库名、标识、认证或内容。

窗口沿用现有同步 I/O 的协作式超时语义:在途操作允许退出,迟于恢复窗口返回的成功不会被接受;不声称能在任意 socket 阶段强制硬取消。永久缺表仍会在窗口耗尽后失败,此改动不替代数据库一致性配置核查。

验证:

  • Python 全套测试 498 passed,包含提交前/提交后错误、相同幂等 key 无重复、读取/检索恢复、跨分片共享窗口、I/O 耗时扣减、迟到成功拒绝、窗口耗尽后再次请求恢复,以及脱敏断言。
  • CI 范围 Ruff 检查通过。
  • Helm 两种变体的 lint/render 通过;额外核对 0、2.5、5 的渲染环境值。
  • 未更新远程环境;真实并发验收需在用户 review、合并及后续镜像发布后执行。

@loveRhythm1990
loveRhythm1990 merged commit dd9fc73 into main Oct 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant