From 72a2ef91ed25e334699391f0bfac4c2c69edd296 Mon Sep 17 00:00:00 2001 From: Li Jiajia Date: Sun, 4 Jan 2026 15:36:18 +0800 Subject: [PATCH 1/3] feat(rest): build resource paths after get config. --- src/iceberg/catalog/rest/resource_paths.cc | 4 ++-- src/iceberg/catalog/rest/resource_paths.h | 3 +-- src/iceberg/catalog/rest/rest_catalog.cc | 14 +++++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/iceberg/catalog/rest/resource_paths.cc b/src/iceberg/catalog/rest/resource_paths.cc index 462b03763..63b531691 100644 --- a/src/iceberg/catalog/rest/resource_paths.cc +++ b/src/iceberg/catalog/rest/resource_paths.cc @@ -46,8 +46,8 @@ Status ResourcePaths::SetBaseUri(const std::string& base_uri) { return {}; } -Result ResourcePaths::Config() const { - return std::format("{}/v1/config", base_uri_); +Result ResourcePaths::Config(const std::string& base_uri) { + return std::format("{}/v1/config", base_uri); } Result ResourcePaths::OAuth2Tokens() const { diff --git a/src/iceberg/catalog/rest/resource_paths.h b/src/iceberg/catalog/rest/resource_paths.h index 069711794..9edd62ec9 100644 --- a/src/iceberg/catalog/rest/resource_paths.h +++ b/src/iceberg/catalog/rest/resource_paths.h @@ -23,7 +23,6 @@ #include #include "iceberg/catalog/rest/iceberg_rest_export.h" -#include "iceberg/catalog/rest/type_fwd.h" #include "iceberg/result.h" #include "iceberg/type_fwd.h" @@ -48,7 +47,7 @@ class ICEBERG_REST_EXPORT ResourcePaths { Status SetBaseUri(const std::string& base_uri); /// \brief Get the /v1/config endpoint path. - Result Config() const; + static Result Config(const std::string& base_uri); /// \brief Get the /v1/{prefix}/oauth/tokens endpoint path. Result OAuth2Tokens() const; diff --git a/src/iceberg/catalog/rest/rest_catalog.cc b/src/iceberg/catalog/rest/rest_catalog.cc index cbd38c5ae..d880e8f20 100644 --- a/src/iceberg/catalog/rest/rest_catalog.cc +++ b/src/iceberg/catalog/rest/rest_catalog.cc @@ -63,9 +63,8 @@ std::unordered_set GetDefaultEndpoints() { } /// \brief Fetch server config and merge it with client config -Result FetchServerConfig(const ResourcePaths& paths, +Result FetchServerConfig(const std::string& config_path, const RestCatalogProperties& current_config) { - ICEBERG_ASSIGN_OR_RAISE(auto config_path, paths.Config()); HttpClient client(current_config.ExtractHeaders()); ICEBERG_ASSIGN_OR_RAISE(const auto response, client.Get(config_path, /*params=*/{}, /*headers=*/{}, @@ -111,10 +110,9 @@ Result> RestCatalog::Make( if (!file_io) { return InvalidArgument("FileIO is required to create RestCatalog"); } - ICEBERG_ASSIGN_OR_RAISE( - auto paths, ResourcePaths::Make(std::string(TrimTrailingSlash(uri)), - config.Get(RestCatalogProperties::kPrefix))); - ICEBERG_ASSIGN_OR_RAISE(auto server_config, FetchServerConfig(*paths, config)); + ICEBERG_ASSIGN_OR_RAISE(auto config_uri, + ResourcePaths::Config(std::string(TrimTrailingSlash(uri)))); + ICEBERG_ASSIGN_OR_RAISE(auto server_config, FetchServerConfig(config_uri, config)); std::unique_ptr final_config = RestCatalogProperties::FromMap( MergeConfigs(server_config.defaults, config.configs(), server_config.overrides)); @@ -132,7 +130,9 @@ Result> RestCatalog::Make( // Update resource paths based on the final config ICEBERG_ASSIGN_OR_RAISE(auto final_uri, final_config->Uri()); - ICEBERG_RETURN_UNEXPECTED(paths->SetBaseUri(std::string(TrimTrailingSlash(final_uri)))); + ICEBERG_ASSIGN_OR_RAISE( + auto paths, ResourcePaths::Make(std::string(TrimTrailingSlash(final_uri)), + final_config->Get(RestCatalogProperties::kPrefix))); return std::shared_ptr( new RestCatalog(std::move(final_config), std::move(file_io), std::move(paths), From 6c7b2cf1e414b41014f6b25f975e078f2cf4830e Mon Sep 17 00:00:00 2001 From: Li Jiajia Date: Mon, 5 Jan 2026 21:35:55 +0800 Subject: [PATCH 2/3] remove SetBaseUri in ResourcePaths --- src/iceberg/catalog/rest/resource_paths.cc | 8 -------- src/iceberg/catalog/rest/resource_paths.h | 3 --- 2 files changed, 11 deletions(-) diff --git a/src/iceberg/catalog/rest/resource_paths.cc b/src/iceberg/catalog/rest/resource_paths.cc index 63b531691..16323a9db 100644 --- a/src/iceberg/catalog/rest/resource_paths.cc +++ b/src/iceberg/catalog/rest/resource_paths.cc @@ -38,14 +38,6 @@ Result> ResourcePaths::Make(std::string base_uri, ResourcePaths::ResourcePaths(std::string base_uri, const std::string& prefix) : base_uri_(std::move(base_uri)), prefix_(prefix.empty() ? "" : (prefix + "/")) {} -Status ResourcePaths::SetBaseUri(const std::string& base_uri) { - if (base_uri.empty()) { - return InvalidArgument("Base URI is empty"); - } - base_uri_ = base_uri; - return {}; -} - Result ResourcePaths::Config(const std::string& base_uri) { return std::format("{}/v1/config", base_uri); } diff --git a/src/iceberg/catalog/rest/resource_paths.h b/src/iceberg/catalog/rest/resource_paths.h index 9edd62ec9..7432e4d16 100644 --- a/src/iceberg/catalog/rest/resource_paths.h +++ b/src/iceberg/catalog/rest/resource_paths.h @@ -43,9 +43,6 @@ class ICEBERG_REST_EXPORT ResourcePaths { static Result> Make(std::string base_uri, const std::string& prefix); - /// \brief Set the base URI of the REST catalog server. - Status SetBaseUri(const std::string& base_uri); - /// \brief Get the /v1/config endpoint path. static Result Config(const std::string& base_uri); From 3edf52c2bd6a23f6b0b252b086e86de0ff1a311c Mon Sep 17 00:00:00 2001 From: Li Jiajia Date: Mon, 5 Jan 2026 23:57:34 +0800 Subject: [PATCH 3/3] revert changing ResourcePaths:Config() --- src/iceberg/catalog/rest/resource_paths.cc | 4 ++-- src/iceberg/catalog/rest/resource_paths.h | 2 +- src/iceberg/catalog/rest/rest_catalog.cc | 14 ++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/iceberg/catalog/rest/resource_paths.cc b/src/iceberg/catalog/rest/resource_paths.cc index 16323a9db..f86a75ec0 100644 --- a/src/iceberg/catalog/rest/resource_paths.cc +++ b/src/iceberg/catalog/rest/resource_paths.cc @@ -38,8 +38,8 @@ Result> ResourcePaths::Make(std::string base_uri, ResourcePaths::ResourcePaths(std::string base_uri, const std::string& prefix) : base_uri_(std::move(base_uri)), prefix_(prefix.empty() ? "" : (prefix + "/")) {} -Result ResourcePaths::Config(const std::string& base_uri) { - return std::format("{}/v1/config", base_uri); +Result ResourcePaths::Config() const { + return std::format("{}/v1/config", base_uri_); } Result ResourcePaths::OAuth2Tokens() const { diff --git a/src/iceberg/catalog/rest/resource_paths.h b/src/iceberg/catalog/rest/resource_paths.h index 7432e4d16..1b502aaa7 100644 --- a/src/iceberg/catalog/rest/resource_paths.h +++ b/src/iceberg/catalog/rest/resource_paths.h @@ -44,7 +44,7 @@ class ICEBERG_REST_EXPORT ResourcePaths { const std::string& prefix); /// \brief Get the /v1/config endpoint path. - static Result Config(const std::string& base_uri); + Result Config() const; /// \brief Get the /v1/{prefix}/oauth/tokens endpoint path. Result OAuth2Tokens() const; diff --git a/src/iceberg/catalog/rest/rest_catalog.cc b/src/iceberg/catalog/rest/rest_catalog.cc index d880e8f20..d75da6404 100644 --- a/src/iceberg/catalog/rest/rest_catalog.cc +++ b/src/iceberg/catalog/rest/rest_catalog.cc @@ -63,8 +63,9 @@ std::unordered_set GetDefaultEndpoints() { } /// \brief Fetch server config and merge it with client config -Result FetchServerConfig(const std::string& config_path, +Result FetchServerConfig(const ResourcePaths& paths, const RestCatalogProperties& current_config) { + ICEBERG_ASSIGN_OR_RAISE(auto config_path, paths.Config()); HttpClient client(current_config.ExtractHeaders()); ICEBERG_ASSIGN_OR_RAISE(const auto response, client.Get(config_path, /*params=*/{}, /*headers=*/{}, @@ -110,9 +111,10 @@ Result> RestCatalog::Make( if (!file_io) { return InvalidArgument("FileIO is required to create RestCatalog"); } - ICEBERG_ASSIGN_OR_RAISE(auto config_uri, - ResourcePaths::Config(std::string(TrimTrailingSlash(uri)))); - ICEBERG_ASSIGN_OR_RAISE(auto server_config, FetchServerConfig(config_uri, config)); + ICEBERG_ASSIGN_OR_RAISE( + auto paths, ResourcePaths::Make(std::string(TrimTrailingSlash(uri)), + config.Get(RestCatalogProperties::kPrefix))); + ICEBERG_ASSIGN_OR_RAISE(auto server_config, FetchServerConfig(*paths, config)); std::unique_ptr final_config = RestCatalogProperties::FromMap( MergeConfigs(server_config.defaults, config.configs(), server_config.overrides)); @@ -131,8 +133,8 @@ Result> RestCatalog::Make( // Update resource paths based on the final config ICEBERG_ASSIGN_OR_RAISE(auto final_uri, final_config->Uri()); ICEBERG_ASSIGN_OR_RAISE( - auto paths, ResourcePaths::Make(std::string(TrimTrailingSlash(final_uri)), - final_config->Get(RestCatalogProperties::kPrefix))); + paths, ResourcePaths::Make(std::string(TrimTrailingSlash(final_uri)), + final_config->Get(RestCatalogProperties::kPrefix))); return std::shared_ptr( new RestCatalog(std::move(final_config), std::move(file_io), std::move(paths),