Skip to content
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

add scheme object: tiering rules #10100

Draft
wants to merge 36 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
20c7b1a
add scheme object: tiering rules
swalrus1 Oct 4, 2024
9ecaf35
fix build
swalrus1 Oct 4, 2024
d7b12d4
fix build
swalrus1 Oct 4, 2024
6c7ebc1
nit-pick ttl validation
swalrus1 Oct 4, 2024
718e01c
fix build
swalrus1 Oct 4, 2024
cbb848d
wip
swalrus1 Oct 8, 2024
9b214e7
fix build
swalrus1 Oct 9, 2024
d49c75e
fix fetching
swalrus1 Oct 10, 2024
2aa0645
fix list
swalrus1 Oct 10, 2024
b06a8fe
add tiering rule validation on CREATE TABLE
swalrus1 Oct 10, 2024
f00810b
fix tests
swalrus1 Oct 10, 2024
cf60fd4
fix build
swalrus1 Oct 10, 2024
b01fa45
minor fixes
swalrus1 Oct 10, 2024
7d61b44
revert adding bugs *-*
swalrus1 Oct 10, 2024
0ce4a88
fix ut_olap
swalrus1 Oct 11, 2024
bfebe8d
fixxxxxxxx
swalrus1 Oct 11, 2024
165776d
fix tier manager and tiering_rule manager
swalrus1 Oct 11, 2024
509c9cb
fix ut_tiers
swalrus1 Oct 11, 2024
c774691
fix drop
swalrus1 Oct 11, 2024
5437404
delay persisting changes on drop
swalrus1 Oct 11, 2024
5c9b532
fix ColumnShardTiers.TieringUsage
swalrus1 Oct 11, 2024
014cb5b
nit-pick entity update
swalrus1 Oct 13, 2024
d54808f
unify interface to modify metadata object
swalrus1 Oct 13, 2024
4ff5894
wip
swalrus1 Oct 15, 2024
17a7b1e
add TieringRuleInfo base class
swalrus1 Oct 21, 2024
a37cd49
wip
swalrus1 Oct 22, 2024
d9f2a14
checkpoint: compiles
swalrus1 Oct 23, 2024
32eea77
checkpoint: compiles
swalrus1 Oct 23, 2024
cb59983
fix linking
swalrus1 Oct 23, 2024
55e7723
fix alter
swalrus1 Oct 24, 2024
ddfdc4a
support modification via query service ddl
swalrus1 Oct 27, 2024
828600d
fix paths in modifications
swalrus1 Oct 28, 2024
039f629
fix tests with reboot
swalrus1 Oct 28, 2024
4db3846
fix build
swalrus1 Oct 28, 2024
cb62f6d
fix build
swalrus1 Oct 28, 2024
598569d
fix settings serialization
swalrus1 Oct 28, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <ydb/services/metadata/secret/fetcher.h>
#include <ydb/services/metadata/secret/snapshot.h>
#include <ydb/services/metadata/service.h>


