From 5540d3b9c0a21a27de7d5d75c40bdfaf85053109 Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Fri, 11 Apr 2025 21:44:14 +0300 Subject: [PATCH 1/9] KIKIMR-21403: support READ_REPLICAS_SETTINGS in alter index --- ydb/core/kqp/provider/yql_kikimr_exec.cpp | 41 +++++++++++++------ .../schemeshard__operation_alter_table.cpp | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp index ae78c7aef2cf..b83060db711c 100644 --- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp @@ -699,6 +699,28 @@ namespace { return true; } + [[nodiscard]] bool ParseReadReplicasSettings( + Ydb::Table::ReadReplicasSettings& readReplicasSettings, + const TCoNameValueTuple& setting, + TExprContext& ctx + ) { + const auto replicasSettings = TString( + setting.Value().Cast().Literal().Cast().Value() + ); + + Ydb::StatusIds::StatusCode code; + TString errText; + if (!ConvertReadReplicasSettingsToProto(replicasSettings, readReplicasSettings, code, errText)) { + + ctx.AddError(YqlIssue(ctx.GetPosition(setting.Value().Cast().Literal().Cast().Pos()), + NYql::YqlStatusFromYdbStatus(code), + errText)); + return false; + } + + return true; + } + bool ParseAsyncReplicationSettingsBase( TReplicationSettingsBase& dstSettings, const TCoNameValueTupleList& srcSettings, TExprContext& ctx, TPositionHandle pos, const TString& objectName = "replication" @@ -1783,17 +1805,7 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer().Literal().Cast().Value() - ); - Ydb::StatusIds::StatusCode code; - TString errText; - if (!ConvertReadReplicasSettingsToProto(replicasSettings, - *alterTableRequest.mutable_set_read_replicas_settings(), code, errText)) { - - ctx.AddError(YqlIssue(ctx.GetPosition(setting.Value().Cast().Literal().Cast().Pos()), - NYql::YqlStatusFromYdbStatus(code), - errText)); + if (!ParseReadReplicasSettings(*alterTableRequest.mutable_set_read_replicas_settings(), setting, ctx)) { return SyncError(); } } else if (name == "setTtlSettings") { @@ -1944,12 +1956,17 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer(); for (const auto& tableSetting : tableSettings) { - if (IsPartitioningSetting(tableSetting.Name().Value())) { + const auto name = tableSetting.Name().Value(); + if (IsPartitioningSetting(name)) { if (!ParsePartitioningSettings( *alterTableRequest.mutable_alter_partitioning_settings(), tableSetting, ctx )) { return SyncError(); } + } else if (name == "readReplicasSettings") { + if (!ParseReadReplicasSettings(*alterTableRequest.mutable_set_read_replicas_settings(), tableSetting, ctx)) { + return SyncError(); + } } else { ctx.AddError( TIssue(ctx.GetPosition(tableSetting.Name().Pos()), diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_table.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_table.cpp index 792d461e8a1c..05f18b6708cf 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_table.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_table.cpp @@ -751,7 +751,7 @@ TVector CreateConsistentAlterTable(TOperationId id, const T if (!(IsAdministrator(AppData(), context.UserToken.Get()) && !AppData()->AdministrationAllowedSIDs.empty()) && (!CheckAllowedFields(alter, {"Name", "PathId", "PartitionConfig", "ReplicationConfig", "IncrementalBackupConfig"}) || (alter.HasPartitionConfig() - && !CheckAllowedFields(alter.GetPartitionConfig(), {"PartitioningPolicy"}) + && !CheckAllowedFields(alter.GetPartitionConfig(), {"PartitioningPolicy", "FollowerCount", "FollowerGroups"}) ) ) ) { From 91e7bed8b2411334e23ad9b997605ab3801a1ba4 Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Thu, 24 Apr 2025 22:42:23 +0300 Subject: [PATCH 2/9] KIKIMR-21403: add test for ReadReplicasSettings in index altering op --- ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index eb302251470f..7e7c7a97bc3f 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -2826,11 +2826,12 @@ Y_UNIT_TEST_SUITE(KqpScheme) { constexpr int partitionSizeMb = 555; { - auto result = session.ExecuteSchemeQuery(Sprintf(R"( + auto result = session.ExecuteSchemeQuery(Sprintf(R"( ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET AUTO_PARTITIONING_PARTITION_SIZE_MB %d; - )", partitionSizeMb) + )", partitionSizeMb + ) ).ExtractValueSync(); - UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); } { auto describe = session.DescribeTable("/Root/SecondaryKeys/Index/indexImplTable").GetValueSync(); @@ -2838,6 +2839,26 @@ Y_UNIT_TEST_SUITE(KqpScheme) { auto indexDesc = describe.GetTableDescription(); UNIT_ASSERT_VALUES_EQUAL(indexDesc.GetPartitioningSettings().GetPartitionSizeMb(), partitionSizeMb); } + + constexpr TStringBuf readReplicasModeAsString = "PER_AZ"; + constexpr auto readReplicasMode = NYdb::NTable::TReadReplicasSettings::EMode::PerAz; + constexpr ui64 readReplicasCount = 1; + { + const auto result = session.ExecuteSchemeQuery(Sprintf(R"( + ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET READ_REPLICAS_SETTINGS "%s:%)" PRIu64 R"(; + )", readReplicasModeAsString.data(), readReplicasCount + ) + ).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } + { + auto describe = session.DescribeTable("/Root/SecondaryKeys/Index/indexImplTable").GetValueSync(); + UNIT_ASSERT_C(describe.IsSuccess(), describe.GetIssues().ToString()); + auto indexDesc = describe.GetTableDescription(); + UNIT_ASSERT(indexDesc.GetReadReplicasSettings()); + UNIT_ASSERT(indexDesc.GetReadReplicasSettings()->GetMode() == readReplicasMode); + UNIT_ASSERT_VALUES_EQUAL(indexDesc.GetReadReplicasSettings()->GetReadReplicasCount(), readReplicasCount); + } } Y_UNIT_TEST(AlterTableAlterVectorIndex) { From d45d28b78219e58e273e6aea81f54d1707a0d9ef Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:34:24 +0300 Subject: [PATCH 3/9] KIKIMR-21403: add ReadReplicasSettings backup test --- ydb/services/ydb/backup_ut/ydb_backup_ut.cpp | 100 +++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp b/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp index 5538a8149dcb..25be738c1c59 100644 --- a/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp +++ b/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp @@ -294,6 +294,18 @@ auto CreateHasSerialChecker(i64 nextValue, bool nextUsed) { }; } +auto CreateReadReplicasSettingsChecker(const NYdb::NTable::TReadReplicasSettings::EMode expectedMode, const ui64 expectedCount, const TString& debugHint = "") { + return [=](const TTableDescription& tableDescription) { + UNIT_ASSERT_C(tableDescription.GetReadReplicasSettings().Defined(), debugHint); + UNIT_ASSERT_C(tableDescription.GetReadReplicasSettings()->GetMode() == expectedMode, debugHint); + UNIT_ASSERT_VALUES_EQUAL_C( + tableDescription.GetReadReplicasSettings()->GetReadReplicasCount(), + expectedCount, + debugHint + ); + }; +} + void CheckTableDescription(TSession& session, const TString& path, auto&& checker, const TDescribeTableSettings& settings = {} ) { @@ -445,6 +457,52 @@ void TestIndexTablePartitioningSettingsArePreserved( CheckTableDescription(session, indexTablePath, CreateMinPartitionsChecker(minIndexPartitions, DEBUG_HINT)); } +void TestIndexTableReadReplicasSettingsArePreserved( + const char* table, const char* index, NYdb::NTable::TReadReplicasSettings::EMode readReplicasMode, const ui64 readReplicasCount, TSession& session, + TBackupFunction&& backup, TRestoreFunction&& restore +) { + const TString indexTablePath = JoinFsPaths(table, index, "indexImplTable"); + TString readReplicasModeAsString; + switch (readReplicasMode) { + case NYdb::NTable::TReadReplicasSettings::EMode::PerAz: + readReplicasModeAsString = "PER_AZ"; + break; + case NYdb::NTable::TReadReplicasSettings::EMode::AnyAz: + readReplicasModeAsString = "ANY_AZ"; + break; + default: + UNIT_FAIL(TString::Join("Unsupported readReplicasMode")); + } + + ExecuteDataDefinitionQuery(session, Sprintf(R"( + CREATE TABLE `%s` ( + Key Uint32, + Value Uint32, + PRIMARY KEY (Key), + INDEX %s GLOBAL ON (Value) + ); + )", + table, index + )); + ExecuteDataDefinitionQuery(session, Sprintf(R"( + ALTER TABLE `%s` ALTER INDEX %s SET ( + READ_REPLICAS_SETTINGS = "%s:%)" PRIu64 R"( + ); + )", table, index, readReplicasModeAsString.c_str(), readReplicasCount + )); + CheckTableDescription(session, indexTablePath, CreateReadReplicasSettingsChecker(readReplicasMode, readReplicasCount, DEBUG_HINT)); + + backup(table); + + ExecuteDataDefinitionQuery(session, Sprintf(R"( + DROP TABLE `%s`; + )", table + )); + + restore(table); + CheckTableDescription(session, indexTablePath, CreateReadReplicasSettingsChecker(readReplicasMode, readReplicasCount, DEBUG_HINT)); +} + void TestTableSplitBoundariesArePreserved( const char* table, ui64 partitions, TSession& session, TBackupFunction&& backup, TRestoreFunction&& restore ) { @@ -1460,6 +1518,30 @@ Y_UNIT_TEST_SUITE(BackupRestore) { ); } + Y_UNIT_TEST(RestoreIndexTableReadReplicasSettings) { + TKikimrWithGrpcAndRootSchema server; + auto driver = TDriver(TDriverConfig().SetEndpoint(Sprintf("localhost:%u", server.GetPort()))); + TTableClient tableClient(driver); + auto session = tableClient.GetSession().ExtractValueSync().GetSession(); + TTempDir tempDir; + const auto& pathToBackup = tempDir.Path(); + + constexpr const char* table = "/Root/table"; + constexpr const char* index = "byValue"; + constexpr auto readReplicasMode = NYdb::NTable::TReadReplicasSettings::EMode::PerAz; + constexpr ui64 readReplicasCount = 1; + + TestIndexTableReadReplicasSettingsArePreserved( + table, + index, + readReplicasMode, + readReplicasCount, + session, + CreateBackupLambda(driver, pathToBackup, true), + CreateRestoreLambda(driver, pathToBackup) + ); + } + Y_UNIT_TEST(RestoreTableSplitBoundaries) { TKikimrWithGrpcAndRootSchema server; auto driver = TDriver(TDriverConfig().SetEndpoint(Sprintf("localhost:%u", server.GetPort()))); @@ -2364,6 +2446,24 @@ Y_UNIT_TEST_SUITE(BackupRestoreS3) { ); } + Y_UNIT_TEST(RestoreIndexTableReadReplicasSettings) { + TS3TestEnv testEnv; + constexpr const char* table = "/Root/table"; + constexpr const char* index = "byValue"; + constexpr auto readReplicasMode = NYdb::NTable::TReadReplicasSettings::EMode::PerAz; + constexpr ui64 readReplicasCount = 1; + + TestIndexTableReadReplicasSettingsArePreserved( + table, + index, + readReplicasMode, + readReplicasCount, + testEnv.GetSession(), + CreateBackupLambda(testEnv.GetDriver(), testEnv.GetS3Port()), + CreateRestoreLambda(testEnv.GetDriver(), testEnv.GetS3Port()) + ); + } + Y_UNIT_TEST(RestoreTableSplitBoundaries) { TS3TestEnv testEnv; constexpr const char* table = "/Root/table"; From 92ca70d864ee423e2f96e33cba64328ccfd819db Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:50:20 +0300 Subject: [PATCH 4/9] KIKIMR-21403: add backup test & serialization support --- ydb/public/api/protos/ydb_table.proto | 1 + ydb/public/sdk/cpp/client/ydb_table/table.cpp | 77 +++++++++---------- ydb/public/sdk/cpp/client/ydb_table/table.h | 41 +++++----- .../include/ydb-cpp-sdk/client/table/table.h | 41 +++++----- ydb/public/sdk/cpp/src/client/table/table.cpp | 77 +++++++++---------- ydb/services/ydb/backup_ut/ydb_backup_ut.cpp | 15 ++-- 6 files changed, 129 insertions(+), 123 deletions(-) diff --git a/ydb/public/api/protos/ydb_table.proto b/ydb/public/api/protos/ydb_table.proto index 9d29891b47ec..f22b9f85f4a7 100644 --- a/ydb/public/api/protos/ydb_table.proto +++ b/ydb/public/api/protos/ydb_table.proto @@ -58,6 +58,7 @@ message GlobalIndexSettings { } // Partitioning settings for the table that implements the index. PartitioningSettings partitioning_settings = 3; + ReadReplicasSettings read_replicas_settings = 4; } message VectorIndexSettings { diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index 39708e380077..cd738179662d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -359,23 +359,7 @@ class TTableDescription::TImpl { } // read replicas settings - if (proto.has_read_replicas_settings()) { - const auto settings = proto.read_replicas_settings(); - switch (settings.settings_case()) { - case Ydb::Table::ReadReplicasSettings::kPerAzReadReplicasCount: - ReadReplicasSettings_ = TReadReplicasSettings( - TReadReplicasSettings::EMode::PerAz, - settings.per_az_read_replicas_count()); - break; - case Ydb::Table::ReadReplicasSettings::kAnyAzReadReplicasCount: - ReadReplicasSettings_ = TReadReplicasSettings( - TReadReplicasSettings::EMode::AnyAz, - settings.any_az_read_replicas_count()); - break; - default: - break; - } - } + ReadReplicasSettings_ = TReadReplicasSettings::FromProto(proto.read_replicas_settings()); } public: @@ -972,16 +956,7 @@ void TTableDescription::SerializeTo(Ydb::Table::CreateTableRequest& request) con } if (const auto& settings = Impl_->GetReadReplicasSettings()) { - switch (settings->GetMode()) { - case TReadReplicasSettings::EMode::PerAz: - request.mutable_read_replicas_settings()->set_per_az_read_replicas_count(settings->GetReadReplicasCount()); - break; - case TReadReplicasSettings::EMode::AnyAz: - request.mutable_read_replicas_settings()->set_any_az_read_replicas_count(settings->GetReadReplicasCount()); - break; - default: - break; - } + settings->SerializeTo(*request.mutable_read_replicas_settings()); } } @@ -1744,18 +1719,7 @@ static Ydb::Table::AlterTableRequest MakeAlterTableProtoRequest( if (settings.SetReadReplicasSettings_.Defined()) { const auto& replSettings = settings.SetReadReplicasSettings_.GetRef(); - switch (replSettings.GetMode()) { - case TReadReplicasSettings::EMode::PerAz: - request.mutable_set_read_replicas_settings()->set_per_az_read_replicas_count( - replSettings.GetReadReplicasCount()); - break; - case TReadReplicasSettings::EMode::AnyAz: - request.mutable_set_read_replicas_settings()->set_any_az_read_replicas_count( - replSettings.GetReadReplicasCount()); - break; - default: - break; - } + replSettings.SerializeTo(*request.mutable_set_read_replicas_settings()); } return request; @@ -2347,6 +2311,34 @@ ui64 TIndexDescription::GetSizeBytes() const { return SizeBytes_; } +TMaybe TReadReplicasSettings::FromProto(const Ydb::Table::ReadReplicasSettings& proto) { + switch (proto.settings_case()) { + case Ydb::Table::ReadReplicasSettings::kPerAzReadReplicasCount: + return TReadReplicasSettings( + TReadReplicasSettings::EMode::PerAz, + proto.per_az_read_replicas_count()); + case Ydb::Table::ReadReplicasSettings::kAnyAzReadReplicasCount: + return TReadReplicasSettings( + TReadReplicasSettings::EMode::AnyAz, + proto.any_az_read_replicas_count()); + default: + return { }; + } +} + +void TReadReplicasSettings::SerializeTo(Ydb::Table::ReadReplicasSettings& proto) const { + switch (GetMode()) { + case TReadReplicasSettings::EMode::PerAz: + proto.set_per_az_read_replicas_count(GetReadReplicasCount()); + break; + case TReadReplicasSettings::EMode::AnyAz: + proto.set_any_az_read_replicas_count(GetReadReplicasCount()); + break; + default: + break; + } +} + TGlobalIndexSettings TGlobalIndexSettings::FromProto(const Ydb::Table::GlobalIndexSettings& proto) { auto partitionsFromProto = [](const Ydb::Table::GlobalIndexSettings& proto) -> TUniformOrExplicitPartitions { switch (proto.partitions_case()) { @@ -2361,7 +2353,8 @@ TGlobalIndexSettings TGlobalIndexSettings::FromProto(const Ydb::Table::GlobalInd return { .PartitioningSettings = TPartitioningSettings(proto.partitioning_settings()), - .Partitions = partitionsFromProto(proto) + .Partitions = partitionsFromProto(proto), + .ReadReplicasSettings = TReadReplicasSettings::FromProto(proto.read_replicas_settings()) }; } @@ -2377,6 +2370,10 @@ void TGlobalIndexSettings::SerializeTo(Ydb::Table::GlobalIndexSettings& settings } }; std::visit(std::move(variantVisitor), Partitions); + + if (ReadReplicasSettings) { + ReadReplicasSettings->SerializeTo(*settings.mutable_read_replicas_settings()); + } } TVectorIndexSettings TVectorIndexSettings::FromProto(const Ydb::Table::VectorIndexSettings& proto) { diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.h b/ydb/public/sdk/cpp/client/ydb_table/table.h index 155e4a949565..0f9a36706132 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.h +++ b/ydb/public/sdk/cpp/client/ydb_table/table.h @@ -30,6 +30,7 @@ class GlobalIndexSettings; class VectorIndexSettings; class KMeansTreeSettings; class PartitioningSettings; +class ReadReplicasSettings; class DateTypeColumnModeSettings; class TtlSettings; class TtlTier; @@ -194,11 +195,33 @@ struct TExplicitPartitions { void SerializeTo(Ydb::Table::ExplicitPartitions& proto) const; }; +//! Represents table read replicas settings +class TReadReplicasSettings { +public: + enum class EMode { + PerAz = 0, + AnyAz = 1 + }; + + TReadReplicasSettings(EMode mode, ui64 readReplicasCount); + + EMode GetMode() const; + ui64 GetReadReplicasCount() const; + + static TMaybe FromProto(const Ydb::Table::ReadReplicasSettings& proto); + void SerializeTo(Ydb::Table::ReadReplicasSettings& proto) const; + +private: + EMode Mode_; + ui64 ReadReplicasCount_; +}; + struct TGlobalIndexSettings { using TUniformOrExplicitPartitions = std::variant; TPartitioningSettings PartitioningSettings; TUniformOrExplicitPartitions Partitions; + TMaybe ReadReplicasSettings; static TGlobalIndexSettings FromProto(const Ydb::Table::GlobalIndexSettings& proto); void SerializeTo(Ydb::Table::GlobalIndexSettings& proto) const; @@ -622,24 +645,6 @@ class TColumnFamilyDescription { std::shared_ptr Impl_; }; -//! Represents table read replicas settings -class TReadReplicasSettings { -public: - enum class EMode { - PerAz = 0, - AnyAz = 1 - }; - - TReadReplicasSettings(EMode mode, ui64 readReplicasCount); - - EMode GetMode() const; - ui64 GetReadReplicasCount() const; - -private: - EMode Mode_; - ui64 ReadReplicasCount_; -}; - struct TExplicitPartitions; struct TDescribeTableSettings; diff --git a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h index 0f8e9a079474..b9680dcca449 100644 --- a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h +++ b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h @@ -31,6 +31,7 @@ class GlobalIndexSettings; class VectorIndexSettings; class KMeansTreeSettings; class PartitioningSettings; +class ReadReplicasSettings; class DateTypeColumnModeSettings; class TtlSettings; class TtlTier; @@ -200,11 +201,33 @@ struct TExplicitPartitions { void SerializeTo(Ydb::Table::ExplicitPartitions& proto) const; }; +//! Represents table read replicas settings +class TReadReplicasSettings { +public: + enum class EMode { + PerAz = 0, + AnyAz = 1 + }; + + TReadReplicasSettings(EMode mode, uint64_t readReplicasCount); + + EMode GetMode() const; + uint64_t GetReadReplicasCount() const; + + static std::optional FromProto(const Ydb::Table::ReadReplicasSettings& proto); + void SerializeTo(Ydb::Table::ReadReplicasSettings& proto) const; + +private: + EMode Mode_; + uint64_t ReadReplicasCount_; +}; + struct TGlobalIndexSettings { using TUniformOrExplicitPartitions = std::variant; TPartitioningSettings PartitioningSettings; TUniformOrExplicitPartitions Partitions; + std::optional ReadReplicasSettings; static TGlobalIndexSettings FromProto(const Ydb::Table::GlobalIndexSettings& proto); @@ -630,24 +653,6 @@ class TColumnFamilyDescription { std::shared_ptr Impl_; }; -//! Represents table read replicas settings -class TReadReplicasSettings { -public: - enum class EMode { - PerAz = 0, - AnyAz = 1 - }; - - TReadReplicasSettings(EMode mode, uint64_t readReplicasCount); - - EMode GetMode() const; - uint64_t GetReadReplicasCount() const; - -private: - EMode Mode_; - uint64_t ReadReplicasCount_; -}; - enum class EStoreType { Row = 0, Column = 1 diff --git a/ydb/public/sdk/cpp/src/client/table/table.cpp b/ydb/public/sdk/cpp/src/client/table/table.cpp index db0240d6906c..84376f70f4b7 100644 --- a/ydb/public/sdk/cpp/src/client/table/table.cpp +++ b/ydb/public/sdk/cpp/src/client/table/table.cpp @@ -359,23 +359,7 @@ class TTableDescription::TImpl { } // read replicas settings - if (proto.has_read_replicas_settings()) { - const auto settings = proto.read_replicas_settings(); - switch (settings.settings_case()) { - case Ydb::Table::ReadReplicasSettings::kPerAzReadReplicasCount: - ReadReplicasSettings_ = TReadReplicasSettings( - TReadReplicasSettings::EMode::PerAz, - settings.per_az_read_replicas_count()); - break; - case Ydb::Table::ReadReplicasSettings::kAnyAzReadReplicasCount: - ReadReplicasSettings_ = TReadReplicasSettings( - TReadReplicasSettings::EMode::AnyAz, - settings.any_az_read_replicas_count()); - break; - default: - break; - } - } + ReadReplicasSettings_ = TReadReplicasSettings::FromProto(proto.read_replicas_settings()); } public: @@ -973,16 +957,7 @@ void TTableDescription::SerializeTo(Ydb::Table::CreateTableRequest& request) con } if (const auto& settings = Impl_->GetReadReplicasSettings()) { - switch (settings->GetMode()) { - case TReadReplicasSettings::EMode::PerAz: - request.mutable_read_replicas_settings()->set_per_az_read_replicas_count(settings->GetReadReplicasCount()); - break; - case TReadReplicasSettings::EMode::AnyAz: - request.mutable_read_replicas_settings()->set_any_az_read_replicas_count(settings->GetReadReplicasCount()); - break; - default: - break; - } + settings->SerializeTo(*request.mutable_read_replicas_settings()); } } @@ -1745,18 +1720,7 @@ static Ydb::Table::AlterTableRequest MakeAlterTableProtoRequest( if (settings.SetReadReplicasSettings_.has_value()) { const auto& replSettings = settings.SetReadReplicasSettings_.value(); - switch (replSettings.GetMode()) { - case TReadReplicasSettings::EMode::PerAz: - request.mutable_set_read_replicas_settings()->set_per_az_read_replicas_count( - replSettings.GetReadReplicasCount()); - break; - case TReadReplicasSettings::EMode::AnyAz: - request.mutable_set_read_replicas_settings()->set_any_az_read_replicas_count( - replSettings.GetReadReplicasCount()); - break; - default: - break; - } + replSettings.SerializeTo(*request.mutable_set_read_replicas_settings()); } return request; @@ -2373,6 +2337,34 @@ uint64_t TIndexDescription::GetSizeBytes() const { return SizeBytes_; } +std::optional TReadReplicasSettings::FromProto(const Ydb::Table::ReadReplicasSettings& proto) { + switch (proto.settings_case()) { + case Ydb::Table::ReadReplicasSettings::kPerAzReadReplicasCount: + return TReadReplicasSettings( + TReadReplicasSettings::EMode::PerAz, + proto.per_az_read_replicas_count()); + case Ydb::Table::ReadReplicasSettings::kAnyAzReadReplicasCount: + return TReadReplicasSettings( + TReadReplicasSettings::EMode::AnyAz, + proto.any_az_read_replicas_count()); + default: + return { }; + } +} + +void TReadReplicasSettings::SerializeTo(Ydb::Table::ReadReplicasSettings& proto) const { + switch (GetMode()) { + case TReadReplicasSettings::EMode::PerAz: + proto.set_per_az_read_replicas_count(GetReadReplicasCount()); + break; + case TReadReplicasSettings::EMode::AnyAz: + proto.set_any_az_read_replicas_count(GetReadReplicasCount()); + break; + default: + break; + } +} + TGlobalIndexSettings TGlobalIndexSettings::FromProto(const Ydb::Table::GlobalIndexSettings& proto) { auto partitionsFromProto = [](const Ydb::Table::GlobalIndexSettings& proto) -> TUniformOrExplicitPartitions { switch (proto.partitions_case()) { @@ -2387,7 +2379,8 @@ TGlobalIndexSettings TGlobalIndexSettings::FromProto(const Ydb::Table::GlobalInd return { .PartitioningSettings = TPartitioningSettings(proto.partitioning_settings()), - .Partitions = partitionsFromProto(proto) + .Partitions = partitionsFromProto(proto), + .ReadReplicasSettings = TReadReplicasSettings::FromProto(proto.read_replicas_settings()) }; } @@ -2403,6 +2396,10 @@ void TGlobalIndexSettings::SerializeTo(Ydb::Table::GlobalIndexSettings& settings } }; std::visit(std::move(variantVisitor), Partitions); + + if (ReadReplicasSettings) { + ReadReplicasSettings->SerializeTo(*settings.mutable_read_replicas_settings()); + } } TVectorIndexSettings TVectorIndexSettings::FromProto(const Ydb::Table::VectorIndexSettings& proto) { diff --git a/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp b/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp index 25be738c1c59..1819411642cc 100644 --- a/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp +++ b/ydb/services/ydb/backup_ut/ydb_backup_ut.cpp @@ -296,13 +296,14 @@ auto CreateHasSerialChecker(i64 nextValue, bool nextUsed) { auto CreateReadReplicasSettingsChecker(const NYdb::NTable::TReadReplicasSettings::EMode expectedMode, const ui64 expectedCount, const TString& debugHint = "") { return [=](const TTableDescription& tableDescription) { - UNIT_ASSERT_C(tableDescription.GetReadReplicasSettings().Defined(), debugHint); + UNIT_ASSERT_C(tableDescription.GetReadReplicasSettings(), debugHint); UNIT_ASSERT_C(tableDescription.GetReadReplicasSettings()->GetMode() == expectedMode, debugHint); UNIT_ASSERT_VALUES_EQUAL_C( tableDescription.GetReadReplicasSettings()->GetReadReplicasCount(), expectedCount, debugHint ); + return true; }; } @@ -486,20 +487,20 @@ void TestIndexTableReadReplicasSettingsArePreserved( )); ExecuteDataDefinitionQuery(session, Sprintf(R"( ALTER TABLE `%s` ALTER INDEX %s SET ( - READ_REPLICAS_SETTINGS = "%s:%)" PRIu64 R"( + READ_REPLICAS_SETTINGS = "%s:%)" PRIu64 R"(" ); )", table, index, readReplicasModeAsString.c_str(), readReplicasCount )); CheckTableDescription(session, indexTablePath, CreateReadReplicasSettingsChecker(readReplicasMode, readReplicasCount, DEBUG_HINT)); - backup(table); + backup(); ExecuteDataDefinitionQuery(session, Sprintf(R"( DROP TABLE `%s`; )", table )); - restore(table); + restore(); CheckTableDescription(session, indexTablePath, CreateReadReplicasSettingsChecker(readReplicasMode, readReplicasCount, DEBUG_HINT)); } @@ -1537,7 +1538,7 @@ Y_UNIT_TEST_SUITE(BackupRestore) { readReplicasMode, readReplicasCount, session, - CreateBackupLambda(driver, pathToBackup, true), + CreateBackupLambda(driver, pathToBackup), CreateRestoreLambda(driver, pathToBackup) ); } @@ -2458,9 +2459,9 @@ Y_UNIT_TEST_SUITE(BackupRestoreS3) { index, readReplicasMode, readReplicasCount, - testEnv.GetSession(), + testEnv.GetTableSession(), CreateBackupLambda(testEnv.GetDriver(), testEnv.GetS3Port()), - CreateRestoreLambda(testEnv.GetDriver(), testEnv.GetS3Port()) + CreateRestoreLambda(testEnv.GetDriver(), testEnv.GetS3Port(), { "table" }) ); } From 18e4eb703633dcf0502e1721ad2d0f47143911df Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:59:38 +0300 Subject: [PATCH 5/9] KIKIMR-21403: try to fix backup test --- ydb/core/ydb_convert/table_description.cpp | 6 +++++ ydb/core/ydb_convert/table_description.h | 2 ++ ydb/core/ydb_convert/table_settings.cpp | 27 +++++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ydb/core/ydb_convert/table_description.cpp b/ydb/core/ydb_convert/table_description.cpp index 1172bf4bdab2..aacd53912010 100644 --- a/ydb/core/ydb_convert/table_description.cpp +++ b/ydb/core/ydb_convert/table_description.cpp @@ -1015,6 +1015,7 @@ void FillGlobalIndexSettings(Ydb::Table::GlobalIndexSettings& settings, } FillPartitioningSettingsImpl(settings, indexImplTableDescription); + FillReadReplicasSettings(settings, indexImplTableDescription); } template @@ -1633,6 +1634,11 @@ void FillReadReplicasSettings(Ydb::Table::CreateTableRequest& out, FillReadReplicasSettingsImpl(out, in); } +void FillReadReplicasSettings(Ydb::Table::GlobalIndexSettings& out, + const NKikimrSchemeOp::TTableDescription& in) { + FillReadReplicasSettingsImpl(out, in); +} + bool FillTableDescription(NKikimrSchemeOp::TModifyScheme& out, const Ydb::Table::CreateTableRequest& in, const TTableProfiles& profiles, Ydb::StatusIds::StatusCode& status, TString& error, bool indexedTable) diff --git a/ydb/core/ydb_convert/table_description.h b/ydb/core/ydb_convert/table_description.h index 2da4f9197180..f4a1df5d60b0 100644 --- a/ydb/core/ydb_convert/table_description.h +++ b/ydb/core/ydb_convert/table_description.h @@ -141,6 +141,8 @@ void FillReadReplicasSettings(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TTableDescription& in); void FillReadReplicasSettings(Ydb::Table::CreateTableRequest& out, const NKikimrSchemeOp::TTableDescription& in); +void FillReadReplicasSettings(Ydb::Table::GlobalIndexSettings& out, + const NKikimrSchemeOp::TTableDescription& in); // in bool FillTableDescription(NKikimrSchemeOp::TModifyScheme& out, diff --git a/ydb/core/ydb_convert/table_settings.cpp b/ydb/core/ydb_convert/table_settings.cpp index 12553ff4411b..4ce304837f48 100644 --- a/ydb/core/ydb_convert/table_settings.cpp +++ b/ydb/core/ydb_convert/table_settings.cpp @@ -403,9 +403,10 @@ bool FillIndexTablePartitioning( ) { auto fillIndexPartitioning = [&](const Ydb::Table::GlobalIndexSettings& settings, std::vector& indexImplTableDescriptions) { auto& indexImplTableDescription = indexImplTableDescriptions.emplace_back(); + auto& partitionConfig = *indexImplTableDescription.MutablePartitionConfig(); if (settings.has_partitioning_settings()) { - if (!FillPartitioningPolicy(*indexImplTableDescription.MutablePartitionConfig(), settings, code, error)) { + if (!FillPartitioningPolicy(partitionConfig, settings, code, error)) { return false; } } @@ -414,6 +415,30 @@ bool FillIndexTablePartitioning( return false; } } + if (settings.has_read_replicas_settings()) { + const auto& readReplicasSettings = settings.read_replicas_settings(); + switch (readReplicasSettings.settings_case()) { + case Ydb::Table::ReadReplicasSettings::kPerAzReadReplicasCount: + { + auto& followerGroup = *partitionConfig.AddFollowerGroups(); + followerGroup.SetFollowerCount(readReplicasSettings.per_az_read_replicas_count()); + followerGroup.SetRequireAllDataCenters(true); + followerGroup.SetFollowerCountPerDataCenter(true); + break; + } + case Ydb::Table::ReadReplicasSettings::kAnyAzReadReplicasCount: + { + auto& followerGroup = *partitionConfig.AddFollowerGroups(); + followerGroup.SetFollowerCount(readReplicasSettings.any_az_read_replicas_count()); + followerGroup.SetRequireAllDataCenters(false); + break; + } + default: + code = Ydb::StatusIds::BAD_REQUEST; + error = TStringBuilder() << "Unknown read_replicas_settings type"; + return false; + } + } return true; }; From 0da9d34dac6c4ef6254f52f6ed1aac40c84e2f1a Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Fri, 2 May 2025 02:36:33 +0300 Subject: [PATCH 6/9] KIKIMR-21403: fix backup tests --- ydb/core/tx/schemeshard/schemeshard_utils.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ydb/core/tx/schemeshard/schemeshard_utils.cpp b/ydb/core/tx/schemeshard/schemeshard_utils.cpp index ec70a4fe58b4..7b874f08bf29 100644 --- a/ydb/core/tx/schemeshard/schemeshard_utils.cpp +++ b/ydb/core/tx/schemeshard/schemeshard_utils.cpp @@ -136,8 +136,10 @@ NKikimrSchemeOp::TPartitionConfig PartitionConfigForIndexes( if (baseTablePartitionConfig.HasKeepSnapshotTimeout()) { result.SetKeepSnapshotTimeout(baseTablePartitionConfig.GetKeepSnapshotTimeout()); } + if (indexTableDesc.GetPartitionConfig().FollowerGroupsSize()) { + result.MutableFollowerGroups()->CopyFrom(indexTableDesc.GetPartitionConfig().GetFollowerGroups()); + } // skip repeated NKikimrStorageSettings.TStorageRoom StorageRooms = 17; - // skip optional NKikimrHive.TFollowerGroup FollowerGroup = 23; return result; } From baf954b084404a8d1137cac442cf182078868e08 Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Fri, 2 May 2025 22:40:00 +0300 Subject: [PATCH 7/9] KIKIMR-21403: add StaleRO followers usage test --- ydb/core/kqp/ut/common/kqp_ut_common.cpp | 30 +++++++++ ydb/core/kqp/ut/common/kqp_ut_common.h | 1 + ydb/core/kqp/ut/opt/kqp_ne_ut.cpp | 80 ++++++++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.cpp b/ydb/core/kqp/ut/common/kqp_ut_common.cpp index 7626902c604b..6fa48a4d9643 100644 --- a/ydb/core/kqp/ut/common/kqp_ut_common.cpp +++ b/ydb/core/kqp/ut/common/kqp_ut_common.cpp @@ -1514,6 +1514,36 @@ void WaitForZeroReadIterators(Tests::TServer& server, const TString& path) { UNIT_ASSERT_C(iterators == 0, "Unable to wait for proper read iterator count, it looks like cancelation doesn`t work (" << iterators << ")"); } +int GetCumulativeCounterValue(Tests::TServer& server, const TString& path, const TString& counterName) { + int result = 0; + + TTestActorRuntime* runtime = server.GetRuntime(); + auto sender = runtime->AllocateEdgeActor(); + auto shards = GetTableShards(&server, sender, path); + UNIT_ASSERT_C(shards.size() > 0, "Table: " << path << " has no shards"); + + for (auto x : shards) { + runtime->SendToPipe( + x, + sender, + new TEvTablet::TEvGetCounters, + 0, + GetPipeConfigWithRetries()); + + auto ev = runtime->GrabEdgeEvent(sender); + UNIT_ASSERT(ev); + + const NKikimrTabletBase::TEvGetCountersResponse& resp = ev->Get()->Record; + for (const auto& counter : resp.GetTabletCounters().GetAppCounters().GetCumulativeCounters()) { + if (counter.GetName() == counterName) { + result += counter.GetValue(); + } + } + } + + return result; +} + TTableId ResolveTableId(Tests::TServer* server, TActorId sender, const TString& path) { auto response = Navigate(*server->GetRuntime(), sender, path, NSchemeCache::TSchemeCacheNavigate::EOp::OpUnknown); return response->ResultSet.at(0).TableId; diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.h b/ydb/core/kqp/ut/common/kqp_ut_common.h index d74d1877830d..7189d6ff0bd1 100644 --- a/ydb/core/kqp/ut/common/kqp_ut_common.h +++ b/ydb/core/kqp/ut/common/kqp_ut_common.h @@ -391,6 +391,7 @@ TVector GetColumnTableShards(Tests::TServer* server, TActorId sender, cons void WaitForZeroSessions(const NKqp::TKqpCounters& counters); void WaitForZeroReadIterators(Tests::TServer& server, const TString& path); +int GetCumulativeCounterValue(Tests::TServer& server, const TString& path, const TString& counterName); void WaitForCompaction(Tests::TServer* server, const TString& path, bool compactBorrowed = false); diff --git a/ydb/core/kqp/ut/opt/kqp_ne_ut.cpp b/ydb/core/kqp/ut/opt/kqp_ne_ut.cpp index 1cc680f99e60..e4e6e1962f0b 100644 --- a/ydb/core/kqp/ut/opt/kqp_ne_ut.cpp +++ b/ydb/core/kqp/ut/opt/kqp_ne_ut.cpp @@ -2372,6 +2372,11 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) { SELECT * FROM FollowersKv WHERE Key = 21; )", TTxControl::BeginTx(TTxSettings::StaleRO()).CommitTx()).ExtractValueSync(); AssertSuccessResult(result); + UNIT_ASSERT_UNEQUAL(0, GetCumulativeCounterValue( + kikimr.GetTestServer(), + "/Root/FollowersKv", + "DataShard/TxUpdateFollowerReadEdge/ExecuteCPUTime" + )); CompareYson(R"( [ @@ -2385,6 +2390,11 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) { SELECT * FROM FollowersKv WHERE Value != "One" ORDER BY Key; )", TTxControl::BeginTx(TTxSettings::StaleRO()).CommitTx()).ExtractValueSync(); AssertSuccessResult(result); + UNIT_ASSERT_UNEQUAL(0, GetCumulativeCounterValue( + kikimr.GetTestServer(), + "/Root/FollowersKv", + "DataShard/TxUpdateFollowerReadEdge/ExecuteCPUTime" + )); CompareYson(R"( [ @@ -2400,6 +2410,11 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) { SELECT * FROM TwoShard WHERE Key = 2; )", TTxControl::BeginTx(TTxSettings::StaleRO()).CommitTx()).ExtractValueSync(); AssertSuccessResult(result); + UNIT_ASSERT_EQUAL(0, GetCumulativeCounterValue( + kikimr.GetTestServer(), + "/Root/TwoShard", + "DataShard/TxUpdateFollowerReadEdge/ExecuteCPUTime" + )); CompareYson(R"( [ @@ -2420,6 +2435,11 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) { [[4000000001u];["BigOne"];[-1]] ] )", FormatResultSetYson(result.GetResultSet(0))); + UNIT_ASSERT_EQUAL(0, GetCumulativeCounterValue( + kikimr.GetTestServer(), + "/Root/TwoShard", + "DataShard/TxUpdateFollowerReadEdge/ExecuteCPUTime" + )); } Y_UNIT_TEST(StaleRO_Immediate) { @@ -2444,6 +2464,66 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) { )", FormatResultSetYson(result.GetResultSet(0))); } + Y_UNIT_TEST_TWIN(StaleRO_IndexFollowers, EnableFollowers) { + auto kikimr = DefaultKikimrRunner(); + auto db = kikimr.GetTableClient(); + auto session = db.CreateSession().GetValueSync().GetSession(); + + AssertSuccessResult(session.ExecuteSchemeQuery(R"( + --!syntax_v1 + CREATE TABLE `KeySubkey` ( + Key Uint64, + Subkey Uint64, + Value String, + Order Uint32, + PRIMARY KEY (Key, Subkey) + ); + + ALTER TABLE `KeySubkey` ADD INDEX `idx` GLOBAL SYNC ON (`Key`, `Order`) COVER (`Value`); + )").GetValueSync()); + + if constexpr (EnableFollowers) { + AssertSuccessResult(session.ExecuteSchemeQuery(R"( + --!syntax_v1 + ALTER TABLE `KeySubkey` ALTER INDEX `idx` SET READ_REPLICAS_SETTINGS "PER_AZ:1"; + )").GetValueSync()); + } + + AssertSuccessResult(session.ExecuteDataQuery(R"( + --!syntax_v1 + + REPLACE INTO `KeySubkey` (`Key`, `Subkey`, `Value`, `Order`) VALUES + (1u, 2u, "One", 7u), + (1u, 3u, "Two", 4u), + (21u, 8u, "Three", 1u), + (31u, 0u, "Four", 8u); + )", TTxControl::BeginTx().CommitTx()).GetValueSync()); + + auto result = session.ExecuteDataQuery(R"( + --!syntax_v1 + SELECT * FROM `KeySubkey` VIEW `idx` WHERE Key = 1 ORDER BY `Order`; + )", TTxControl::BeginTx(TTxSettings::StaleRO()).CommitTx()).ExtractValueSync(); + AssertSuccessResult(result); + + const auto FollowerCpuTime = GetCumulativeCounterValue( + kikimr.GetTestServer(), + "/Root/KeySubkey/idx/indexImplTable", + "DataShard/TxUpdateFollowerReadEdge/ExecuteCPUTime" + ); + if constexpr (EnableFollowers) { + UNIT_ASSERT_UNEQUAL(0, FollowerCpuTime); + } else { + UNIT_ASSERT_EQUAL(0, FollowerCpuTime); + } + + CompareYson(R"( + [ + [[1u];[4u];[3u];["Two"]]; + [[1u];[7u];[2u];["One"]]; + ] + )", FormatResultSetYson(result.GetResultSet(0))); + } + Y_UNIT_TEST(ReadRangeWithParams) { auto kikimr = DefaultKikimrRunner(); auto db = kikimr.GetTableClient(); From 2487748ad9746dfc16f2c05e1a3e494213f2a851 Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Sat, 3 May 2025 15:06:01 +0300 Subject: [PATCH 8/9] KIKIMR-21403: fix AlterTableAlterIndex test --- ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index 7e7c7a97bc3f..80e466c4aa80 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -2845,7 +2845,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) { constexpr ui64 readReplicasCount = 1; { const auto result = session.ExecuteSchemeQuery(Sprintf(R"( - ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET READ_REPLICAS_SETTINGS "%s:%)" PRIu64 R"(; + ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET READ_REPLICAS_SETTINGS "%s:%)" PRIu64 R"("; )", readReplicasModeAsString.data(), readReplicasCount ) ).ExtractValueSync(); From 6fb7d192d1fb37b138c3976da6579df773fd5895 Mon Sep 17 00:00:00 2001 From: stebloev <25842793+raydzast@users.noreply.github.com> Date: Mon, 5 May 2025 14:25:14 +0300 Subject: [PATCH 9/9] KIKIMR-21403: add AlterTableAlterIndex duplicate with QueryService usage --- ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 25 +++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index 80e466c4aa80..c8cf42b85f59 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -2802,19 +2802,30 @@ Y_UNIT_TEST_SUITE(KqpScheme) { AlterTableAddIndex(EIndexTypeSql::GlobalVectorKMeansTree); } - Y_UNIT_TEST(AlterTableAlterIndex) { + Y_UNIT_TEST_TWIN(AlterTableAlterIndex, UseQueryService) { TKikimrRunner kikimr; + auto queryClient = kikimr.GetQueryClient(); auto db = kikimr.GetTableClient(); auto session = db.CreateSession().GetValueSync().GetSession(); CreateSampleTablesWithIndex(session); + const auto executeGeneric = [&queryClient, &session](const TString& query) -> TStatus { + if constexpr (UseQueryService) { + Y_UNUSED(session); + return queryClient.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync(); + } else { + Y_UNUSED(queryClient); + return session.ExecuteSchemeQuery(query).ExtractValueSync(); + } + }; + constexpr int minPartitionsCount = 10; { - auto result = session.ExecuteSchemeQuery(Sprintf(R"( + const auto result = executeGeneric(Sprintf(R"( ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET AUTO_PARTITIONING_MIN_PARTITIONS_COUNT %d; )", minPartitionsCount ) - ).ExtractValueSync(); + ); UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); } { @@ -2826,11 +2837,11 @@ Y_UNIT_TEST_SUITE(KqpScheme) { constexpr int partitionSizeMb = 555; { - auto result = session.ExecuteSchemeQuery(Sprintf(R"( + const auto result = executeGeneric(Sprintf(R"( ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET AUTO_PARTITIONING_PARTITION_SIZE_MB %d; )", partitionSizeMb ) - ).ExtractValueSync(); + ); UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); } { @@ -2844,11 +2855,11 @@ Y_UNIT_TEST_SUITE(KqpScheme) { constexpr auto readReplicasMode = NYdb::NTable::TReadReplicasSettings::EMode::PerAz; constexpr ui64 readReplicasCount = 1; { - const auto result = session.ExecuteSchemeQuery(Sprintf(R"( + const auto result = executeGeneric(Sprintf(R"( ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET READ_REPLICAS_SETTINGS "%s:%)" PRIu64 R"("; )", readReplicasModeAsString.data(), readReplicasCount ) - ).ExtractValueSync(); + ); UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); } {