diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-01-13 15:07:36 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-01-13 15:07:36 +0300 |
commit | 929d3c1fca6385c69d56a2b24ac3f11bf072c2ee (patch) | |
tree | 1a5383b18ab6331f352efe5b6ac9a3ec2aa35843 | |
parent | a4fe524f1ed62f0599525059e8d70b1fa5758960 (diff) | |
download | ydb-929d3c1fca6385c69d56a2b24ac3f11bf072c2ee.tar.gz |
add test for no artefacts on initialization
19 files changed, 217 insertions, 112 deletions
diff --git a/ydb/services/bg_tasks/ds_table/fetch_tasks.cpp b/ydb/services/bg_tasks/ds_table/fetch_tasks.cpp index b254c836c8..2ed0b7c533 100644 --- a/ydb/services/bg_tasks/ds_table/fetch_tasks.cpp +++ b/ydb/services/bg_tasks/ds_table/fetch_tasks.cpp @@ -34,7 +34,7 @@ std::optional<NMetadata::NRequest::TDialogYQLRequest::TRequest> TFetchTasksActor sb << "AND enabled = true" << Endl; sb << "AND lastPing > $lastPingCriticalBorder" << Endl; if (CurrentTaskIds.size()) { - sb << " AND id NOT IN ($taskIds)" << Endl; + sb << " AND id NOT IN $taskIds" << Endl; auto& idStrings = (*request.mutable_parameters())["$taskIds"]; idStrings.mutable_type()->mutable_list_type(); for (auto&& i : CurrentTaskIds) { diff --git a/ydb/services/bg_tasks/ds_table/initialization.cpp b/ydb/services/bg_tasks/ds_table/initialization.cpp index 1951e6a5c2..f0f1ea4566 100644 --- a/ydb/services/bg_tasks/ds_table/initialization.cpp +++ b/ydb/services/bg_tasks/ds_table/initialization.cpp @@ -62,6 +62,7 @@ void TBGTasksInitializer::DoPrepare(NMetadata::NInitializer::IInitializerInput:: column.mutable_type()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::STRING); } result.emplace_back(new NMetadata::NInitializer::TGenericTableModifier<NMetadata::NRequest::TDialogCreateTable>(request, "create")); + result.emplace_back(NMetadata::NInitializer::TACLModifierConstructor::GetReadOnlyModifier(tableName, "acl")); } controller->OnPreparationFinished(result); } diff --git a/ydb/services/bg_tasks/ds_table/lock_pinger.cpp b/ydb/services/bg_tasks/ds_table/lock_pinger.cpp index 4b8f67a597..049f28e950 100644 --- a/ydb/services/bg_tasks/ds_table/lock_pinger.cpp +++ b/ydb/services/bg_tasks/ds_table/lock_pinger.cpp @@ -12,7 +12,7 @@ std::optional<NMetadata::NRequest::TDialogYQLRequest::TRequest> TLockPingerActor sb << "DECLARE $lastPingNewValue AS Uint32;" << Endl; sb << "UPDATE `" + ExecutorController->GetTableName() + "`" << Endl; sb << "SET lastPing = $lastPingNewValue" << Endl; - sb << "WHERE id IN ($taskIds)" << Endl; + sb << "WHERE id IN $taskIds" << Endl; request.mutable_query()->set_yql_text(sb); { @@ -22,10 +22,9 @@ std::optional<NMetadata::NRequest::TDialogYQLRequest::TRequest> TLockPingerActor } auto& idStrings = (*request.mutable_parameters())["$taskIds"]; - idStrings.mutable_type()->mutable_list_type(); + idStrings.mutable_type()->mutable_list_type()->mutable_item()->set_type_id(Ydb::Type::STRING); for (auto&& i : TaskIds) { - auto* idString = idStrings.mutable_value()->add_items(); - idString->set_bytes_value(i); + idStrings.mutable_value()->add_items()->set_bytes_value(i); } request.set_session_id(sessionId); diff --git a/ydb/services/bg_tasks/ut/ut_tasks.cpp b/ydb/services/bg_tasks/ut/ut_tasks.cpp index 36e02d125c..2d01f1490f 100644 --- a/ydb/services/bg_tasks/ut/ut_tasks.cpp +++ b/ydb/services/bg_tasks/ut/ut_tasks.cpp @@ -1,5 +1,6 @@ #include "task_emulator.h" #include <ydb/core/testlib/test_client.h> +#include <ydb/core/testlib/cs_helper.h> #include <ydb/public/sdk/cpp/client/ydb_table/table.h> #include <ydb/services/bg_tasks/abstract/activity.h> #include <ydb/services/bg_tasks/abstract/task.h> @@ -66,5 +67,70 @@ Y_UNIT_TEST_SUITE(BGTaskTests) { }; Y_VERIFY(runtime.DispatchEvents(rmReady, TDuration::Seconds(30))); } + + Y_UNIT_TEST(NoArtefactsBeforeUsing) { + TPortManager pm; + + ui32 grpcPort = pm.GetPort(); + ui32 msgbPort = pm.GetPort(); + + Tests::TServerSettings serverSettings(msgbPort); + serverSettings.Port = msgbPort; + serverSettings.GrpcPort = grpcPort; + serverSettings.SetDomainName("Root") + .SetUseRealThreads(false) + .SetEnableMetadataProvider(true) + .SetEnableBackgroundTasks(true) + .SetEnableOlapSchemaOperations(true); + ; + + Tests::TServer::TPtr server = new Tests::TServer(serverSettings); + server->EnableGRpc(grpcPort); + Tests::TClient client(serverSettings); + + auto& runtime = *server->GetRuntime(); + + auto sender = runtime.AllocateEdgeActor(); + server->SetupRootStoragePools(sender); + + runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_NOTICE); + runtime.SetLogPriority(NKikimrServices::TX_COLUMNSHARD, NLog::PRI_INFO); + runtime.SetLogPriority(NKikimrServices::METADATA_PROVIDER, NLog::PRI_INFO); + runtime.SetLogPriority(NKikimrServices::BG_TASKS, NLog::PRI_DEBUG); + // runtime.SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NLog::PRI_DEBUG); + for (ui32 i = 0; i < 100; ++i) { + runtime.SimulateSleep(TDuration::Seconds(1)); + } + Cerr << "Initialization finished" << Endl; + + Tests::NCS::THelper lHelper(*server); + lHelper.StartDataRequest("SELECT * FROM `/Root/.metadata/initialization/migrations`", false); + lHelper.StartDataRequest("SELECT * FROM `/Root/.bg_tasks/tasks`", false); + + { + TString activityId; + { + std::shared_ptr<TTestInsertTaskActivity> tActivity(new TTestInsertTaskActivity); + activityId = tActivity->GetActivityTaskId(); + std::shared_ptr<TTestInsertTaskScheduler> tScheduler(new TTestInsertTaskScheduler); + NBackgroundTasks::TTask newTask(tActivity, tScheduler); + runtime.SendAsync(new IEventHandle(NBackgroundTasks::MakeServiceId(1), {}, new NBackgroundTasks::TEvAddTask(std::move(newTask)))); + } + TDispatchOptions rmReady; + rmReady.CustomFinalCondition = [activityId] { + Y_VERIFY(TTestInsertTaskActivity::GetCounterSum(activityId) <= 6); + if (TTestInsertTaskActivity::IsFinished(activityId)) { + Y_VERIFY(TTestInsertTaskActivity::GetCounterSum(activityId) == 6); + return true; + } else { + Cerr << "COUNTER_SUM:" << TTestInsertTaskActivity::GetCounterSum(activityId) << Endl; + } + return false; + }; + Y_VERIFY(runtime.DispatchEvents(rmReady, TDuration::Seconds(30))); + } + lHelper.StartDataRequest("SELECT * FROM `/Root/.bg_tasks/tasks`", true); + lHelper.StartDataRequest("SELECT * FROM `/Root/.metadata/initialization/migrations`", true); + } } } diff --git a/ydb/services/metadata/abstract/common.h b/ydb/services/metadata/abstract/common.h index fb52622b8c..8801b9e91c 100644 --- a/ydb/services/metadata/abstract/common.h +++ b/ydb/services/metadata/abstract/common.h @@ -38,6 +38,7 @@ enum EEvents { EvPathExistsCheckResult, EvStartMetadataService, EvStartRegistration, + EvRecheckExistence, EvEnd }; diff --git a/ydb/services/metadata/abstract/fetcher.h b/ydb/services/metadata/abstract/fetcher.h index 062259c2d5..7761f63cf5 100644 --- a/ydb/services/metadata/abstract/fetcher.h +++ b/ydb/services/metadata/abstract/fetcher.h @@ -79,6 +79,10 @@ protected: public: using TPtr = std::shared_ptr<ISnapshotsFetcher>; + ISnapshot::TPtr CreateEmpty(const TInstant actuality) const { + return CreateSnapshot(actuality); + } + TString GetComponentId() const; ISnapshot::TPtr ParseSnapshot(const Ydb::Table::ExecuteQueryResult& rawData, const TInstant actuality) const; diff --git a/ydb/services/metadata/ds_table/CMakeLists.darwin.txt b/ydb/services/metadata/ds_table/CMakeLists.darwin.txt index e9eccb5be5..7570d4c6c5 100644 --- a/ydb/services/metadata/ds_table/CMakeLists.darwin.txt +++ b/ydb/services/metadata/ds_table/CMakeLists.darwin.txt @@ -26,7 +26,6 @@ target_sources(services-metadata-ds_table PRIVATE ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_simple.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/behaviour_registrator_actor.cpp - ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/initializer_actor.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/scheme_describe.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/table_exists.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/service.cpp diff --git a/ydb/services/metadata/ds_table/CMakeLists.linux-aarch64.txt b/ydb/services/metadata/ds_table/CMakeLists.linux-aarch64.txt index 0931f0b0c9..0d795abd0d 100644 --- a/ydb/services/metadata/ds_table/CMakeLists.linux-aarch64.txt +++ b/ydb/services/metadata/ds_table/CMakeLists.linux-aarch64.txt @@ -27,7 +27,6 @@ target_sources(services-metadata-ds_table PRIVATE ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_simple.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/behaviour_registrator_actor.cpp - ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/initializer_actor.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/scheme_describe.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/table_exists.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/service.cpp diff --git a/ydb/services/metadata/ds_table/CMakeLists.linux.txt b/ydb/services/metadata/ds_table/CMakeLists.linux.txt index 0931f0b0c9..0d795abd0d 100644 --- a/ydb/services/metadata/ds_table/CMakeLists.linux.txt +++ b/ydb/services/metadata/ds_table/CMakeLists.linux.txt @@ -27,7 +27,6 @@ target_sources(services-metadata-ds_table PRIVATE ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_simple.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/behaviour_registrator_actor.cpp - ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/initializer_actor.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/scheme_describe.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/table_exists.cpp ${CMAKE_SOURCE_DIR}/ydb/services/metadata/ds_table/service.cpp diff --git a/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp b/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp index ce516994d4..409d5f7464 100644 --- a/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp +++ b/ydb/services/metadata/ds_table/accessor_snapshot_base.cpp @@ -43,7 +43,61 @@ void TDSAccessorBase::Handle(TEvEnrichSnapshotProblem::TPtr& ev) { OnSnapshotEnrichingError(ev->Get()->GetErrorText()); } +void TDSAccessorBase::Handle(TEvRecheckExistence::TPtr& ev) { + Register(new TTableExistsActor(InternalController, ev->Get()->GetPath(), TDuration::Seconds(5))); +} + +void TDSAccessorBase::Handle(TTableExistsActor::TEvController::TEvError::TPtr& ev) { + ALS_ERROR(NKikimrServices::METADATA_PROVIDER) << "cannot detect path existence: " << ev->Get()->GetPath() << "/" << ev->Get()->GetErrorMessage(); + Schedule(TDuration::Seconds(1), new TEvRecheckExistence(ev->Get()->GetPath())); +} + +void TDSAccessorBase::Handle(TTableExistsActor::TEvController::TEvResult::TPtr& ev) { + auto it = ExistenceChecks.find(ev->Get()->GetTablePath()); + Y_VERIFY(it != ExistenceChecks.end()); + if (ev->Get()->IsTableExists()) { + it->second = 1; + } else { + it->second = -1; + } + bool hasNonExist = false; + for (auto&& i : ExistenceChecks) { + if (i.second == 0) { + return; + } + if (i.second == -1) { + hasNonExist = true; + continue; + } + } + if (hasNonExist) { + OnNewEnrichedSnapshot(SnapshotConstructor->CreateEmpty(RequestedActuality)); + } else { + StartSnapshotsFetchingImpl(); + } +} + void TDSAccessorBase::StartSnapshotsFetching() { + RequestedActuality = TInstant::Now(); + auto& managers = SnapshotConstructor->GetManagers(); + Y_VERIFY(managers.size()); + bool hasExistsCheckers = false; + for (auto&& i : managers) { + auto it = ExistenceChecks.find(i->GetStorageTablePath()); + if (it == ExistenceChecks.end() || it->second == -1) { + Register(new TTableExistsActor(InternalController, i->GetStorageTablePath(), TDuration::Seconds(5))); + hasExistsCheckers = true; + ExistenceChecks[i->GetStorageTablePath()] = 0; + } else if (it->second == 0) { + hasExistsCheckers = true; + } + } + if (!hasExistsCheckers) { + StartSnapshotsFetchingImpl(); + } +} + +void TDSAccessorBase::StartSnapshotsFetchingImpl() { TStringBuilder sb; RequestedActuality = TInstant::Now(); auto& managers = SnapshotConstructor->GetManagers(); diff --git a/ydb/services/metadata/ds_table/accessor_snapshot_base.h b/ydb/services/metadata/ds_table/accessor_snapshot_base.h index d74c1ddfe2..9f65798920 100644 --- a/ydb/services/metadata/ds_table/accessor_snapshot_base.h +++ b/ydb/services/metadata/ds_table/accessor_snapshot_base.h @@ -1,4 +1,5 @@ #pragma once +#include "table_exists.h" #include <ydb/public/api/protos/ydb_value.pb.h> #include <ydb/services/metadata/abstract/common.h> #include <ydb/services/metadata/initializer/accessor_init.h> @@ -7,6 +8,17 @@ namespace NKikimr::NMetadata::NProvider { +class TEvRecheckExistence: public NActors::TEventLocal<TEvRecheckExistence, EEvents::EvRecheckExistence> { +private: + YDB_READONLY_DEF(TString, Path); +public: + TEvRecheckExistence(const TString& path) + : Path(path) + { + + } +}; + class TEvRefresh: public NActors::TEventLocal<TEvRefresh, EEvents::EvRefresh> { public: }; @@ -42,12 +54,15 @@ public: } }; -class TRefreshInternalController: public NFetcher::ISnapshotAcceptorController, public NRequest::IQueryOutput { +class TRefreshInternalController: public NFetcher::ISnapshotAcceptorController, + public NRequest::IQueryOutput, + public TTableExistsActor::TEvController { private: const TActorIdentity ActorId; public: TRefreshInternalController(const TActorIdentity& actorId) - : ActorId(actorId) { + : TTableExistsActor::TEvController(actorId) + , ActorId(actorId) { } @@ -69,6 +84,8 @@ private: using TBase = NActors::TActorBootstrapped<TDSAccessorBase>; YDB_READONLY(TInstant, RequestedActuality, TInstant::Zero()); const NRequest::TConfig Config; + std::map<TString, i32> ExistenceChecks; + void StartSnapshotsFetchingImpl(); protected: std::shared_ptr<TRefreshInternalController> InternalController; NFetcher::ISnapshotsFetcher::TPtr SnapshotConstructor; @@ -82,9 +99,12 @@ protected: virtual void OnSnapshotEnrichingError(const TString& errorMessage); void StartSnapshotsFetching(); + void Handle(TEvRecheckExistence::TPtr& ev); void Handle(TEvEnrichSnapshotResult::TPtr& ev); void Handle(TEvEnrichSnapshotProblem::TPtr& ev); void Handle(TEvYQLResponse::TPtr& ev); + void Handle(TTableExistsActor::TEvController::TEvError::TPtr& ev); + void Handle(TTableExistsActor::TEvController::TEvResult::TPtr& ev); public: void Bootstrap(); @@ -93,6 +113,10 @@ public: hFunc(TEvYQLResponse, Handle); hFunc(TEvEnrichSnapshotResult, Handle); hFunc(TEvEnrichSnapshotProblem, Handle); + hFunc(TTableExistsActor::TEvController::TEvError, Handle); + hFunc(TTableExistsActor::TEvController::TEvResult, Handle); + hFunc(TEvRecheckExistence, Handle); + default: break; } diff --git a/ydb/services/metadata/ds_table/initializer_actor.cpp b/ydb/services/metadata/ds_table/initializer_actor.cpp deleted file mode 100644 index 18f121b655..0000000000 --- a/ydb/services/metadata/ds_table/initializer_actor.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "initializer_actor.h" - -namespace NKikimr::NMetadata::NProvider { - -void TInitializerSnapshotReader::Handle(TDSAccessorSimple::TEvController::TEvResult::TPtr& ev) { - RegistrationData->StartInitialization(); - RegistrationData->SetInitializationSnapshot(ev->Get()->GetResult()); -} - -void TInitializerSnapshotReader::Handle(TEvStartMetadataService::TPtr& /*ev*/) { - Register(new TDSAccessorSimple(ReqConfig, InternalController, RegistrationData->GetInitializationFetcher())); -} - -void TInitializerSnapshotReader::Handle(TDSAccessorSimple::TEvController::TEvError::TPtr& ev) { - ALS_ERROR(NKikimrServices::METADATA_PROVIDER) << "cannot receive initializer snapshot: " << ev->Get()->GetErrorMessage() << Endl; - Schedule(TDuration::Seconds(1), new TEvStartMetadataService()); -} - -void TInitializerSnapshotReader::Handle(TDSAccessorSimple::TEvController::TEvTableAbsent::TPtr& /*ev*/) { - RegistrationData->NoInitializationSnapshot(); -} - -void TInitializerSnapshotReader::Bootstrap() { - InternalController = std::make_shared<TInitializerSnapshotReaderController>(SelfId()); - Become(&TInitializerSnapshotReader::StateMain); - Sender<TEvStartMetadataService>().SendTo(SelfId()); -} - -} diff --git a/ydb/services/metadata/ds_table/initializer_actor.h b/ydb/services/metadata/ds_table/initializer_actor.h deleted file mode 100644 index 8181c9df56..0000000000 --- a/ydb/services/metadata/ds_table/initializer_actor.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once -#include "accessor_snapshot_simple.h" -#include "registration.h" - -#include <library/cpp/actors/core/actor.h> -#include <library/cpp/actors/core/actor_bootstrapped.h> -#include <ydb/services/metadata/request/config.h> - -namespace NKikimr::NMetadata::NProvider { - -class TEvStartMetadataService: public TEventLocal<TEvStartMetadataService, EEvents::EvStartMetadataService> { -}; - -class TInitializerSnapshotReaderController: public TDSAccessorSimple::TEvController { -private: - const NActors::TActorIdentity ActorId; -public: - TInitializerSnapshotReaderController(const NActors::TActorIdentity& actorId) - : TDSAccessorSimple::TEvController(actorId) - , ActorId(actorId) { - - } -}; - -class TInitializerSnapshotReader: public NActors::TActorBootstrapped<TInitializerSnapshotReader> { -private: - std::shared_ptr<TRegistrationData> RegistrationData; - const NRequest::TConfig ReqConfig; - std::shared_ptr<TInitializerSnapshotReaderController> InternalController; - - void Handle(TDSAccessorSimple::TEvController::TEvResult::TPtr& ev); - void Handle(TEvStartMetadataService::TPtr& ev); - void Handle(TDSAccessorSimple::TEvController::TEvError::TPtr& ev); - void Handle(TDSAccessorSimple::TEvController::TEvTableAbsent::TPtr& ev); - -public: - TInitializerSnapshotReader(std::shared_ptr<TRegistrationData> registrationData, const NRequest::TConfig& reqConfig) - : RegistrationData(registrationData) - , ReqConfig(reqConfig) { - - } - - void Bootstrap(); - - STATEFN(StateMain) { - switch (ev->GetTypeRewrite()) { - hFunc(TDSAccessorSimple::TEvController::TEvResult, Handle); - hFunc(TDSAccessorSimple::TEvController::TEvError, Handle); - hFunc(TDSAccessorSimple::TEvController::TEvTableAbsent, Handle); - - hFunc(TEvStartMetadataService, Handle); - default: - Y_VERIFY(false); - } - } - -}; - -} diff --git a/ydb/services/metadata/ds_table/registration.cpp b/ydb/services/metadata/ds_table/registration.cpp index 6912b125a6..baaf8e2950 100644 --- a/ydb/services/metadata/ds_table/registration.cpp +++ b/ydb/services/metadata/ds_table/registration.cpp @@ -61,28 +61,33 @@ void TRegistrationData::InitializationFinished(const TString& initId) { auto it = InRegistration.find(initId); Y_VERIFY(it != InRegistration.end()); + if (initId == NInitializer::TDBInitialization::GetTypeId()) { + Y_VERIFY(Stage == EStage::WaitInitializerInfo); + Stage = EStage::Active; + } + Registered.emplace(initId, it->second); InRegistration.erase(it); EventsWaiting->Initialized(initId); + + if (initId == NInitializer::TDBInitialization::GetTypeId()) { + EventsWaiting->TryResendOne(); + } + } void TRegistrationData::SetInitializationSnapshot(NFetcher::ISnapshot::TPtr s) { + const bool notInitializedBefore = !InitializationSnapshot; InitializationSnapshot = dynamic_pointer_cast<NInitializer::TSnapshot>(s); Y_VERIFY(InitializationSnapshot); - if (Stage == EStage::WaitInitializerInfo) { - Stage = EStage::Active; + if (notInitializedBefore) { EventsWaiting->TryResendOne(); - } else if (Stage == EStage::Active) { - - } else if (Stage == EStage::Created) { - Y_VERIFY(false, "incorrect stage for method usage"); } } void TRegistrationData::StartInitialization() { Y_VERIFY(Stage == EStage::Created); Stage = EStage::WaitInitializerInfo; - EventsWaiting->GetOwnerId().Send(EventsWaiting->GetOwnerId(), new TEvSubscribeExternal(InitializationFetcher)); } TRegistrationData::TRegistrationData() { diff --git a/ydb/services/metadata/ds_table/service.cpp b/ydb/services/metadata/ds_table/service.cpp index 8530111f4b..3d4852d724 100644 --- a/ydb/services/metadata/ds_table/service.cpp +++ b/ydb/services/metadata/ds_table/service.cpp @@ -2,13 +2,13 @@ #include "accessor_subscribe.h" #include "behaviour_registrator_actor.h" -#include "initializer_actor.h" #include <ydb/core/base/appdata.h> #include <ydb/core/grpc_services/local_rpc/local_rpc.h> #include <ydb/core/grpc_services/grpc_request_proxy.h> #include <ydb/library/accessor/accessor.h> #include <ydb/services/metadata/service.h> +#include <ydb/services/metadata/initializer/behaviour.h> namespace NKikimr::NMetadata::NProvider { @@ -19,15 +19,15 @@ IActor* CreateService(const TConfig& config) { void TService::PrepareManagers(std::vector<IClassBehaviour::TPtr> managers, TAutoPtr<IEventBase> ev, const NActors::TActorId& sender) { TBehavioursId id(managers); if (RegistrationData->GetInitializationSnapshot()) { - const bool isInitialization = (managers.size() == 1) && managers.front()->GetTypeId() == NInitializer::TDBInitialization::GetTypeId(); + auto bInitializer = NInitializer::TDBObjectBehaviour::GetInstance(); switch (RegistrationData->GetStage()) { case TRegistrationData::EStage::Created: RegistrationData->StartInitialization(); + Y_VERIFY(RegistrationData->InRegistration.emplace(bInitializer->GetTypeId(), bInitializer).second); + RegisterWithSameMailbox(new TBehaviourRegistrator(bInitializer, RegistrationData, Config.GetRequestConfig())); break; case TRegistrationData::EStage::WaitInitializerInfo: - if (!isInitialization) { - break; - } + break; case TRegistrationData::EStage::Active: for (auto&& b : managers) { Y_VERIFY(!RegistrationData->Registered.contains(b->GetTypeId())); @@ -97,7 +97,7 @@ void TService::Bootstrap(const NActors::TActorContext& /*ctx*/) { RegistrationData->EventsWaiting = std::make_shared<TEventsCollector>(SelfId()); ALS_INFO(NKikimrServices::METADATA_PROVIDER) << "metadata service started" << Endl; Become(&TService::StateMain); - RegisterWithSameMailbox(new TInitializerSnapshotReader(RegistrationData, Config.GetRequestConfig())); + Send(SelfId(), new TEvSubscribeExternal(RegistrationData->GetInitializationFetcher())); } diff --git a/ydb/services/metadata/ds_table/service.h b/ydb/services/metadata/ds_table/service.h index 9c0746c009..e9577b4bf3 100644 --- a/ydb/services/metadata/ds_table/service.h +++ b/ydb/services/metadata/ds_table/service.h @@ -42,7 +42,7 @@ private: needManagers.emplace_back(i); } } - if (needManagers.empty()) { + if (needManagers.empty() || (needManagers.size() == 1 && needManagers[0]->GetTypeId() == NInitializer::TDBInitialization::GetTypeId())) { auto it = Accessors.find(fetcher->GetComponentId()); if (it == Accessors.end()) { THolder<TExternalData> actor = MakeHolder<TExternalData>(Config, fetcher); diff --git a/ydb/services/metadata/initializer/behaviour.cpp b/ydb/services/metadata/initializer/behaviour.cpp index e106530587..3485476633 100644 --- a/ydb/services/metadata/initializer/behaviour.cpp +++ b/ydb/services/metadata/initializer/behaviour.cpp @@ -29,4 +29,9 @@ std::shared_ptr<NKikimr::NMetadata::NModifications::IOperationsManager> TDBObjec return result; } +std::shared_ptr<NKikimr::NMetadata::NInitializer::TDBObjectBehaviour> TDBObjectBehaviour::GetInstance() { + static std::shared_ptr<TDBObjectBehaviour> result = std::make_shared<TDBObjectBehaviour>(); + return result; +} + } diff --git a/ydb/services/metadata/initializer/behaviour.h b/ydb/services/metadata/initializer/behaviour.h index 1947b7c85a..d1aab73730 100644 --- a/ydb/services/metadata/initializer/behaviour.h +++ b/ydb/services/metadata/initializer/behaviour.h @@ -17,7 +17,9 @@ protected: return ""; } +public: virtual TString GetTypeId() const override; + static std::shared_ptr<TDBObjectBehaviour> GetInstance(); }; } diff --git a/ydb/services/metadata/secret/ut/ut_secret.cpp b/ydb/services/metadata/secret/ut/ut_secret.cpp index e4f09cb531..5945b3f44c 100644 --- a/ydb/services/metadata/secret/ut/ut_secret.cpp +++ b/ydb/services/metadata/secret/ut/ut_secret.cpp @@ -249,6 +249,41 @@ Y_UNIT_TEST_SUITE(Secret) { lHelper.StartSchemaRequest("CREATE OBJECT `secret2:test@test1` (TYPE SECRET_ACCESS)", false); lHelper.StartSchemaRequest("DROP OBJECT `secret1` (TYPE SECRET)", false); lHelper.StartDataRequest("SELECT * FROM `/Root/.metadata/secrets/values`", false); + lHelper.StartDataRequest("SELECT * FROM `/Root/.metadata/initialization/migrations`", true); + } + } + + Y_UNIT_TEST(Deactivated) { + TPortManager pm; + + ui32 grpcPort = pm.GetPort(); + ui32 msgbPort = pm.GetPort(); + + Tests::TServerSettings serverSettings(msgbPort); + serverSettings.Port = msgbPort; + serverSettings.GrpcPort = grpcPort; + serverSettings.SetDomainName("Root") + .SetUseRealThreads(false) + .SetEnableMetadataProvider(false) + .SetEnableOlapSchemaOperations(true); + ; + + Tests::TServer::TPtr server = new Tests::TServer(serverSettings); + server->EnableGRpc(grpcPort); + + Tests::TClient client(serverSettings); + + auto& runtime = *server->GetRuntime(); + + auto sender = runtime.AllocateEdgeActor(); + server->SetupRootStoragePools(sender); + + { + runtime.SimulateSleep(TDuration::Seconds(10)); + Cerr << "Initialization finished" << Endl; + + Tests::NCS::THelper lHelper(*server); + lHelper.StartSchemaRequest("CREATE OBJECT secret1 (TYPE SECRET) WITH value = `100`", false); } } } |