#10663·seaweedfs

[s3] 清理上传可能会导致损坏 [低风险]

作者: ruriww创建于 2026年8月9日更新于 2026年9月17日

当运行“ s3. clean.uploads” 时,该程序默认在管理员脚本工作人(weed scandold - config=master)中启用,它会清理“.uploads”下的文件并删除其内容。 成功上传会占用这些块, 然后在这些文件上进行元数据删除, 这样每个文件块只有一个引用者 。 如果删除“. uploads” 文件的元数据时出错, 管理员脚本将删除已完成文件中的块, 因为部分文件引用它们 。 错误仅以 V (1+) 记录, 而忽略 。 这是低风险的,因为元数据文件的删除必须失败,或者在删除目录之前S3服务器必须马上下线.

解决这个问题的最简单方法是在“.uploads”中浏览文件时查看“SeaweedFSUploadId”,以确定多块块是否组装成完整的文件。 如果此类文件存在, 只需删除元数据即可 。

另一个是使用文件员的“对象交易”请求,在完成上传时在锁下应用以下内容

  1. 将新版本与所有块合并
  2. 删除旧元数据
  3. 更新最新版本

一切运转有序,不回滚回出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出 如果步骤2失败,则上传失败并清理出流出版本. 如果误入歧途的版本没有被清理,那么它也可能造成并发症,但这种情况是事先存在的,超出了这一问题的范围。

示例补丁 < 细节>

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? diff -- git a/weed/ s3api/ s3api multipart finalize txn.go b/weed/s3api/s3api multipart finalize txn.go 互联网档案馆的存檔,存档日期2014-12-21. 新文件模式 100644 ---/dev/null (中文(简体) ). b/weed/s3api/s3api multip finalize txn.go 页面存档备份,存于互联网档案馆.

+包装 s3api

  • 进口 (
  • "时间"
  • “GitHub.com/海藻/海藻/杂草/glog”
  • “GitHub.com/海藻/海藻/we/pb”
  • “GitHub.com/海藻/海藻/海藻/pb/filer pb”
  • “GitHub.com/海藻/海藻/海藻/s3api/s3err” +) 数据
  • 键 +// 路由多路段 +// 对象在所有者文件器上进行交易,而不是三个单独的RPC: +// 组合键 +// 1. PUT .vers/ (完成对象) +// 2. DELETE /.uploads/(仅元数据) +// 3. 在 .vers上重现(将其显示为当前) +// 组合键 +/// 为什么存在而不是扩展路由Versioned Finalize: 帮助者是 +// 与 Copy Object 共享, 并创建DeleteMarker, 两者均没有上传 +// 目录或将其条目写入交易中。 保持多块 +/// 形状使这些调用站点不受影响。 +// 组合键 +// 为什么用 IsDeleteData=false 来删除上传目录: 多部分 +/// 对象的块是部分块。 完成的参考文献,它确实 +// 不是复制字节, 因此释放它们会破坏正在发表的对象 。 +// 在此交易之后, 上传目录已不存在, 所以 +/// s3. clean.uploads 没有什么可做的 . . . . . . .

内容来源: seaweedfs/seaweedfs