Files
orbit/docs/reports/phase-6-archive-scheduler.md

5.0 KiB
Raw Permalink Blame History

P6:周期归档、持久作业与管理页面

日期:2026-09-23。变更基于 6eb429e,新增 Schema 31。范围为通用周期归档,不包含源数据删除。

交付内容

  • 每个命名空间七类独立周期计划,保存策略版本、卷身份、周期、批大小、容量、触发时间和未结清作业占位。
  • 作业状态与随机租约持久化;周期错过合并一次;失败占位,管理员可原作业重试或关闭。变更、人工操作、作业受理和终态审计同事务。
  • 卷身份文件、全卷锁与作业锁;每轮一个文件批次;固定作业身份,验证文件链与数据库已确认前缀后继续。文件先发布后确认,提交不明时保留原状态恢复。
  • 单作业和全卷逻辑文件容量上限,目录按 256 个条目分块扫描,最多 100000 项;不删除文件腾空间。
  • 独立「归档作业」页面:周期表单、七类启停概况、本页待处理与根记录数、作业分页、校验摘要、失败解释、原作业恢复/关闭。沿用单管理员登录。
  • 部署、接口与恢复操作示例;文件格式与独立 CLI 兼容。

验证证据

场景 实际验证
并发触发 真实 MySQL,8 个独立存储调用竞争同一到期计划,仅生成 1 个作业
并发领取 8 个竞争者仅一个有效租约;过期后换代领取,原代次确认返回状态冲突
文件/数据库确认间隙 首批 2 条审计已持久化,尚未确认数据库;控制测试将租约设为过期,新代次确认文件前缀,再完成末批,最终 2 批/3 条、同一 ID,离线摘要一致
文件损坏 损坏首批后停止,数据库保留原确认的批数与摘要;恢复原字节后以原 ID 重试,重复操作只留一条重试审计
策略变化 修改保留窗口后旧作业以 POLICY_CHANGED 停止;旧计划不再触发,关闭旧作业并确认新策略版本后才创建后续作业
暂停周期 已在执行的作业可正常结清,停止新周期触发
容量与分页 3 条各含 600000 字节正文的真实审计;1 MiB 预算停止,提高到 4 MiB 后原作业完成;独立全卷预算阻止新输出;26 个作业分 20+6 两页,无重复
文件与卷约束 单测覆盖数据库链前缀不符、原目录缺失、卷身份不符、初始化临时文件恢复、另一节点持锁时启动、忙卷不调度、目录分块计数与符号链接拒绝
身份与来源限制 未登录、只有 Bearer、跨命名空间和跨来源写操作拒绝;普通列表不返回租约代次
容器端到端 隔离 MySQL + Orbit 镜像,管理员登录、策略保存、周期保存/原键重放、后台生成归档、SUCCEEDED 和摘要、登出后 401;原 Worker/重试/计划及独立离线归档核验仍通过
浏览器实际操作 隔离测试账号从页面选择审计类别、保存周期,自动完成 2 批/3 条;制造 1 MiB 容量失败,页面填写原因提高到 4 MiB,原作业完成 3 批/5 条;失败计数从1回到0,旧周期结果保留
数据模型 当前基线与前向迁移无外键;历史升级保留原数据和既有索引;归档后源审计仍完整

本批覆盖的是数据库竞争、受控过期与文件确认间隙,不把修改测试租约截止等同于生产等待五分钟或真实跨机房切换。独立 CLI 的实际 SIGKILL 恢复证据见文件归档报告。

回归入口

  • make test vet build docs-check:通过。
  • make console-e2e:通过;首次运行发现 HTTP 路由范围冲突,修复后重跑通过,已加入路由注册/认证/跨来源回归。
  • go test -race -count=1 -run '^TestIntegrationArchive' -v ./internal/storage/mysql(隔离数据库):3 个专项全部通过;最终目录分块扫描实现再次通过此回归。
  • 最终文件执行器、配置和 HTTP 包的 go test -race:通过。
  • make integration:通过。存储全量 305.578 秒,最终 SDK 进程故障组 132.167 秒、流程暂停全停组 12.906 秒;旧 Worker、订阅、调度、流程和两个独立业务模块回归通过。

新增容量夹具最初使用 UPDATE 填充旧审计,被已有 append-only 触发器拒绝;已修正为插入时写入大正文,未放宽审计不可改写约束。

当前边界

  • 每次周期是新的候选快照,跨作业可能重复归档同一源记录。只有作业内分页固定截止和位置。
  • 保留策略调整不会自动改变旧作业;关闭失败作业保留全部文件和历史。
  • 首份清单写入前中断时,恢复不会重建缺失目录,需核查后关闭旧作业再生成新作业。
  • 根目录物理空间、备份介质、对象存储与源库清理不在本批交付内;容量上限按逻辑文件字节计,不替代文件系统配额。
  • 同卷接管要求所有节点访问同一支持所需 POSIX 语义的物理卷。隔离测试和本机 Docker 结果不代表任意网络文件系统或目标生产跨故障域验收。