Skip to content

[r2cn] 排查 Git 对象未写入 S3 的原因并区分对象缺失与异常请求场景 #1894

Description

@benjamin-747

[任务] 排查 Git 对象未写入 S3 的原因并区分对象缺失与异常请求场景

[任务分值] 20 分

[背景描述]

在 Mega 系统中,Git 对象(如 blob / tree / commit / pack 等)在接收后需要被持久化存储到 S3 兼容的 Object Store 中,以保证:

  • Git 数据的可靠性与可恢复性
  • 后续构建、同步与历史回溯能力

近期发现存在如下异常现象:

  • 部分 Git 对象在访问时 无法从 S3 中读取
    • 目前系统无法明确区分:
    • 对象从未成功写入 S3
    • 对象曾存在但被错误删除
    • 请求本身就是一个不存在的 Git 对象(非法或重复请求)

导致的问题包括:

  • 上游服务无法准确判断错误类型
  • 前端 / 调用方只能收到模糊的 404 / 500
  • 排障成本高,难以定位是写入问题还是读取问题

因此,需要对 Git 对象写入与读取流程进行系统性排查,并在接口与日志层面 明确区分“对象不存在”与“系统异常” 两类情况

[需求描述]

  1. 排查 Git 对象未写入 S3 的原因
  • 回溯 Git 对象写入流程:

    • 接收 Git 请求
    • 对象解析 / 校验
    • 写入 S3 的实际调用
  • 排查可能的问题点:

    • 写入失败但未正确上报错误
    • 异步写入流程丢失
    • 重试 / 超时处理不完整
    • 对象被错误覆盖或跳过
  1. 区分“对象不存在”与“写入异常”
  • 在对象读取路径中明确区分:
    • S3 返回 NoSuchKey
    • 写入阶段从未成功
  • 对不同情况返回明确语义:
    • 正常对象不存在 → 明确 404(或业务态码)
    • 系统异常 / 写入失败 → 明确错误码与错误信息

[代码标准]

  1. 所有 PR 提交必须签署 Signed-off-by 和 使用 GPG 签名,即提交代码时(使用 git commit 命令时)至少使用 -s -S 两个参数,参考 Contributing Guide
  2. 所有 PR 提交必须通过 GitHub Actions 自动化测试,提交 PR 后请关注 GitHub Actions 结果;
  3. 代码注释均需要使用英文;

[PR 提交地址] 提交到 mega 仓库的 main 分支 `` 目录;

[开发指导]

  1. 认领任务参考 r2cn 开源实习计划 - 任务认领与确认;

[导师及邮箱] 请申请此题目的同学使用邮件联系导师,或加入到 R2CN Discord 后在 #p-meta 频道和导师交流。

  1. Quanyi Ma genedna@gmail.com
  2. Tianxing Ye yetianxing2014@gmail.com

[备注]

  1. 认领实习任务的同学,必须完成测试任务和注册流程,请参考: r2cn 开源实习计划 - 测试任务r2cn 开源实习计划 - 学生注册与审核

Metadata

Metadata

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions