aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2023-01-13 15:07:36 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2023-01-13 15:07:36 +0300
commit929d3c1fca6385c69d56a2b24ac3f11bf072c2ee (patch)
tree1a5383b18ab6331f352efe5b6ac9a3ec2aa35843
parenta4fe524f1ed62f0599525059e8d70b1fa5758960 (diff)
downloadydb-929d3c1fca6385c69d56a2b24ac3f11bf072c2ee.tar.gz
add test for no artefacts on initialization
-rw-r--r--ydb/services/bg_tasks/ds_table/fetch_tasks.cpp2
-rw-r--r--ydb/services/bg_tasks/ds_table/initialization.cpp1
-rw-r--r--ydb/services/bg_tasks/ds_table/lock_pinger.cpp7
-rw-r--r--ydb/services/bg_tasks/ut/ut_tasks.cpp66
-rw-r--r--ydb/services/metadata/abstract/common.h1
-rw-r--r--ydb/services/metadata/abstract/fetcher.h4
-rw-r--r--ydb/services/metadata/ds_table/CMakeLists.darwin.txt1
-rw-r--r--ydb/services/metadata/ds_table/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/services/metadata/ds_table/CMakeLists.linux.txt1
-rw-r--r--ydb/services/metadata/ds_table/accessor_snapshot_base.cpp54
-rw-r--r--ydb/services/metadata/ds_table/accessor_snapshot_base.h28
-rw-r--r--ydb/services/metadata/ds_table/initializer_actor.cpp29
-rw-r--r--ydb/services/metadata/ds_table/initializer_actor.h59
-rw-r--r--ydb/services/metadata/ds_table/registration.cpp19
-rw-r--r--ydb/services/metadata/ds_table/service.cpp12
-rw-r--r--ydb/services/metadata/ds_table/service.h2
-rw-r--r--ydb/services/metadata/initializer/behaviour.cpp5
-rw-r--r--ydb/services/metadata/initializer/behaviour.h2
-rw-r--r--ydb/services/metadata/secret/ut/ut_secret.cpp35
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);
}
}
}