#120663·ClickHouse

在注册 metadata.json 之前,Manifest-vs-manifest 方案冲突已抛出

作者: clickgapai创建于 2026年9月17日更新于 2026年9月17日
分析细节(证据、受影响的位置、影响)

为什么我们认为这是一个错误:IcebergCompaction::getPlan 在注册 metadata.json 结构之前遍历每个清单(Compaction.cpp:246 getManifestFileEntriesHandle)。每个清单头文件都通过 ManifestFileIterator.cpp:325 中的 SchemaSource::ManifestFile 进行处理,因此第一个将 schema_id 0 标记为 manifest_sourced_schema_ids 中(SchemaProcessor.cpp:519-520)。下一个清单的头文件不同,会触发 registered_from_manifest == true,其中 source == ManifestFile,并在 SchemaProcessor.cpp:463-467 中抛出错误。

为什么我们认为这是一个错误:IcebergCompaction::getPlan 在注册 metadata.json 结构之前遍历每个清单(Compaction.cpp:246 getManifestFileEntriesHandle)。每个清单头文件都通过 ManifestFileIterator.cpp:325 中的 SchemaSource::ManifestFile 进行处理,因此第一个将 schema_id 0 标记为 manifest_sourced_schema_ids 中(SchemaProcessor.cpp:519-520)。下一个清单的头文件不同,会触发 registered_from_manifest == true,其中 source == ManifestFile,并在 SchemaProcessor.cpp:463-467 中抛出错误。

受影响的位置:

  • src/Storages/ObjectStorage/DataLakes/Iceberg/SchemaProcessor.cpp:441registered_from_manifest 代表“metadata.json 不定义它”
  • src/Storages/ObjectStorage/DataLakes/Iceberg/SchemaProcessor.cpp:463 — 抛出错误的消息声称 metadata.json 不定义该 schema_id
  • src/Storages/ObjectStorage/DataLakes/Iceberg/Compaction.cpp:540metadata.json 结构在 :246 之后注册,在清单遍历之前

影响:OPTIMIZE TABLE ... MANIFEST 会拒绝在 PR 目标的表格形状上,即写入器在表格生命周期的某个阶段开始发出降级的清单头文件,因此旧和新的清单不一致。应该容忍冲突的设置对该路径没有影响,错误文本告诉操作员他们的 metadata.json 有错误,让他们寻找不存在的损坏。同一表格的读取正常工作,因此表格不是不可用;对其的清单压缩是。仅在 allow_experimental_iceberg_compaction = 1 可用

内容来源: ClickHouse/ClickHouse