aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorudovichenko-r <rvu@ydb.tech>2022-09-02 19:20:33 +0300
committerudovichenko-r <rvu@ydb.tech>2022-09-02 19:20:33 +0300
commit6440a16858ae8cb24ba12c6bcfbb37d20ef0ff44 (patch)
treeda2866c6a7b9793719c574041fe1cbf932144559
parent1fabba6ede21f44b2ee543405ed8115ece5efedd (diff)
downloadydb-6440a16858ae8cb24ba12c6bcfbb37d20ef0ff44.tar.gz
[yql] Support activation for core yql flags
-rw-r--r--ydb/core/kqp/host/kqp_host.cpp2
-rw-r--r--ydb/library/yql/core/facade/yql_facade.cpp2
-rw-r--r--ydb/library/yql/providers/common/CMakeLists.txt1
-rw-r--r--ydb/library/yql/providers/common/activation/CMakeLists.txt18
-rw-r--r--ydb/library/yql/providers/common/activation/yql_activation.cpp45
-rw-r--r--ydb/library/yql/providers/common/activation/yql_activation.h10
-rw-r--r--ydb/library/yql/providers/common/config/CMakeLists.txt1
-rw-r--r--ydb/library/yql/providers/common/config/yql_dispatch.cpp33
-rw-r--r--ydb/library/yql/providers/common/config/yql_dispatch.h7
-rw-r--r--ydb/library/yql/providers/common/proto/gateways_config.proto1
-rw-r--r--ydb/library/yql/providers/config/CMakeLists.txt1
-rw-r--r--ydb/library/yql/providers/config/yql_config_provider.cpp23
-rw-r--r--ydb/library/yql/providers/config/yql_config_provider.h5
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();