namespace NKikimr::NKqp {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <ydb/services/metadata/abstract/initialization.h>
#include <ydb/services/metadata/abstract/kqp_common.h>
#include <ydb/services/metadata/manager/abstract.h>


namespace NKikimr::NKqp {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "object.h"
#include "behaviour.h"

#include <ydb/services/metadata/manager/ydb_value_operator.h>

#include <library/cpp/json/json_reader.h>


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <ydb/core/resource_pools/resource_pool_classifier_settings.h>

#include <ydb/services/metadata/abstract/decoder.h>
#include <ydb/services/metadata/abstract/kqp_common.h>
#include <ydb/services/metadata/manager/object.h>


Expand Down
1 change: 1 addition & 0 deletions ydb/core/kqp/proxy_service/kqp_proxy_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <ydb/core/protos/feature_flags.pb.h>

#include <ydb/library/actors/core/actorid.h>
#include <ydb/services/metadata/service.h>

#include <util/datetime/base.h>

Expand Down
107 changes: 93 additions & 14 deletions ydb/core/kqp/ut/olap/tiering_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,39 @@

namespace NKikimr::NKqp {

Y_UNIT_TEST_SUITE(KqpOlapTiering) {
Y_UNIT_TEST(Eviction) {
class TTestEvictionBase {
protected:
std::optional<TTestHelper> TestHelper;
TString TieringRule;

protected:
virtual void UnevictAll() = 0;

public:
void RunTest() {
auto csController = NYDBTest::TControllers::RegisterCSControllerGuard<NOlap::TWaitCompactionController>();

TKikimrSettings runnerSettings;
runnerSettings.WithSampleTables = false;
TTestHelper testHelper(runnerSettings);
TLocalHelper localHelper(testHelper.GetKikimr());
NYdb::NTable::TTableClient tableClient = testHelper.GetKikimr().GetTableClient();
Tests::NCommon::TLoggerInit(testHelper.GetKikimr()).Initialize();
TestHelper.emplace(runnerSettings);
TLocalHelper localHelper(TestHelper->GetKikimr());
// TestHelper->GetRuntime().SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NActors::NLog::PRI_DEBUG);
// TestHelper->GetRuntime().SetLogPriority(NKikimrServices::TX_COLUMNSHARD, NActors::NLog::PRI_DEBUG);
TestHelper->GetRuntime().SetLogPriority(NKikimrServices::TX_TIERING, NActors::NLog::PRI_DEBUG);
// TestHelper->GetRuntime().SetLogPriority(NKikimrServices::KQP_GATEWAY, NActors::NLog::PRI_DEBUG);
// TestHelper->GetRuntime().SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NActors::NLog::PRI_DEBUG);
// TestHelper->GetRuntime().SetLogPriority(NKikimrServices::TX_PROXY, NActors::NLog::PRI_DEBUG);
NYdb::NTable::TTableClient tableClient = TestHelper->GetKikimr().GetTableClient();
Tests::NCommon::TLoggerInit(TestHelper->GetKikimr()).Initialize();
Singleton<NKikimr::NWrappers::NExternalStorage::TFakeExternalStorage>()->SetSecretKey("fakeSecret");

localHelper.CreateTestOlapTable();
testHelper.CreateTier("tier1");
const TString tieringRule = testHelper.CreateTieringRule("tier1", "timestamp");
TestHelper->CreateTier("tier1");
TieringRule = TestHelper->CreateTieringRule("tier1", "timestamp");

for (ui64 i = 0; i < 100; ++i) {
WriteTestData(testHelper.GetKikimr(), "/Root/olapStore/olapTable", 0, i * 10000, 1000);
WriteTestData(testHelper.GetKikimr(), "/Root/olapStore/olapTable", 0, i * 10000, 1000);
WriteTestData(TestHelper->GetKikimr(), "/Root/olapStore/olapTable", 0, 3600000000 + i * 10000, 1000);
WriteTestData(TestHelper->GetKikimr(), "/Root/olapStore/olapTable", 0, 3600000000 + i * 10000, 1000);
}

csController->WaitCompactions(TDuration::Seconds(5));
Expand All @@ -54,7 +68,7 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
UNIT_ASSERT_GT(columnRawBytes, 0);
}

testHelper.SetTiering("/Root/olapStore/olapTable", tieringRule);
TestHelper->SetTiering("/Root/olapStore/olapTable", TieringRule);
csController->WaitActualization(TDuration::Seconds(5));

{
Expand All @@ -71,10 +85,10 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
UNIT_ASSERT_VALUES_EQUAL(GetUtf8(rows[0].at("TierName")), "tier1");
UNIT_ASSERT_VALUES_EQUAL_C(GetUint64(rows[0].at("RawBytes")), columnRawBytes,
TStringBuilder() << "RawBytes changed after eviction: before=" << columnRawBytes
<< " after=" << GetUint64(rows[0].at("RawBytes")));
<< " after=" << GetUint64(rows[0].at("RawBytes")));
}

testHelper.ResetTiering("/Root/olapStore/olapTable");
UnevictAll();
csController->WaitCompactions(TDuration::Seconds(5));

{
Expand All @@ -91,8 +105,44 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
UNIT_ASSERT_VALUES_EQUAL(GetUtf8(rows[0].at("TierName")), "__DEFAULT");
UNIT_ASSERT_VALUES_EQUAL_C(GetUint64(rows[0].at("RawBytes")), columnRawBytes,
TStringBuilder() << "RawBytes changed after resetting tiering: before=" << columnRawBytes
<< " after=" << GetUint64(rows[0].at("RawBytes")));
<< " after=" << GetUint64(rows[0].at("RawBytes")));
}

}
};

class TTestEvictionResetTiering : public TTestEvictionBase {
private:
void UnevictAll() {
TestHelper->ResetTiering("/Root/olapStore/olapTable");
}
};

class TTestEvictionIncreaseDuration : public TTestEvictionBase {
private:
void UnevictAll() {
const TString query = R"(ALTER OBJECT )" + TieringRule + R"( (TYPE TIERING_RULE)
SET (description = `{
"rules" : [
{
"tierName" : "tier1",
"durationForEvict" : "100000000000d"
}
]
}`))";
auto result = TestHelper->GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
}
};

Y_UNIT_TEST_SUITE(KqpOlapTiering) {

Y_UNIT_TEST(EvictionResetTiering) {
TTestEvictionResetTiering().RunTest();
}

Y_UNIT_TEST(EvictionIncreaseDuration) {
TTestEvictionIncreaseDuration().RunTest();
}

Y_UNIT_TEST(TieringRuleValidation) {
Expand All @@ -102,13 +152,24 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
runnerSettings.WithSampleTables = false;
TTestHelper testHelper(runnerSettings);
TLocalHelper localHelper(testHelper.GetKikimr());
// testHelper.GetRuntime().SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NActors::NLog::PRI_DEBUG);
testHelper.GetRuntime().SetLogPriority(NKikimrServices::TX_TIERING, NActors::NLog::PRI_DEBUG);
// testHelper.GetRuntime().SetLogPriority(NKikimrServices::KQP_GATEWAY, NActors::NLog::PRI_DEBUG);
// testHelper.GetRuntime().SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NActors::NLog::PRI_DEBUG);
// testHelper.GetRuntime().SetLogPriority(NKikimrServices::TX_PROXY, NActors::NLog::PRI_DEBUG);
NYdb::NTable::TTableClient tableClient = testHelper.GetKikimr().GetTableClient();
Tests::NCommon::TLoggerInit(testHelper.GetKikimr()).Initialize();
Singleton<NKikimr::NWrappers::NExternalStorage::TFakeExternalStorage>()->SetSecretKey("fakeSecret");

localHelper.CreateTestOlapTable();
testHelper.CreateTier("tier1");

{
const TString query = R"(ALTER TABLE `/Root/olapStore/olapTable` SET TIERING = "unknown_tiering";)";
auto result = testHelper.GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_UNEQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);
}

{
const TString query = R"(
CREATE OBJECT IF NOT EXISTS empty_tiering_rule (TYPE TIERING_RULE)
Expand All @@ -133,6 +194,18 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
UNIT_ASSERT_VALUES_UNEQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);
}

{
TString query = R"(
CREATE OBJECT IF NOT EXISTS wrong_default_column (TYPE TIERING_RULE)
WITH (defaultColumn = `unknown_column`, description = `{"rules": [{ "tierName" : "tier1", "durationForEvict" : "10d" }]}`))";
auto result = testHelper.GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);

