Rust CLI / 自动化对象清单

自动化 S3 list / diff CLI

一个聚焦的大桶 list / diff 工具:列举、对比、输出 Parquet;前缀发现、运行时拆分、dry-run plan 和运行记录由默认路径完成。

Rust · Apache-2.0 · v0.20.0 · S3-compatible · Parquet · Agent-safe JSON

当前证据

1M 对象,-c 8 约 19s

最新 README 引用的第三方 Alibaba Cloud OSS 测试。现在的重点不是让用户先调参数,而是默认启动发现、运行时拆分和可校验产物。

1M 对象Alibaba Cloud OSSv0.20.0
benchmark1M objects

Alibaba Cloud OSS 第三方测试

speedup~55s to ~19s

single stream vs -c 8

releaseApache-2.0

v0.20.0 起

测试路径约 objects/s
single stream
18,18255s
-c 8 automatic
52,63219s
默认自动化路径
  1. 启动发现真实前缀边界
  2. 运行时按吞吐拆分长尾片段
  3. 写出 Parquet、plan、运行记录和 trace

图表只展示测试数据;自动化能力放在流程里说明,避免混淆。

输出:Parquet · key-space CSV · NDJSON · TSV · run manifestStartup discovery + throughput-aware runtime splitting
默认启动发现按吞吐拆分长尾片段dry-run plan可校验运行记录

内部视角

默认路径自动完成繁琐部分

s3-turbo-list 现在更像一个自动化对象清单 / diff 工具:启动发现、运行时拆分、dry-run plan、运行记录和产物校验都在默认路径里。

s3-turbo-list v0.20.0自动对象清单路径
自动发现零 hints

第一次递归 list 就能并发

OSS benchmark~19s

1M 对象,-c 8

协议Apache-2.0

v0.20.0 起

preflightdoctor --json · --dry-run --agent · --plan-json
产物Parquet · key-space CSV · run manifest · trace JSONL
verifymanifest-summary --check · hashes · row counts · schema
服务商日志app/s3-turbo-list User-Agent · compat-probe

证据链

从发现到校验,一次运行闭环

s3-turbo-list 的重点不是多给参数,而是把大型对象存储 list / diff 里最容易出错的步骤收进默认路径。

01

启动发现

少量 delimiter probe 找真实前缀边界,第一次递归 list 也能并发。

02

吞吐拆分

运行时只在吞吐继续上升时拆分长尾片段,把并发当上限。

03

产物校验

Parquet、运行记录、hash、行数和 schema 元数据让结果能被 CI 和 agent 复查。

第三方 OSS 测试1M 对象
single stream55s

18,182 objects/s

-c 8 automatic19s

52,632 objects/s

它解决什么

什么时候用

需要列举很大的 S3 兼容桶,或对比两个桶,但不想先设计分区方案,也不想调一堆参数。

它不是什么

不是备份工具、同步引擎或图形化存储浏览器。它只做自动 list、可靠 diff 和机器可读证据。

哪里保持简单

第一次运行不需要 hints 文件。默认路径负责并发;Parquet、运行记录、trace JSONL 和稳定退出码负责后续检查。

自动化路径

自动发现 key 空间

启动时用少量 delimiter probe 找真实前缀边界并缓存,第一次递归 list 就能并发运行。

按吞吐展开并发

运行时拆分长尾片段;只有吞吐继续上升时才增加并发,把并发数当上限而不是目标。

有界 diff

两侧桶并行列举,按 key 顺序流式合并,写出带 `DiffFlag` 的 Parquet,不把两边 key 全放进内存。

自适应 Parquet 输出

受限于服务商吞吐时保持单文件;只有 Parquet 编码成为瓶颈时,才扩展成多个 part-file writer。

Dry-run plan

`--dry-run --agent` 和 `--plan-json` 在不访问 S3 的情况下输出配置来源、计划产物、warning 和文件冲突。

Run manifest

`--run-manifest` 记录状态、指标、产物、warning、SHA256、Parquet 行数和 schema 元数据。

稳定退出码

把参数校验、服务商配置、网络、输出、数据校验和中断分成稳定退出码,方便 CI 和 agent 接入。

服务商 trace

`compat-probe` 和 `--trace-compat` 在扩大扫描前暴露端点行为和真实 S3 API 调用。

为什么做

产品核心是自动化

对象存储工作经常从两个问题开始:这个桶里有什么?它和另一个桶有什么不同?难点不是继续加参数,而是让默认路径足够快、足够清楚、能被自动化系统信任。

s3-turbo-list 刻意保持命令面很小:发现结构、调整并发、写出可分析产物,并提供 JSON plan 和运行记录,让人、CI 和 agent 都能判断一次运行是否可信。

一次运行

01

Preflight

先跑 `doctor --json`、`doctor --simple` 或 `--dry-run --agent`,在访问 S3 前解析配置、输出路径和 warning。

02

List / Diff

直接 list 或 diff;启动发现和 hints cache 会自动提供并发片段。

03

Verify

写出运行记录,再用 `manifest-summary --check` 检查状态、hash、行数、schema 和退出分类。

04

Analyze

用 DuckDB、pandas 或 pyarrow 读取 Parquet;需要流式处理时输出 TSV / NDJSON。

实际用法

第一次对象清单

只给桶和 region 跑 `list`,启动发现会自动找边界,输出 Parquet 和 key 空间计数。

Agent preflight

扫描前生成 dry-run JSON plan,让 agent 先检查 warning、计划产物和配置来源。

迁移 diff

把源端和目标端 diff 成一份带 `DiffFlag` 的 Parquet,下游再过滤变更、左侧独有和右侧独有对象。

兼容端点

面向真实 S3 兼容端点

AWS S3MinIOCloudflare R2BOSOSSB2

先用端点 preset、compat-probe、trace JSONL 和服务商 warning 摸清行为,再扩大扫描规模。

问题与用法

为什么不用 aws s3 ls?

小桶当然可以。s3-turbo-list 面向大桶:默认路径要能自动发现结构、并发列举,并留下结构化产物。

必须提前准备 hints 吗?

不需要。启动发现会探测真实 `CommonPrefixes` 边界并缓存。hints 文件只是重复生成对象清单时的可选控制。

v0.20.0 变了什么?

这版修复 root segment retry 的续扫边界,给运行时 split probe 加 timeout,并避免干净中断把 run manifest 的 fatal errors 计高。项目仍然是 Apache-2.0。

先做 dry-run plan

打开仓库