Skip to content

Add non-empty S3 directory marker compatibility#997

Merged
qin-ctx merged 1 commit intomainfrom
fix_s3
Mar 26, 2026
Merged

Add non-empty S3 directory marker compatibility#997
qin-ctx merged 1 commit intomainfrom
fix_s3

Conversation

@zhoujh01
Copy link
Copy Markdown
Collaborator

背景

当前 AGFS 在 S3 上会通过目录 marker 来模拟目录语义,但不同的 S3 兼容后端对目录 marker 的要求并不一致:

  • 大多数标准 S3 / MinIO 场景可以接受 0 字节目录 marker
  • 部分后端(例如某些 VirtualHostStyle 场景下的 TOS)不接受 0 字节目录 marker
  • 还有一些场景希望完全采用原生 S3 prefix 语义,不需要持久化空目录

变更内容

1. 引入新的目录 marker 配置项

在 S3 配置中新增 directory_marker_mode,支持三种模式:

  • empty:写入 0 字节目录 marker,保留空目录语义
  • nonempty:写入非空目录 marker,适配拒绝 0 字节目录 marker 的后端
  • none:不创建目录 marker,使用更接近原生 S3 prefix 的目录语义

其中默认值保持为 empty,保证现有常见场景的行为不变。

2. 调整 Python -> AGFS 插件的配置下发

AGFSManager 现在只向 s3fs 插件下发 directory_marker_mode

3. 更新 Go 侧 s3fs 插件实现

s3fs 插件中补充了:

  • directory_marker_mode 的配置解析与合法性校验
  • 默认值归一化逻辑
  • 三种模式对应的目录 marker 创建行为
  • 不同模式下父目录存在性检查的差异处理

具体行为如下:

  • empty:创建 0 字节目录 marker,并继续要求父目录存在
  • nonempty:创建非空目录 marker,并继续要求父目录存在
  • none:跳过目录 marker 创建,同时不再强依赖父目录 marker 存在,更接近原生 S3 prefix 行为

4. 补充测试和文档

补充了 Python 和 Go 两侧测试,覆盖:

  • directory_marker_mode 默认值
  • 非法 mode 校验
  • AGFS 配置生成结果
  • 不同模式下 marker payload 的选择
  • 不同模式下父目录存在性校验逻辑

同时更新了中英文文档,补充三种模式的说明、适用场景和配置示例。

行为变化说明

  • 默认行为不变:directory_marker_mode 默认仍为 empty
  • 对于 TOS 等不接受 0 字节目录 marker 的后端,可以显式配置 nonempty
  • 对于希望使用纯 prefix 语义、且不需要空目录持久化的场景,可以使用 none
  • 旧的 nonempty_directory_marker 不再支持

兼容性说明

这是一次配置模型收敛:
对新配置 directory_marker_mode 提供完整支持;

 Add non-empty

Add S3 directory marker modes
@github-actions
Copy link
Copy Markdown

Failed to generate code suggestions for PR

@qin-ctx qin-ctx merged commit 2ec8558 into main Mar 26, 2026
12 checks passed
@qin-ctx qin-ctx deleted the fix_s3 branch March 26, 2026 08:37
@github-project-automation github-project-automation bot moved this from Backlog to Done in OpenViking project Mar 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants