diff options
author | udovichenko-r <rvu@ydb.tech> | 2022-09-02 19:20:33 +0300 |
---|---|---|
committer | udovichenko-r <rvu@ydb.tech> | 2022-09-02 19:20:33 +0300 |
commit | 6440a16858ae8cb24ba12c6bcfbb37d20ef0ff44 (patch) | |
tree | da2866c6a7b9793719c574041fe1cbf932144559 | |
parent | 1fabba6ede21f44b2ee543405ed8115ece5efedd (diff) | |
download | ydb-6440a16858ae8cb24ba12c6bcfbb37d20ef0ff44.tar.gz |
[yql] Support activation for core yql flags
13 files changed, 99 insertions, 50 deletions
diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp index c3077bd597b..063b2ba070a 100644 --- a/ydb/core/kqp/host/kqp_host.cpp +++ b/ydb/core/kqp/host/kqp_host.cpp @@ -1072,7 +1072,7 @@ public: settingName == "DisableOrderedColumns" || settingName == "Warning"; }; - auto configProvider = CreateConfigProvider(*TypesCtx, gatewaysConfig, allowSettings); + auto configProvider = CreateConfigProvider(*TypesCtx, gatewaysConfig, {}, allowSettings); TypesCtx->AddDataSource(ConfigProviderName, configProvider); YQL_ENSURE(TypesCtx->Initialize(*ExprCtx)); diff --git a/ydb/library/yql/core/facade/yql_facade.cpp b/ydb/library/yql/core/facade/yql_facade.cpp index a758f81264d..adf64b7d33a 100644 --- a/ydb/library/yql/core/facade/yql_facade.cpp +++ b/ydb/library/yql/core/facade/yql_facade.cpp @@ -1371,7 +1371,7 @@ TTypeAnnotationContextPtr TProgram::BuildTypeAnnotationContext(const TString& us } { - auto configProvider = CreateConfigProvider(*typeAnnotationContext, GatewaysConfig_); + auto configProvider = CreateConfigProvider(*typeAnnotationContext, GatewaysConfig_, username); typeAnnotationContext->AddDataSource(ConfigProviderName, configProvider); } diff --git a/ydb/library/yql/providers/common/CMakeLists.txt b/ydb/library/yql/providers/common/CMakeLists.txt index c711b0193b9..27274efc4a7 100644 --- a/ydb/library/yql/providers/common/CMakeLists.txt +++ b/ydb/library/yql/providers/common/CMakeLists.txt @@ -6,6 +6,7 @@ # original buildsystem will not be accepted. +add_subdirectory(activation) add_subdirectory(codec) add_subdirectory(comp_nodes) add_subdirectory(config) diff --git a/ydb/library/yql/providers/common/activation/CMakeLists.txt b/ydb/library/yql/providers/common/activation/CMakeLists.txt new file mode 100644 index 00000000000..4abceb4cf28 --- /dev/null +++ b/ydb/library/yql/providers/common/activation/CMakeLists.txt @@ -0,0 +1,18 @@ + +# This file was gererated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_library(providers-common-activation) +target_link_libraries(providers-common-activation PUBLIC + contrib-libs-cxxsupp + yutil + providers-common-proto +) +target_sources(providers-common-activation PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/common/activation/yql_activation.cpp +) diff --git a/ydb/library/yql/providers/common/activation/yql_activation.cpp b/ydb/library/yql/providers/common/activation/yql_activation.cpp new file mode 100644 index 00000000000..b50afe3a32c --- /dev/null +++ b/ydb/library/yql/providers/common/activation/yql_activation.cpp @@ -0,0 +1,45 @@ +#include "yql_activation.h" + +#include <ydb/library/yql/providers/common/proto/gateways_config.pb.h> + +#include <util/random/random.h> +#include <util/generic/algorithm.h> +#include <util/datetime/base.h> +#include <util/datetime/systime.h> + +namespace NYql::NConfig { + + +template <class TActivation> +bool Allow(const TActivation& activation, const TString& userName) { + if (AnyOf(activation.GetIncludeUsers(), [&](const auto& user) { return user == userName; })) { + return true; + } + if (AnyOf(activation.GetExcludeUsers(), [&](const auto& user) { return user == userName; })) { + return false; + } + if (userName.StartsWith("robot") && activation.GetExcludeRobots()) { + return false; + } + + ui32 percent = activation.GetPercentage(); + if (activation.ByHourSize()) { + auto now = TInstant::Now(); + struct tm local = {}; + now.LocalTime(&local); + const auto hour = ui32(local.tm_hour); + + for (auto& byHour: activation.GetByHour()) { + if (byHour.GetHour() == hour) { + percent = byHour.GetPercentage(); + break; + } + } + } + const auto random = RandomNumber<ui8>(100); + return random < percent; +} + +template bool Allow<NYql::TActivationPercentage>(const NYql::TActivationPercentage& activation, const TString& userName); + +} // namespace diff --git a/ydb/library/yql/providers/common/activation/yql_activation.h b/ydb/library/yql/providers/common/activation/yql_activation.h new file mode 100644 index 00000000000..1f39c9c8ace --- /dev/null +++ b/ydb/library/yql/providers/common/activation/yql_activation.h @@ -0,0 +1,10 @@ +#pragma once + +#include <util/generic/string.h> + +namespace NYql::NConfig { + +template <class TActivation> +bool Allow(const TActivation& activation, const TString& userName); + +} // namespace diff --git a/ydb/library/yql/providers/common/config/CMakeLists.txt b/ydb/library/yql/providers/common/config/CMakeLists.txt index c6292253669..e0a1cc49993 100644 --- a/ydb/library/yql/providers/common/config/CMakeLists.txt +++ b/ydb/library/yql/providers/common/config/CMakeLists.txt @@ -17,6 +17,7 @@ target_link_libraries(providers-common-config PUBLIC library-yql-core yql-core-expr_nodes library-yql-ast + providers-common-activation cpp-containers-sorted_vector cpp-string_utils-parse_size cpp-string_utils-levenshtein_diff diff --git a/ydb/library/yql/providers/common/config/yql_dispatch.cpp b/ydb/library/yql/providers/common/config/yql_dispatch.cpp index 4e6df45a8fa..614693a8c9c 100644 --- a/ydb/library/yql/providers/common/config/yql_dispatch.cpp +++ b/ydb/library/yql/providers/common/config/yql_dispatch.cpp @@ -1,6 +1,5 @@ #include "yql_dispatch.h" -#include <ydb/library/yql/providers/common/proto/gateways_config.pb.h> #include <ydb/library/yql/core/yql_expr_type_annotation.h> #include <ydb/library/yql/ast/yql_expr.h> @@ -157,37 +156,5 @@ void TSettingDispatcher::Restore() { } } -template <class TActivation> -bool TSettingDispatcher::Allow(const TActivation& activation, const TString& userName) { - if (AnyOf(activation.GetIncludeUsers(), [&](const auto& user) { return user == userName; })) { - return true; - } - if (AnyOf(activation.GetExcludeUsers(), [&](const auto& user) { return user == userName; })) { - return false; - } - if (userName.StartsWith("robot") && activation.GetExcludeRobots()) { - return false; - } - - ui32 percent = activation.GetPercentage(); - if (activation.ByHourSize()) { - auto now = TInstant::Now(); - struct tm local = {}; - now.LocalTime(&local); - const auto hour = ui32(local.tm_hour); - - for (auto& byHour: activation.GetByHour()) { - if (byHour.GetHour() == hour) { - percent = byHour.GetPercentage(); - break; - } - } - } - const auto random = RandomNumber<ui8>(100); - return random < percent; -} - -template bool TSettingDispatcher::Allow<NYql::TActivationPercentage>(const NYql::TActivationPercentage& activation, const TString& userName); - } // NCommon } // NYql diff --git a/ydb/library/yql/providers/common/config/yql_dispatch.h b/ydb/library/yql/providers/common/config/yql_dispatch.h index 7389cbf082b..63c97fb47cb 100644 --- a/ydb/library/yql/providers/common/config/yql_dispatch.h +++ b/ydb/library/yql/providers/common/config/yql_dispatch.h @@ -2,6 +2,7 @@ #include "yql_setting.h" +#include <ydb/library/yql/providers/common/activation/yql_activation.h> #include <ydb/library/yql/core/yql_expr_type_annotation.h> #include <library/cpp/string_utils/parse_size/parse_size.h> @@ -327,7 +328,7 @@ public: template <class TContainer> void Dispatch(const TString& cluster, const TContainer& clusterValues, const TString& userName) { for (auto& v: clusterValues) { - if (!v.HasActivation() || Allow(v.GetActivation(), userName)) { + if (!v.HasActivation() || NConfig::Allow(v.GetActivation(), userName)) { Dispatch(cluster, v.GetName(), v.GetValue(), EStage::CONFIG); } } @@ -354,10 +355,6 @@ public: void Restore(); protected: - template <class TActivation> - static bool Allow(const TActivation& activation, const TString& userName); - -protected: THashSet<TString> ValidClusters; THashMap<TString, TSettingHandler::TPtr> Handlers; }; diff --git a/ydb/library/yql/providers/common/proto/gateways_config.proto b/ydb/library/yql/providers/common/proto/gateways_config.proto index c263968f0b3..87405b60803 100644 --- a/ydb/library/yql/providers/common/proto/gateways_config.proto +++ b/ydb/library/yql/providers/common/proto/gateways_config.proto @@ -444,6 +444,7 @@ message TDqGatewayConfig { message TCoreAttr { required string Name = 1; repeated string Args = 2; + optional TActivationPercentage Activation = 3; } message TYqlCoreConfig { diff --git a/ydb/library/yql/providers/config/CMakeLists.txt b/ydb/library/yql/providers/config/CMakeLists.txt index e0ad1aa5221..573b895eb92 100644 --- a/ydb/library/yql/providers/config/CMakeLists.txt +++ b/ydb/library/yql/providers/config/CMakeLists.txt @@ -23,6 +23,7 @@ target_link_libraries(yql-providers-config PUBLIC yql-core-expr_nodes providers-common-proto providers-common-provider + providers-common-activation ) target_sources(yql-providers-config PRIVATE ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/config/yql_config_provider.cpp diff --git a/ydb/library/yql/providers/config/yql_config_provider.cpp b/ydb/library/yql/providers/config/yql_config_provider.cpp index ec5309a8503..6175a84e28f 100644 --- a/ydb/library/yql/providers/config/yql_config_provider.cpp +++ b/ydb/library/yql/providers/config/yql_config_provider.cpp @@ -4,6 +4,7 @@ #include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h> #include <ydb/library/yql/providers/common/proto/gateways_config.pb.h> #include <ydb/library/yql/providers/common/provider/yql_provider.h> +#include <ydb/library/yql/providers/common/activation/yql_activation.h> #include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h> #include <ydb/library/yql/core/yql_execution.h> #include <ydb/library/yql/core/yql_expr_optimize.h> @@ -128,9 +129,10 @@ namespace { } }; - TConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, const TAllowSettingPolicy& policy) + TConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, const TString& username, const TAllowSettingPolicy& policy) : Types(types) , CoreConfig(config && config->HasYqlCore() ? &config->GetYqlCore() : nullptr) + , Username(username) , Policy(policy) {} @@ -142,12 +144,14 @@ namespace { if (CoreConfig) { TPosition pos; for (auto& flag: CoreConfig->GetFlags()) { - TVector<TStringBuf> args; - for (auto& arg: flag.GetArgs()) { - args.push_back(arg); - } - if (!ApplyFlag(pos, flag.GetName(), args, ctx)) { - return false; + if (!flag.HasActivation() || !Username || NConfig::Allow(flag.GetActivation(), Username)) { + TVector<TStringBuf> args; + for (auto& arg: flag.GetArgs()) { + args.push_back(arg); + } + if (!ApplyFlag(pos, flag.GetName(), args, ctx)) { + return false; + } } } } @@ -1002,14 +1006,15 @@ namespace { TAutoPtr<IGraphTransformer> ConfigurationTransformer; TAutoPtr<IGraphTransformer> CallableExecutionTransformer; const TYqlCoreConfig* CoreConfig; + TString Username; const TAllowSettingPolicy Policy; }; } -TIntrusivePtr<IDataProvider> CreateConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, +TIntrusivePtr<IDataProvider> CreateConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, const TString& username, const TAllowSettingPolicy& policy) { - return new TConfigProvider(types, config, policy); + return new TConfigProvider(types, config, username, policy); } const THashSet<TStringBuf>& ConfigProviderFunctions() { diff --git a/ydb/library/yql/providers/config/yql_config_provider.h b/ydb/library/yql/providers/config/yql_config_provider.h index ea1f47508ac..d37ee7eaa53 100644 --- a/ydb/library/yql/providers/config/yql_config_provider.h +++ b/ydb/library/yql/providers/config/yql_config_provider.h @@ -2,6 +2,9 @@ #include <ydb/library/yql/core/yql_type_annotation.h> +#include <util/generic/strbuf.h> +#include <util/generic/string.h> + #include <functional> namespace NYql { @@ -12,7 +15,7 @@ const TStringBuf ConfReadName = "ConfRead!"; using TAllowSettingPolicy = std::function<bool(TStringBuf settingName)>; -TIntrusivePtr<IDataProvider> CreateConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, +TIntrusivePtr<IDataProvider> CreateConfigProvider(TTypeAnnotationContext& types, const TGatewaysConfig* config, const TString& username, const TAllowSettingPolicy& policy = TAllowSettingPolicy()); // allow all settings by default const THashSet<TStringBuf>& ConfigProviderFunctions(); |