query = R"(ALTER TABLE `/Root/olapStore/olapTable` SET TIERING = "wrong_default_column";)";
result = testHelper.GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_UNEQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);
}

const TString correctTieringRule = testHelper.CreateTieringRule("tier1", "timestamp");
{
const TString query = "ALTER OBJECT " + correctTieringRule + R"( (TYPE TIERING_RULE) SET description `{"rules": []}`)";
Expand All @@ -157,6 +230,12 @@ Y_UNIT_TEST_SUITE(KqpOlapTiering) {
auto result = testHelper.GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_UNEQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);
}

{
const TString query = "DROP OBJECT tier1 (TYPE TIER)";
auto result = testHelper.GetSession().ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_UNEQUAL(result.GetStatus(), NYdb::EStatus::SUCCESS);
}
}
}

Expand Down
27 changes: 17 additions & 10 deletions ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5135,11 +5135,16 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
TKikimrSettings runnerSettings;
runnerSettings.WithSampleTables = false;
runnerSettings.SetEnableTieringInColumnShard(true);
TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
TTestHelper testHelper(runnerSettings);
auto db = testHelper.GetKikimr().GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableName = "/Root/ColumnTableTest";

testHelper.CreateTier("tier1");
testHelper.CreateTier("tier2");
const auto tieringRule1 = testHelper.CreateTieringRule("tier1", "Key");
const auto tieringRule2 = testHelper.CreateTieringRule("tier2", "Key");

