Skip to content

Statistics: portion of bug fixes #10718

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
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
5 changes: 5 additions & 0 deletions ydb/core/kqp/provider/yql_kikimr_exec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2320,6 +2320,11 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
}

if (auto maybeAnalyze = TMaybeNode<TKiAnalyzeTable>(input)) {
if (!SessionCtx->Config().FeatureFlags.GetEnableColumnStatistics()) {
ctx.AddError(TIssue("ANALYZE command is not supported because `EnableColumnStatistics` feature flag is off"));
return SyncError();
}

auto cluster = TString(maybeAnalyze.Cast().DataSink().Cluster());

TAnalyzeSettings analyzeSettings = ParseAnalyzeSettings(maybeAnalyze.Cast());
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/kqp/ut/query/kqp_analyze_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ Y_UNIT_TEST_SUITE(KqpAnalyze) {
using namespace NStat;

Y_UNIT_TEST_TWIN(AnalyzeTable, ColumnStore) {
TTestEnv env(1, 1, 1, true);
TTestEnv env(1, 1, true);

CreateDatabase(env, "Database");

TTableClient client(env.GetDriver());
Expand Down
10 changes: 7 additions & 3 deletions ydb/core/statistics/aggregator/aggregator_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,11 @@ void TStatisticsAggregator::InitializeStatisticsTable() {
if (!EnableColumnStatistics) {
return;
}
Register(CreateStatisticsTableCreator(std::make_unique<TEvStatistics::TEvStatTableCreationResponse>()));
if (!Database) {
return;
}
Register(CreateStatisticsTableCreator(
std::make_unique<TEvStatistics::TEvStatTableCreationResponse>(), Database));
}

void TStatisticsAggregator::Navigate() {
Expand Down Expand Up @@ -598,7 +602,7 @@ void TStatisticsAggregator::SaveStatisticsToTable() {
data.push_back(strSketch);
}

Register(CreateSaveStatisticsQuery(SelfId(),
Register(CreateSaveStatisticsQuery(SelfId(), Database,
TraversalPathId, EStatType::COUNT_MIN_SKETCH, std::move(columnTags), std::move(data)));
}

Expand All @@ -610,7 +614,7 @@ void TStatisticsAggregator::DeleteStatisticsFromTable() {

PendingDeleteStatistics = false;

Register(CreateDeleteStatisticsQuery(SelfId(), TraversalPathId));
Register(CreateDeleteStatisticsQuery(SelfId(), Database, TraversalPathId));
}

void TStatisticsAggregator::ScheduleNextAnalyze(NIceDb::TNiceDb& db) {
Expand Down
5 changes: 5 additions & 0 deletions ydb/core/statistics/aggregator/tx_configure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,13 @@ struct TStatisticsAggregator::TTxConfigure : public TTxBase {

NIceDb::TNiceDb db(txc.DB);

bool needInitialize = !Self->Database;
Self->Database = Record.GetDatabase();
Self->PersistSysParam(db, Schema::SysParam_Database, Self->Database);

if (needInitialize) {
Self->InitializeStatisticsTable();
}
return true;
}

Expand Down
4 changes: 3 additions & 1 deletion ydb/core/statistics/aggregator/tx_init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,9 @@ struct TStatisticsAggregator::TTxInit : public TTxBase {
SA_LOG_W("[" << Self->TabletID() << "] TTxInit::Complete. EnableColumnStatistics=false");
}

Self->InitializeStatisticsTable();
if (Self->Database) {
Self->InitializeStatisticsTable();
}

if (Self->TraversalPathId && Self->TraversalStartKey) {
SA_LOG_D("[" << Self->TabletID() << "] TTxInit::Complete. Start navigate. PathId " << Self->TraversalPathId);
Expand Down
52 changes: 32 additions & 20 deletions ydb/core/statistics/aggregator/ut/ut_analyze_columnshard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,45 +9,48 @@
namespace NKikimr {
namespace NStat {



Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeTable) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];

AnalyzeTable(runtime, tableInfo.ShardIds[0], tableInfo.PathId);
}

Y_UNIT_TEST(Analyze) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];

Analyze(runtime, tableInfo.SaTabletId, {tableInfo.PathId});
}

Y_UNIT_TEST(AnalyzeServerless) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateServerlessDatabaseColumnTables(env, 1, 1)[0];
auto databaseInfo = CreateServerlessDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];

Analyze(runtime, tableInfo.SaTabletId, {tableInfo.PathId});
}

Y_UNIT_TEST(AnalyzeAnalyzeOneColumnTableSpecificColumns) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];

Analyze(runtime, tableInfo.SaTabletId, {{tableInfo.PathId, {1, 2}}});
}

Y_UNIT_TEST(AnalyzeTwoColumnTables) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfos = CreateDatabaseColumnTables(env, 2, 1);
auto databaseInfo = CreateDatabaseColumnTables(env, 2, 1);
const auto& tableInfos = databaseInfo.Tables;

Analyze(runtime, tableInfos[0].SaTabletId, {tableInfos[0].PathId, tableInfos[1].PathId});
}
Expand All @@ -58,11 +61,10 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
auto sender = runtime.AllocateEdgeActor();

