Implement or remove spec.storage.retainOnDelete #10

Closed
opened 2026-07-28 12:21:31 +09:00 by FLYEMOJ1 · 1 comment
FLYEMOJ1 commented 2026-07-28 12:21:31 +09:00 (Migrated from github.com)

问题

spec.storage.retainOnDelete 通过 CRD 校验、随 CRD 发布,但没有任何 controller 读它。

设成 true 描述的是本来就会发生的事 —— world PVC 是 StatefulSet 的 VolumeClaimTemplate,删除 StatefulSet 不会级联删除模板 PVC,operator 里也没有任何 finalizer。设成 false 是更糟的那一半:它读起来像是"请删掉这个世界",实际被静默忽略。

证据

Identified by Claude Opus 5 (claude-opus-5) while auditing the CRD's declared-but-unread fields on 2026-07-28.

  • internal/apis/felis/v1alpha1/minecraftserver_types.go:195-196 — 字段声明:
// RetainOnDelete keeps the PVC when the MinecraftServer is deleted.
RetainOnDelete bool `json:"retainOnDelete,omitempty"`
  • deploy/crd/felis.lolicon.best_minecraftservers.yaml:272-273 — 随 CRD 发布并参与校验
  • docs/troubleshooting.md:493 把它列为 [INERT],是那张表里唯一一个真正没人读的字段

controller 侧无命中。

验收

二选一,不留第三种状态:operator 真的按这个字段决定 PVC 的去留(需要 finalizer),或者把字段从类型和 CRD 里删掉。

备注

冻结的 Felis-Spec-V4.1.md §5 要求的是前者:「删除:finalizer 清 Service/STS/ConfigMap,PVC 按 retainOnDelete」。但那个 finalizer 列出的另外三件事(Service / StatefulSet / ConfigMap)ownerReference GC 已经在做,所以它唯一新增的动作就是删世界 —— 而这条路径不经过 reaper 的「先证明有备份」检查。reaper 是系统里唯一被允许销毁世界的东西,它靠先验证备份换来这个权限。开第二扇不做这个检查的门不是改进。

选哪条需要拍板,因为删字段就是偏离一份冻结的版本化文档。


正文更正于 2026-07-28:本条原先误贴了 #9(per-credential UV)的正文,标题一直是对的。

## 问题 `spec.storage.retainOnDelete` 通过 CRD 校验、随 CRD 发布,但没有任何 controller 读它。 设成 `true` 描述的是本来就会发生的事 —— world PVC 是 StatefulSet 的 VolumeClaimTemplate,删除 StatefulSet 不会级联删除模板 PVC,operator 里也没有任何 finalizer。设成 `false` 是更糟的那一半:它读起来像是"请删掉这个世界",实际被静默忽略。 ## 证据 Identified by Claude Opus 5 (claude-opus-5) while auditing the CRD's declared-but-unread fields on 2026-07-28. - `internal/apis/felis/v1alpha1/minecraftserver_types.go:195-196` — 字段声明: ```go // RetainOnDelete keeps the PVC when the MinecraftServer is deleted. RetainOnDelete bool `json:"retainOnDelete,omitempty"` ``` - `deploy/crd/felis.lolicon.best_minecraftservers.yaml:272-273` — 随 CRD 发布并参与校验 - `docs/troubleshooting.md:493` 把它列为 **[INERT]**,是那张表里唯一一个真正没人读的字段 controller 侧无命中。 ## 验收 二选一,不留第三种状态:operator 真的按这个字段决定 PVC 的去留(需要 finalizer),或者把字段从类型和 CRD 里删掉。 ## 备注 冻结的 `Felis-Spec-V4.1.md §5` 要求的是前者:「删除:finalizer 清 Service/STS/ConfigMap,PVC 按 retainOnDelete」。但那个 finalizer 列出的另外三件事(Service / StatefulSet / ConfigMap)ownerReference GC 已经在做,所以它唯一新增的动作就是删世界 —— 而这条路径不经过 reaper 的「先证明有备份」检查。reaper 是系统里唯一被允许销毁世界的东西,它靠先验证备份换来这个权限。开第二扇不做这个检查的门不是改进。 选哪条需要拍板,因为删字段就是偏离一份冻结的版本化文档。 --- *正文更正于 2026-07-28:本条原先误贴了 #9(per-credential UV)的正文,标题一直是对的。*
Lemon-miaow commented 2026-09-24 12:02:18 +09:00 (Migrated from github.com)

已按「移除」落地(23792d6):RetainOnDelete 从类型与 CRD 全仓删除;docs/troubleshooting.md §13 记录了移除而非实现的理由——实现它等于新增一条绕过 reaper「先验证备份再删世界」的删除路径,而 spec 里其余 finalizer 职责(Service/StatefulSet/ConfigMap)本由 ownerReference GC 覆盖。CR 上残留的键由 apiserver 静默 prune,行为不变。复核:grep -rn RetainOnDelete 全仓 0 命中(文档历史叙述除外)。

已按「移除」落地(`23792d6`):`RetainOnDelete` 从类型与 CRD 全仓删除;`docs/troubleshooting.md` §13 记录了移除而非实现的理由——实现它等于新增一条绕过 reaper「先验证备份再删世界」的删除路径,而 spec 里其余 finalizer 职责(Service/StatefulSet/ConfigMap)本由 ownerReference GC 覆盖。CR 上残留的键由 apiserver 静默 prune,行为不变。复核:`grep -rn RetainOnDelete` 全仓 0 命中(文档历史叙述除外)。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: FelisMC/Felis#10