auto query = TStringBuilder() << R"(
--!syntax_v1
CREATE TABLE `)" << tableName << R"(` (
Expand All @@ -5152,7 +5157,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
WITH (
STORE = COLUMN,
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10,
TIERING = 'tiering1'
TIERING = ')" << tieringRule1 << R"('
);)";
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
Expand All @@ -5168,7 +5173,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
#endif
auto query2 = TStringBuilder() << R"(
--!syntax_v1
ALTER TABLE `)" << tableName << R"(` SET(TIERING = 'tiering2');)";
ALTER TABLE `)" << tableName << R"(` SET(TIERING = ')" << tieringRule2 << R"(');)";
result = session.ExecuteSchemeQuery(query2).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

Expand All @@ -5178,7 +5183,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {

auto tiering = desc.GetTableDescription().GetTiering();
UNIT_ASSERT(tiering);
UNIT_ASSERT_VALUES_EQUAL(*tiering, "tiering2");
UNIT_ASSERT_VALUES_EQUAL(*tiering, tieringRule2);
}

auto query3 = TStringBuilder() << R"(
Expand All @@ -5197,7 +5202,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {

auto query4 = TStringBuilder() << R"(
--!syntax_v1
ALTER TABLE `)" << tableName << R"(` SET (TIERING = 'tiering1');)";
ALTER TABLE `)" << tableName << R"(` SET (TIERING = ')" << tieringRule1 << R"(');)";
result = session.ExecuteSchemeQuery(query4).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

Expand All @@ -5207,7 +5212,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {

auto tiering = desc.GetTableDescription().GetTiering();
UNIT_ASSERT(tiering);
UNIT_ASSERT_VALUES_EQUAL(*tiering, "tiering1");
UNIT_ASSERT_VALUES_EQUAL(*tiering, tieringRule1);
}

