Skip to content

YQ-3658 added DisableExternalDataSourcesOnServerless feature flag #9097

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4864,6 +4864,66 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
session.Close().GetValueSync();
}

Y_UNIT_TEST(DisableExternalDataSourcesOnServerless) {
auto ydb = NWorkload::TYdbSetupSettings()
.CreateSampleTenants(true)
.EnableExternalDataSourcesOnServerless(false)
.Create();

auto checkDisabled = [](const auto& result, NYdb::EStatus status) {
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
};

auto checkNotFound = [](const auto& result, NYdb::EStatus status) {
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), status, result.GetIssues().ToString());
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Path does not exist");
};

const auto& createSourceSql = R"(
CREATE EXTERNAL DATA SOURCE MyExternalDataSource WITH (
SOURCE_TYPE="ObjectStorage",
LOCATION="my-bucket",
AUTH_METHOD="NONE"
);)";

const auto& createTableSql = R"(
CREATE EXTERNAL TABLE MyExternalTable (
Key Uint64,
Value String
) WITH (
DATA_SOURCE="MyExternalDataSource",
LOCATION="/"
);)";

const auto& dropSourceSql = "DROP EXTERNAL DATA SOURCE MyExternalDataSource;";

const auto& dropTableSql = "DROP EXTERNAL TABLE MyExternalTable;";

auto settings = NWorkload::TQueryRunnerSettings().PoolId(NResourcePool::DEFAULT_POOL_ID);

// Dedicated, enabled
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));

// Shared, enabled
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSourceSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createTableSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropTableSql, settings));
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSourceSql, settings));

// Serverless, disabled
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
checkDisabled(ydb->ExecuteQuery(createSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
checkDisabled(ydb->ExecuteQuery(createTableSql, settings), NYdb::EStatus::PRECONDITION_FAILED);
checkNotFound(ydb->ExecuteQuery(dropTableSql, settings), NYdb::EStatus::SCHEME_ERROR);
checkNotFound(ydb->ExecuteQuery(dropSourceSql, settings), NYdb::EStatus::GENERIC_ERROR);
}

Y_UNIT_TEST(CreateExternalDataSource) {
NKikimrConfig::TAppConfig appCfg;
appCfg.MutableQueryServiceConfig()->AddHostnamePatterns("my-bucket");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
TAppConfig appConfig;
appConfig.MutableFeatureFlags()->SetEnableResourcePools(Settings_.EnableResourcePools_);
appConfig.MutableFeatureFlags()->SetEnableMetadataObjectsOnServerless(Settings_.EnableMetadataObjectsOnServerless_);
appConfig.MutableFeatureFlags()->SetEnableExternalDataSourcesOnServerless(Settings_.EnableExternalDataSourcesOnServerless_);
appConfig.MutableFeatureFlags()->SetEnableExternalDataSources(true);

return appConfig;
}
Expand Down Expand Up @@ -527,7 +529,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
request->SetQuery(query);
request->SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY);
request->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
request->SetDatabase(Settings_.DomainName_);
request->SetDatabase(settings.Database_ ? settings.Database_ : Settings_.DomainName_);
request->SetPoolId(settings.PoolId_);

return event;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct TYdbSetupSettings {
FLUENT_SETTING_DEFAULT(bool, CreateSampleTenants, false);
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
FLUENT_SETTING_DEFAULT(bool, EnableMetadataObjectsOnServerless, true);
FLUENT_SETTING_DEFAULT(bool, EnableExternalDataSourcesOnServerless, true);

// Default pool settings
FLUENT_SETTING_DEFAULT(TString, PoolId, "sample_pool_id");
Expand Down
1 change: 1 addition & 0 deletions ydb/core/protos/feature_flags.proto
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,5 @@ message TFeatureFlags {
optional bool EnableOptionalColumnsInColumnShard = 136 [default = false];
optional bool EnablePgSyntax = 139 [default = false];
optional bool EnableMetadataObjectsOnServerless = 141 [default = true];
optional bool EnableExternalDataSourcesOnServerless = 143 [default = true];
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,13 @@ class TAlterExternalDataSource : public TSubOperation {
static_cast<ui64>(OperationId.GetTxId()),
static_cast<ui64>(ssId));

if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
if (!context.SS->EnableExternalDataSourcesOnServerless) {
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
return result;
}
}

const TPath parentPath = TPath::Resolve(parentPathStr, context.SS);
RETURN_RESULT_UNLESS(NExternalDataSource::IsParentPathValid(
result, parentPath, Transaction, /* isCreate */ false));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,13 @@ class TAlterExternalTable: public TSubOperation {
static_cast<ui64>(OperationId.GetTxId()),
static_cast<ui64>(ssId));

if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
if (!context.SS->EnableExternalDataSourcesOnServerless) {
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
return result;
}
}

const auto parentPath = TPath::Resolve(parentPathStr, context.SS);
RETURN_RESULT_UNLESS(NExternalTable::IsParentPathValid(result, parentPath));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,13 @@ class TCreateExternalDataSource : public TSubOperation {
static_cast<ui64>(OperationId.GetTxId()),
static_cast<ui64>(ssId));

if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
if (!context.SS->EnableExternalDataSourcesOnServerless) {
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
return result;
}
}

const TPath parentPath = TPath::Resolve(parentPathStr, context.SS);
RETURN_RESULT_UNLESS(NExternalDataSource::IsParentPathValid(
result, parentPath, Transaction, /* isCreate */ true));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,13 @@ class TCreateExternalTable: public TSubOperation {
static_cast<ui64>(OperationId.GetTxId()),
static_cast<ui64>(ssId));

if (context.SS->IsServerlessDomain(TPath::Init(context.SS->RootPathId(), context.SS))) {
if (!context.SS->EnableExternalDataSourcesOnServerless) {
result->SetError(NKikimrScheme::StatusPreconditionFailed, "External data sources are disabled for serverless domains. Please contact your system administrator to enable it");
return result;
}
}

const auto parentPath = TPath::Resolve(parentPathStr, context.SS);
RETURN_RESULT_UNLESS(NExternalTable::IsParentPathValid(result, parentPath));

Expand Down
1 change: 1 addition & 0 deletions ydb/core/tx/schemeshard/schemeshard_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7013,6 +7013,7 @@ void TSchemeShard::ApplyConsoleConfigs(const NKikimrConfig::TFeatureFlags& featu
EnableReplaceIfExistsForExternalEntities = featureFlags.GetEnableReplaceIfExistsForExternalEntities();
EnableTableDatetime64 = featureFlags.GetEnableTableDatetime64();
EnableResourcePoolsOnServerless = featureFlags.GetEnableResourcePoolsOnServerless();
EnableExternalDataSourcesOnServerless = featureFlags.GetEnableExternalDataSourcesOnServerless();
}

void TSchemeShard::ConfigureStatsBatching(const NKikimrConfig::TSchemeShardConfig& config, const TActorContext& ctx) {
Expand Down
1 change: 1 addition & 0 deletions ydb/core/tx/schemeshard/schemeshard_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ class TSchemeShard
bool EnableTempTables = false;
bool EnableTableDatetime64 = false;
bool EnableResourcePoolsOnServerless = false;
bool EnableExternalDataSourcesOnServerless = false;

TShardDeleter ShardDeleter;

Expand Down
Loading