diff options
| -rw-r--r-- | yt/yt/client/cache/cache.cpp | 73 | ||||
| -rw-r--r-- | yt/yt/client/cache/cache.h | 4 | ||||
| -rw-r--r-- | yt/yt/client/cache/config.cpp | 6 | ||||
| -rw-r--r-- | yt/yt/client/cache/config.h | 4 | ||||
| -rw-r--r-- | yt/yt/client/cache/unittests/cache_ut.cpp | 22 | ||||
| -rw-r--r-- | yt/yt/client/federated/cache.cpp | 9 |
6 files changed, 60 insertions, 58 deletions
diff --git a/yt/yt/client/cache/cache.cpp b/yt/yt/client/cache/cache.cpp index a866a16baa2..c466dacd9ef 100644 --- a/yt/yt/client/cache/cache.cpp +++ b/yt/yt/client/cache/cache.cpp @@ -29,52 +29,25 @@ TClientsCacheConfigPtr GetClustersConfigWithNormalClusterName(const TClientsCach YT_VERIFY(config); auto newConfig = New<TClientsCacheConfig>(); - newConfig->DefaultConfig = CloneYsonStruct(config->DefaultConfig, /*postprocess*/ false, /*setDefaults*/ false); - for (const auto& [clusterName, clusterConfig] : config->ClusterConfigs) { - newConfig->ClusterConfigs[ToString(GetNormalClusterName(clusterName))] = - CloneYsonStruct(clusterConfig, /*postprocess*/ false, /*setDefaults*/ false); + newConfig->DefaultConnection = CloneYsonStruct( + config->DefaultConnection, + /*postprocess*/ false, + /*setDefaults*/ false); + for (const auto& [cluster, connection] : config->PerClusterConnection) { + newConfig->PerClusterConnection[ToString(GetNormalClusterName(cluster))] = + CloneYsonStruct(connection, /*postprocess*/ false, /*setDefaults*/ false); } return newConfig; } //////////////////////////////////////////////////////////////////////////////// -} // namespace - -TConnectionConfigPtr MakeClusterConfig( - const TClientsCacheConfigPtr& clustersConfig, - TStringBuf clusterUrl) -{ - auto [cluster, proxyRole] = ExtractClusterAndProxyRole(clusterUrl); - auto it = clustersConfig->ClusterConfigs.find(GetNormalClusterName(cluster)); - const bool useDefaultConfig = (it == clustersConfig->ClusterConfigs.end()); - const auto& config = useDefaultConfig ? clustersConfig->DefaultConfig : it->second; - - auto newConfig = config ? CloneYsonStruct(config, /*postprocess*/ false, /*setDefaults*/ false) : New<NApi::NRpcProxy::TConnectionConfig>(); - // Ignore cluster url from DefaultConfig, but use it from ClusterConfigs[_] if it is set. - if (useDefaultConfig || !newConfig->ClusterUrl.has_value() || newConfig->ClusterUrl->empty()) { - newConfig->ClusterUrl = ToString(cluster); - } - newConfig->ClusterName = InferYTClusterFromClusterUrl(*newConfig->ClusterUrl); - if (!proxyRole.empty()) { - newConfig->ProxyRole = ToString(proxyRole); - } - newConfig->Postprocess(); - return newConfig; -} - -//////////////////////////////////////////////////////////////////////////////// - -namespace { - -//////////////////////////////////////////////////////////////////////////////// - class TClientsCache : public TClientsCacheBase { public: TClientsCache(const TClientsCacheConfigPtr& config, const TClientsCacheAuthentificationOptionsPtr& clientsOptions) - : ClustersConfig_(GetClustersConfigWithNormalClusterName(config)) + : Config_(GetClustersConfigWithNormalClusterName(config)) , ClientsOptions_(clientsOptions) { } @@ -82,11 +55,11 @@ protected: NApi::IClientPtr CreateClient(TStringBuf clusterUrl) override { auto& options = ClientsOptions_->ClusterOptions.ValueRef(clusterUrl, ClientsOptions_->DefaultOptions); - return NCache::CreateClient(MakeClusterConfig(ClustersConfig_, clusterUrl), options); + return NCache::CreateClient(GetConnectionConfig(Config_, clusterUrl), options); } private: - const TClientsCacheConfigPtr ClustersConfig_; + const TClientsCacheConfigPtr Config_; const TClientsCacheAuthentificationOptionsPtr ClientsOptions_; }; @@ -113,7 +86,7 @@ IClientsCachePtr CreateClientsCache( const NApi::TClientOptions& options) { auto clustersConfig = New<TClientsCacheConfig>(); - clustersConfig->DefaultConfig = CloneYsonStruct(config, /*postprocess*/ false, /*setDefaults*/ false); + clustersConfig->DefaultConnection = CloneYsonStruct(config, /*postprocess*/ false, /*setDefaults*/ false); return CreateClientsCache(clustersConfig, options); } @@ -134,6 +107,30 @@ IClientsCachePtr CreateClientsCache() return CreateClientsCache(NApi::GetClientOptionsFromEnvStatic()); } +NApi::NRpcProxy::TConnectionConfigPtr GetConnectionConfig(const TClientsCacheConfigPtr& config, TStringBuf clusterUrl) +{ + auto [cluster, proxyRole] = ExtractClusterAndProxyRole(clusterUrl); + + const auto& connectionConfig = config->PerClusterConnection.ValueRef( + GetNormalClusterName(cluster), + config->DefaultConnection); + YT_VERIFY(connectionConfig); + auto connectionConfigCopy = CloneYsonStruct(connectionConfig, /*postprocess*/ false, /*setDefaults*/ false); + + // Ignore cluster url from DefaultConfig, but use it from ClusterConfigs[_] if it is set. + if (connectionConfig == config->DefaultConnection || + !connectionConfigCopy->ClusterUrl || connectionConfigCopy->ClusterUrl->empty()) + { + connectionConfigCopy->ClusterUrl = ToString(cluster); + connectionConfigCopy->ClusterName = InferYTClusterFromClusterUrl(*connectionConfigCopy->ClusterUrl); + } + if (!proxyRole.empty()) { + connectionConfigCopy->ProxyRole = ToString(proxyRole); + } + connectionConfigCopy->Postprocess(); + return connectionConfigCopy; +} + //////////////////////////////////////////////////////////////////////////////// } // namespace NYT::NClient::NCache diff --git a/yt/yt/client/cache/cache.h b/yt/yt/client/cache/cache.h index 4cc842d753c..b7209d71fa1 100644 --- a/yt/yt/client/cache/cache.h +++ b/yt/yt/client/cache/cache.h @@ -43,8 +43,8 @@ IClientsCachePtr CreateClientsCache(const NApi::TClientOptions& options); //! Shortcut to create cache with default config. IClientsCachePtr CreateClientsCache(); -//! Helper function to create one cluster config from cluster URL and clusters config. -NApi::NRpcProxy::TConnectionConfigPtr MakeClusterConfig(const TClientsCacheConfigPtr& config, TStringBuf clusterUrl); +//! Helper function to get a cluster config by |clusterUrl|. +NApi::NRpcProxy::TConnectionConfigPtr GetConnectionConfig(const TClientsCacheConfigPtr& config, TStringBuf clusterUrl); //////////////////////////////////////////////////////////////////////////////// diff --git a/yt/yt/client/cache/config.cpp b/yt/yt/client/cache/config.cpp index 51549f7de76..f0cd2caca5a 100644 --- a/yt/yt/client/cache/config.cpp +++ b/yt/yt/client/cache/config.cpp @@ -10,9 +10,11 @@ using namespace NApi; void TClientsCacheConfig::Register(TRegistrar registrar) { - registrar.Parameter("default_config", &TThis::DefaultConfig) + registrar.Parameter("default_connection", &TThis::DefaultConnection) + .Alias("defailt_config") .DefaultNew(); - registrar.Parameter("cluster_configs", &TThis::ClusterConfigs) + registrar.Parameter("per_cluster_connection", &TThis::PerClusterConnection) + .Alias("cluster_configs") .Default(); } diff --git a/yt/yt/client/cache/config.h b/yt/yt/client/cache/config.h index 516a2e537fe..0ed8c0ab659 100644 --- a/yt/yt/client/cache/config.h +++ b/yt/yt/client/cache/config.h @@ -18,9 +18,9 @@ namespace NYT::NClient::NCache { struct TClientsCacheConfig : public virtual NYTree::TYsonStruct { - NApi::NRpcProxy::TConnectionConfigPtr DefaultConfig; + NApi::NRpcProxy::TConnectionConfigPtr DefaultConnection; - THashMap<TString, NApi::NRpcProxy::TConnectionConfigPtr> ClusterConfigs; + THashMap<TString, NApi::NRpcProxy::TConnectionConfigPtr> PerClusterConnection; REGISTER_YSON_STRUCT(TClientsCacheConfig); diff --git a/yt/yt/client/cache/unittests/cache_ut.cpp b/yt/yt/client/cache/unittests/cache_ut.cpp index 34f200befe3..e7e72d42916 100644 --- a/yt/yt/client/cache/unittests/cache_ut.cpp +++ b/yt/yt/client/cache/unittests/cache_ut.cpp @@ -90,46 +90,46 @@ TEST(TClientsCacheTest, MultiThreads) //////////////////////////////////////////////////////////////////////////////// -TEST(TClientsCacheTest, MakeClusterConfig) +TEST(TClientsCacheTest, GetConnectionConfig) { auto clientsCacheConfig = New<TClientsCacheConfig>(); - clientsCacheConfig->DefaultConfig = New<NApi::NRpcProxy::TConnectionConfig>(); - clientsCacheConfig->DefaultConfig->ClusterUrl = "seneca-nan"; // will be ignored - clientsCacheConfig->DefaultConfig->ProxyRole = "default_role"; // can be overwritten - clientsCacheConfig->DefaultConfig->DynamicChannelPool->MaxPeerCount = 42; + clientsCacheConfig->DefaultConnection = New<NApi::NRpcProxy::TConnectionConfig>(); + clientsCacheConfig->DefaultConnection->ClusterUrl = "seneca-nan"; // will be ignored + clientsCacheConfig->DefaultConnection->ProxyRole = "default_role"; // can be overwritten + clientsCacheConfig->DefaultConnection->DynamicChannelPool->MaxPeerCount = 42; auto senecaVlaConfig = New<NApi::NRpcProxy::TConnectionConfig>(); senecaVlaConfig->ClusterUrl = ""; // will be ignored senecaVlaConfig->ProxyRole = "seneca_vla_role"; // can be overwritten senecaVlaConfig->DynamicChannelPool->MaxPeerCount = 43; - clientsCacheConfig->ClusterConfigs["seneca-vla"] = senecaVlaConfig; + clientsCacheConfig->PerClusterConnection["seneca-vla"] = senecaVlaConfig; { - auto config = MakeClusterConfig(clientsCacheConfig, "seneca-man"); + auto config = GetConnectionConfig(clientsCacheConfig, "seneca-man"); EXPECT_EQ(config->ClusterUrl, "seneca-man"); EXPECT_EQ(config->ProxyRole, "default_role"); EXPECT_EQ(config->DynamicChannelPool->MaxPeerCount, 42); } { - auto config = MakeClusterConfig(clientsCacheConfig, "seneca-man/overwriting_role"); + auto config = GetConnectionConfig(clientsCacheConfig, "seneca-man/overwriting_role"); EXPECT_EQ(config->ClusterUrl, "seneca-man"); EXPECT_EQ(config->ProxyRole, "overwriting_role"); EXPECT_EQ(config->DynamicChannelPool->MaxPeerCount, 42); } { - auto config = MakeClusterConfig(clientsCacheConfig, "seneca-vla"); + auto config = GetConnectionConfig(clientsCacheConfig, "seneca-vla"); EXPECT_EQ(config->ClusterUrl, "seneca-vla"); EXPECT_EQ(config->ProxyRole, "seneca_vla_role"); EXPECT_EQ(config->DynamicChannelPool->MaxPeerCount, 43); } { - auto config = MakeClusterConfig(clientsCacheConfig, "seneca-vla/overwriting_role"); + auto config = GetConnectionConfig(clientsCacheConfig, "seneca-vla/overwriting_role"); EXPECT_EQ(config->ClusterUrl, "seneca-vla"); EXPECT_EQ(config->ProxyRole, "overwriting_role"); EXPECT_EQ(config->DynamicChannelPool->MaxPeerCount, 43); } { - auto config = MakeClusterConfig(clientsCacheConfig, "seneca-vla.yt.yandex.net"); + auto config = GetConnectionConfig(clientsCacheConfig, "seneca-vla.yt.yandex.net"); EXPECT_EQ(config->ClusterUrl, "seneca-vla.yt.yandex.net"); EXPECT_EQ(config->ProxyRole, "seneca_vla_role"); EXPECT_EQ(config->DynamicChannelPool->MaxPeerCount, 43); diff --git a/yt/yt/client/federated/cache.cpp b/yt/yt/client/federated/cache.cpp index f04e99a2ad0..3d86366b335 100644 --- a/yt/yt/client/federated/cache.cpp +++ b/yt/yt/client/federated/cache.cpp @@ -40,7 +40,7 @@ protected: case 0: THROW_ERROR_EXCEPTION("Cannot create client without cluster"); case 1: - return NCache::CreateClient(NCache::MakeClusterConfig(ClientsCacheConfig_, clusterUrl), Options_); + return NCache::CreateClient(NCache::GetConnectionConfig(ClientsCacheConfig_, clusterUrl), Options_); default: return CreateFederatedClient(clusters); } @@ -104,12 +104,15 @@ IClientsCachePtr CreateFederatedClientsCache( IClientsCachePtr CreateFederatedClientsCache( TConnectionConfigPtr federatedConfig, - const NApi::NRpcProxy::TConnectionConfigPtr& cacheConfig, + const NApi::NRpcProxy::TConnectionConfigPtr& connectionConfig, const NApi::TClientOptions& options, TString clusterSeparator) { auto clientsCacheConfig = New<TClientsCacheConfig>(); - clientsCacheConfig->DefaultConfig = CloneYsonStruct(cacheConfig, /*postprocess*/ false, /*setDefaults*/ false); + clientsCacheConfig->DefaultConnection = CloneYsonStruct( + connectionConfig, + /*postprocess*/ false, + /*setDefaults*/ false); return NYT::New<TClientsCache>( std::move(clientsCacheConfig), |