auto query5 = TStringBuilder() << R"(
Expand Down Expand Up @@ -7772,6 +7777,8 @@ Y_UNIT_TEST_SUITE(KqpOlapScheme) {
TTestHelper::TColumnTable testTable;
testTable.SetName("/Root/ColumnTableTest").SetPrimaryKey({"id", "id_second"}).SetSharding({"id"}).SetSchema(schema);
testHelper.CreateTable(testTable);
testHelper.CreateTier("tier1");
const TString tieringName = testHelper.CreateTieringRule("tier1", "created_at");

{
auto alterQuery = TStringBuilder() << R"(
Expand Down Expand Up @@ -7813,15 +7820,15 @@ Y_UNIT_TEST_SUITE(KqpOlapScheme) {
UNIT_ASSERT_VALUES_EQUAL(columns.size(), 5);
UNIT_ASSERT_VALUES_EQUAL(description.GetTtlSettings()->GetDateTypeColumn().GetExpireAfter(), TDuration::Hours(1));
}
testHelper.SetTiering("/Root/ColumnTableTest", "tiering1");
testHelper.SetTiering("/Root/ColumnTableTest", tieringName);
{
auto settings = TDescribeTableSettings().WithTableStatistics(true);
auto describeResult = testHelper.GetSession().DescribeTable("/Root/ColumnTableTest", settings).GetValueSync();
UNIT_ASSERT_C(describeResult.IsSuccess(), describeResult.GetIssues().ToString());

const auto& description = describeResult.GetTableDescription();
UNIT_ASSERT(description.GetTiering());
UNIT_ASSERT_VALUES_EQUAL(*description.GetTiering(), "tiering1");
UNIT_ASSERT_VALUES_EQUAL(*description.GetTiering(), tieringName);
UNIT_ASSERT_VALUES_EQUAL(description.GetTtlSettings()->GetDateTypeColumn().GetExpireAfter(), TDuration::Hours(1));
}
{
Expand All @@ -7836,7 +7843,7 @@ Y_UNIT_TEST_SUITE(KqpOlapScheme) {

const auto& description = describeResult.GetTableDescription();
UNIT_ASSERT(description.GetTiering());
UNIT_ASSERT_VALUES_EQUAL(*description.GetTiering(), "tiering1");
UNIT_ASSERT_VALUES_EQUAL(*description.GetTiering(), tieringName);
UNIT_ASSERT(!description.GetTtlSettings());
}
testHelper.ResetTiering("/Root/ColumnTableTest");
Expand Down
10 changes: 10 additions & 0 deletions ydb/core/protos/counters_schemeshard.proto
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,12 @@ enum ESimpleCounters {
COUNTER_IN_FLIGHT_OPS_TxCreateBackupCollection = 179 [(CounterOpts) = {Name: "InFlightOps/CreateBackupCollection"}];
COUNTER_IN_FLIGHT_OPS_TxAlterBackupCollection = 180 [(CounterOpts) = {Name: "InFlightOps/AlterBackupCollection"}];
COUNTER_IN_FLIGHT_OPS_TxDropBackupCollection = 181 [(CounterOpts) = {Name: "InFlightOps/DropBackupCollection"}];

COUNTER_IN_FLIGHT_OPS_TxCreateMetadataObject = 182 [(CounterOpts) = {Name: "InFlightOps/CreateMetadataObject"}];
COUNTER_IN_FLIGHT_OPS_TxDropMetadataObject = 183 [(CounterOpts) = {Name: "InFlightOps/DropMetadataObject"}];
COUNTER_IN_FLIGHT_OPS_TxAlterMetadataObject = 184 [(CounterOpts) = {Name: "InFlightOps/AlterMetadataObject"}];

COUNTER_TIERING_RULE_COUNT = 185 [(CounterOpts) = {Name: "TieringRuleCount"}];
}

enum ECumulativeCounters {
Expand Down Expand Up @@ -363,6 +369,10 @@ enum ECumulativeCounters {
COUNTER_FINISHED_OPS_TxCreateBackupCollection = 107 [(CounterOpts) = {Name: "FinishedOps/CreateBackupCollection"}];
COUNTER_FINISHED_OPS_TxAlterBackupCollection = 108 [(CounterOpts) = {Name: "FinishedOps/AlterBackupCollection"}];
COUNTER_FINISHED_OPS_TxDropBackupCollection = 109 [(CounterOpts) = {Name: "FinishedOps/DropBackupCollection"}];

COUNTER_FINISHED_OPS_TxCreateMetadataObject = 110 [(CounterOpts) = {Name: "FinishedOps/CreateMetadataObject"}];
COUNTER_FINISHED_OPS_TxDropMetadataObject = 111 [(CounterOpts) = {Name: "FinishedOps/DropMetadataObject"}];
COUNTER_FINISHED_OPS_TxAlterMetadataObject = 112 [(CounterOpts) = {Name: "FinishedOps/AlterMetadataObject"}];
}

enum EPercentileCounters {
Expand Down
Loading
Loading