Antalya 26.6: Iceberg: support external paths in tables - #2154
Open
zvonand wants to merge 2 commits into
Open
Conversation
…olution in next commit)
Kept the antalya-26.6 side for everything outside the source PR's scope (older cluster-protocol version list, non-lambda iceberg_metadata_log->add, 4-arg createReadBuffer, string-path tryGetObjectMetadata/getObjectMetadata, try/catch around generateManifestList in Mutations, no manifest-only compaction) and applied the PR's changes on top of it. Also removed the upstream 26.7/26.8 SettingsChangesHistory blocks that the three-way merge re-introduced into antalya-26.6's registry, and uncommented the existing Antalya placeholder row for the PR's new setting instead of adding a duplicate. Adapted: ObjectInfo::getIdentifierForPath(path) added on antalya-26.6 (getIdentifier() refactored to use it) because the PR's getSchedulingIdentifier() relies on that accessor, which only exists upstream Adapted: createReadBuffer / tryGetObjectMetadata / getObjectMetadata call sites keep antalya-26.6's argument shapes (string path, no read_settings/headers args) and only swap the object storage for the resolved one Adapted: generateManifestList call sites keep antalya-26.6's signature (per-call content_type, no per_entry_content_types) and only pass the new secondary_storages argument Adapted: manifest_file_cache_keys.emplace_back keeps antalya-26.6's 5-field ManifestFileCacheKey (no partition_spec_id) Adapted: Iceberg/Utils.h needs an explicit #include <optional> for the new always-available declarations, since antalya-26.6 had it only inside the USE_AVRO block Dropped: manifest-only compaction integration (compactIcebergManifests, writeConsolidatedManifestFile, isCurrentManifestListAboveThreshold, IcebergMetadata::optimizeManifestFiles) — that feature is not on antalya-26.6, only the PR's edits to it were dropped Dropped: query-condition-cache keying by the Iceberg metadata path (makeQueryConditionCacheKey, ObjectInfo::getIdentifier(bool)/getIdentifierForPath(path, bool) overloads) — depends on upstream query-condition-cache/ETag work not on antalya-26.6 Dropped: gtest_storage_object_storage_archive.cpp update — that test file does not exist on antalya-26.6
27 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changelog category (leave one):
Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md):
Support Iceberg tables that have files outside table location or on different storage (ClickHouse#90740 by @zvonand).
Cherry-picked from ClickHouse#90740.
Closes ClickHouse#84609
Current logic is that all table files (data files, manifests, manifest lists) shall be "inside" the table location, in the same storage. This PR abandons that logic: now files can be located anywhere, even on a different storage type (e.g. all metadata is on s3, data file in in local storage).
In some cases, that old logic shoots back: even incorrect (non-existing) paths, i.e. with redundant items in a prefix were parsed in such a way that files from another locations were read (
/path/to/itemwas read when the specified location was/path/to/to/itemor vice versa)Documentation entry for user-facing changes
Note
High Risk
Touches Iceberg metadata iteration/compaction/expiry and distributed cluster-function serialization, plus adds dynamic secondary storage creation and optional credential propagation; regressions could lead to wrong files being read or deleted across storages/endpoints.
Overview
Enables Iceberg tables to reference absolute paths and files outside the table location, including files stored on different object storage backends (S3/Azure/HDFS/local). Iceberg manifest/manifest-list handling is updated to treat metadata paths as absolute URIs, resolve them at read/delete time via new object-storage utilities, and carry resolved storage info through iterators/transforms/compaction/expire-snapshots.
Bumps cluster-function processing protocol to add Iceberg absolute-path support and extends
IcebergObjectSerializableInfoto transmit both the metadata path and absolute path (with a coordinator-side guard for old workers when external storage is required). Also adds_path/task distribution handling to prefer absolute paths when available.Introduces new object-storage helpers (
SchemeAuthorityKey,makeAbsolutePath,resolveObjectStorageForPath,SecondaryStorages) and a settings3_propagate_credentials_to_other_storagesto optionally copy base S3 credentials when creating secondary storages. Adds an integration test covering multi-storage Iceberg layouts and updates existing test metadata paths accordingly.Written by Cursor Bugbot for commit 66d1acc. This will update automatically on new commits. Configure here.