From b36d5ded0498b4cf614bb044e1d753c028f8d3a1 Mon Sep 17 00:00:00 2001 From: ivanmorozov333 Date: Sun, 8 Dec 2024 15:37:21 +0300 Subject: [PATCH 1/2] fix compaction policy modification --- .../optimizer/lcbuckets/constructor/constructor.cpp | 12 ++++++++++-- .../optimizer/lcbuckets/constructor/constructor.h | 8 ++++++++ .../optimizer/lcbuckets/constructor/zero_level.cpp | 3 +++ .../optimizer/lcbuckets/constructor/zero_level.h | 3 +++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp index bf813d2cc686..7975104723b3 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp @@ -18,6 +18,14 @@ bool TOptimizerPlannerConstructor::DoApplyToCurrentObject(IOptimizerPlanner& cur bool TOptimizerPlannerConstructor::DoIsEqualTo(const IOptimizerPlannerConstructor& item) const { const auto* itemClass = dynamic_cast(&item); AFL_VERIFY(itemClass); + if (Levels.size() != itemClass->Levels.size()) { + return false; + } + for (ui32 i = 0; i < Levels.size(); ++i) { + if (!Levels[i]->IsEqualTo(*itemClass->Levels[i])) { + return false; + } + } return true; } @@ -61,8 +69,8 @@ NKikimr::TConclusionStatus TOptimizerPlannerConstructor::DoDeserializeFromJson(c if (!level) { return TConclusionStatus::Fail("incorrect level class_name: " + className); } - if (!level->DeserializeFromJson(i["description"])) { - return TConclusionStatus::Fail("cannot parse level: " + className + ": " + i["description"].GetStringRobust()); + if (!level->DeserializeFromJson(i)) { + return TConclusionStatus::Fail("cannot parse level: " + i.GetStringRobust()); } Levels.emplace_back(TLevelConstructorContainer(std::shared_ptr(level.Release()))); } diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.h b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.h index f85249435eac..78a73993c57f 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.h +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.h @@ -12,6 +12,7 @@ class ILevelConstructor { virtual TConclusionStatus DoDeserializeFromJson(const NJson::TJsonValue& json) = 0; virtual bool DoDeserializeFromProto(const NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) = 0; virtual void DoSerializeToProto(NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) const = 0; + virtual bool IsEqualToSameClass(const ILevelConstructor& item) const = 0; public: using TFactory = NObjectFactory::TObjectFactory; @@ -19,6 +20,13 @@ class ILevelConstructor { virtual ~ILevelConstructor() = default; + bool IsEqualTo(const ILevelConstructor& item) const { + if (GetClassName() != item.GetClassName()) { + return false; + } + return IsEqualToSameClass(item); + } + std::shared_ptr BuildLevel( const std::shared_ptr& nextLevel, const ui32 indexLevel, const TLevelCounters& counters) const { return DoBuildLevel(nextLevel, indexLevel, counters); diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.cpp b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.cpp index 6a02746bc447..7b5d8599ec1c 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.cpp +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.cpp @@ -5,6 +5,9 @@ namespace NKikimr::NOlap::NStorageOptimizer::NLCBuckets { TConclusionStatus TZeroLevelConstructor::DoDeserializeFromJson(const NJson::TJsonValue& json) { + if (!json.IsMap()) { + return TConclusionStatus::Fail("incorrect level description"); + } if (json.Has("portions_live_duration")) { const auto& jsonValue = json["portions_live_duration"]; if (!jsonValue.IsString()) { diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h index 531c60f3690d..0c2b28976bd0 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h @@ -18,6 +18,9 @@ class TZeroLevelConstructor: public ILevelConstructor { virtual TConclusionStatus DoDeserializeFromJson(const NJson::TJsonValue& json) override; virtual bool DoDeserializeFromProto(const NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) override; virtual void DoSerializeToProto(NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) const override; + virtual bool IsEqualToSameClass(const ILevelConstructor& item) const override { + return PortionsLiveDuration == item.PortionsLiveDuration && ExpectedBlobsSize == item.ExpectedBlobsSize; + } static const inline TFactory::TRegistrator Registrator = TFactory::TRegistrator(GetClassNameStatic()); From 9b2d2ebba4ba47f5dbc2e2825c54bc99cffe2f31 Mon Sep 17 00:00:00 2001 From: ivanmorozov333 Date: Sun, 8 Dec 2024 16:14:34 +0300 Subject: [PATCH 2/2] fix build --- .../storage/optimizer/lcbuckets/constructor/constructor.cpp | 2 +- .../storage/optimizer/lcbuckets/constructor/zero_level.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp index 7975104723b3..bb81a47a5307 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/constructor.cpp @@ -22,7 +22,7 @@ bool TOptimizerPlannerConstructor::DoIsEqualTo(const IOptimizerPlannerConstructo return false; } for (ui32 i = 0; i < Levels.size(); ++i) { - if (!Levels[i]->IsEqualTo(*itemClass->Levels[i])) { + if (!Levels[i]->IsEqualTo(*itemClass->Levels[i].GetObjectPtrVerified())) { return false; } } diff --git a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h index 0c2b28976bd0..b80dc88d2a62 100644 --- a/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h +++ b/ydb/core/tx/columnshard/engines/storage/optimizer/lcbuckets/constructor/zero_level.h @@ -19,7 +19,8 @@ class TZeroLevelConstructor: public ILevelConstructor { virtual bool DoDeserializeFromProto(const NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) override; virtual void DoSerializeToProto(NKikimrSchemeOp::TCompactionLevelConstructorContainer& proto) const override; virtual bool IsEqualToSameClass(const ILevelConstructor& item) const override { - return PortionsLiveDuration == item.PortionsLiveDuration && ExpectedBlobsSize == item.ExpectedBlobsSize; + const auto& itemCast = dynamic_cast(item); + return PortionsLiveDuration == itemCast.PortionsLiveDuration && ExpectedBlobsSize == itemCast.ExpectedBlobsSize; } static const inline TFactory::TRegistrator Registrator = TFactory::TRegistrator(GetClassNameStatic());