TBlockEvents<TEvStatistics::TEvAnalyzeTableResponse> block(runtime);

auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];

const TString operationId = "operationId";

AnalyzeStatus(runtime, sender, tableInfo.SaTabletId, operationId, NKikimrStat::TEvAnalyzeStatusResponse::STATUS_NO_OPERATION);

auto analyzeRequest = MakeAnalyzeRequest({{tableInfo.PathId, {1, 2}}}, operationId);
Expand Down Expand Up @@ -93,7 +95,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeSameOperationId) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();
const TString operationId = "operationId";

Expand Down Expand Up @@ -123,7 +126,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeMultiOperationId) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

auto GetOperationId = [] (size_t i) { return TStringBuilder() << "operationId" << i; };
Expand Down Expand Up @@ -154,7 +158,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaBeforeAnalyzeTableResponse) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

bool eventSeen = false;
Expand All @@ -179,7 +184,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaBeforeResolve) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

TBlockEvents<TEvTxProxySchemeCache::TEvResolveKeySetResult> block(runtime);
Expand Down Expand Up @@ -207,7 +213,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaBeforeReqDistribution) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

bool eventSeen = false;
Expand All @@ -232,7 +239,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaBeforeAggregate) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

bool eventSeen = false;
Expand All @@ -257,7 +265,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaBeforeSave) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

bool eventSeen = false;
Expand All @@ -282,7 +291,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootSaInAggregate) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 10)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 10);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

int observerCount = 0;
Expand All @@ -308,7 +318,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeRebootColumnShard) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

TBlockEvents<TEvStatistics::TEvAnalyzeTableResponse> block(runtime);
Expand All @@ -326,7 +337,8 @@ Y_UNIT_TEST_SUITE(AnalyzeColumnshard) {
Y_UNIT_TEST(AnalyzeDeadline) {
TTestEnv env(1, 1);
auto& runtime = *env.GetServer().GetRuntime();
auto tableInfo = CreateDatabaseColumnTables(env, 1, 1)[0];
const auto databaseInfo = CreateDatabaseColumnTables(env, 1, 1);
const auto& tableInfo = databaseInfo.Tables[0];
auto sender = runtime.AllocateEdgeActor();

TBlockEvents<TEvStatistics::TEvAnalyzeTableResponse> block(runtime);
Expand Down
54 changes: 10 additions & 44 deletions ydb/core/statistics/aggregator/ut/ut_analyze_datashard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,56 +7,35 @@
#include <ydb/core/statistics/events.h>
#include <ydb/core/statistics/service/service.h>

#include <thread>

namespace NKikimr {
namespace NStat {

namespace {


} // namespace

Y_UNIT_TEST_SUITE(AnalyzeDatashard) {

Y_UNIT_TEST(AnalyzeOneTable) {
TTestEnv env(1, 1);
auto init = [&] () {
CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table");
};
std::thread initThread(init);

auto& runtime = *env.GetServer().GetRuntime();
runtime.SimulateSleep(TDuration::Seconds(5));
initThread.join();

CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table");

ui64 saTabletId;
auto pathId = ResolvePathId(runtime, "/Root/Database/Table", nullptr, &saTabletId);

runtime.SimulateSleep(TDuration::Seconds(30));

Analyze(runtime, saTabletId, {{pathId}});

ValidateCountMinDatashardAbsense(runtime, pathId);
}

Y_UNIT_TEST(AnalyzeTwoTables) {
TTestEnv env(1, 1);
auto init = [&] () {
CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table1");
CreateUniformTable(env, "Database", "Table2");
};
// TODO remove thread
std::thread initThread(init);

auto& runtime = *env.GetServer().GetRuntime();
runtime.SimulateSleep(TDuration::Seconds(5));
initThread.join();

// TODO remove sleep
runtime.SimulateSleep(TDuration::Seconds(30));
CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table1");
CreateUniformTable(env, "Database", "Table2");

ui64 saTabletId1;
auto pathId1 = ResolvePathId(runtime, "/Root/Database/Table1", nullptr, &saTabletId1);
Expand All @@ -68,34 +47,21 @@ Y_UNIT_TEST_SUITE(AnalyzeDatashard) {
ValidateCountMinDatashardAbsense(runtime, pathId2);
}


Y_UNIT_TEST(DropTableNavigateError) {
TTestEnv env(1, 1);
auto init = [&] () {
CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table");
};
std::thread initThread(init);

auto& runtime = *env.GetServer().GetRuntime();
runtime.SimulateSleep(TDuration::Seconds(5));
initThread.join();

CreateDatabase(env, "Database");
CreateUniformTable(env, "Database", "Table");

ui64 saTabletId = 0;
auto pathId = ResolvePathId(runtime, "/Root/Database/Table", nullptr, &saTabletId);

auto init2 = [&] () {
DropTable(env, "Database", "Table");
};
std::thread init2Thread(init2);

runtime.SimulateSleep(TDuration::Seconds(5));
init2Thread.join();
DropTable(env, "Database", "Table");

Analyze(runtime, saTabletId, {pathId});

runtime.SimulateSleep(TDuration::Seconds(10));

ValidateCountMinDatashardAbsense(runtime, pathId);
}
}
Expand Down
Loading
Loading