在注册 metadata.json 之前,Manifest-vs-manifest 方案冲突已抛出
为什么我们认为这是一个错误: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:441—registered_from_manifest代表“metadata.json 不定义它”src/Storages/ObjectStorage/DataLakes/Iceberg/SchemaProcessor.cpp:463— 抛出错误的消息声称metadata.json不定义该schema_idsrc/Storages/ObjectStorage/DataLakes/Iceberg/Compaction.cpp:540—metadata.json结构在:246之后注册,在清单遍历之前
影响:OPTIMIZE TABLE ... MANIFEST 会拒绝在 PR 目标的表格形状上,即写入器在表格生命周期的某个阶段开始发出降级的清单头文件,因此旧和新的清单不一致。应该容忍冲突的设置对该路径没有影响,错误文本告诉操作员他们的 metadata.json 有错误,让他们寻找不存在的损坏。同一表格的读取正常工作,因此表格不是不可用;对其的清单压缩是。仅在 allow_experimental_iceberg_compaction = 1 可用
内容来源: ClickHouse/ClickHouse