aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-04-05 15:11:32 +0300
committeralexvru <alexvru@ydb.tech>2023-04-05 15:11:32 +0300
commit6dc558eee9997353e681325476197c57216ca0d9 (patch)
treec852e5f5563627b6844db386593a8662ef11f1f2
parentbc30b652ffaa9eb08f5a2df8d4ff5cceada994d2 (diff)
downloadydb-6dc558eee9997353e681325476197c57216ca0d9.tar.gz
Fix asan problem
-rw-r--r--ydb/core/mind/bscontroller/virtual_group.cpp47
1 files changed, 26 insertions, 21 deletions
diff --git a/ydb/core/mind/bscontroller/virtual_group.cpp b/ydb/core/mind/bscontroller/virtual_group.cpp
index 34424e5b73d..c8250fd3288 100644
--- a/ydb/core/mind/bscontroller/virtual_group.cpp
+++ b/ydb/core/mind/bscontroller/virtual_group.cpp
@@ -78,6 +78,7 @@ namespace NKikimr::NBsController {
group->VirtualGroupName = cmd.GetName();
group->VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::NEW;
group->HiveId = cmd.GetHiveId();
+ group->NeedAlter = true;
if (cmd.GetBlobDepotId()) {
group->VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::WORKING;
@@ -195,7 +196,7 @@ namespace NKikimr::NBsController {
} else {
group->DecommitStatus = NKikimrBlobStorage::TGroupDecommitStatus::NONE;
group->VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::DELETING;
- group->NeedAlter = false;
+ group->NeedAlter = true;
}
}
@@ -482,6 +483,7 @@ namespace NKikimr::NBsController {
} else {
Self->Execute(std::make_unique<TTxUpdateGroup>(this, [&](TGroupInfo& group) {
group.VirtualGroupState = NKikimrBlobStorage::EVirtualGroupState::CREATE_FAILED;
+ group.NeedAlter = false;
group.ErrorReason = TStringBuilder() << "failed to create BlobDepot tablet"
<< " Reason# " << NKikimrHive::EErrorReason_Name(record.GetErrorReason())
<< " Status# " << NKikimrProto::EReplyStatus_Name(record.GetStatus());
@@ -621,31 +623,34 @@ namespace NKikimr::NBsController {
void TBlobStorageController::CommitVirtualGroupUpdates(TConfigState& state) {
for (const auto& [base, overlay] : state.Groups.Diff()) {
- TGroupInfo *group = overlay->second.Get();
- auto startSetupMachine = [this, group, &state](bool restart) {
- Y_VERIFY(group);
- if (restart && group->VirtualGroupSetupMachineId) {
- TActivationContext::Send(new IEventHandle(TEvents::TSystem::Poison, 0,
- std::exchange(group->VirtualGroupSetupMachineId, {}), {}, nullptr, 0));
- }
- if (group->VirtualGroupState && !group->VirtualGroupSetupMachineId) {
- state.Callbacks.push_back(std::bind(&TThis::StartVirtualGroupSetupMachine, this, group));
- }
+ auto startSetupMachine = [this, &state, groupId = overlay->first](bool restart) {
+ state.Callbacks.push_back([this, restart, groupId = groupId] {
+ TGroupInfo *group = FindGroup(groupId);
+ Y_VERIFY(group);
+ if (restart && group->VirtualGroupSetupMachineId) { // terminate currently running machine
+ TActivationContext::Send(new IEventHandle(TEvents::TSystem::Poison, 0, std::exchange(
+ group->VirtualGroupSetupMachineId, {}), {}, nullptr, 0));
+ }
+ // start new one, if required
+ if (!group->VirtualGroupSetupMachineId) {
+ StartVirtualGroupSetupMachine(group);
+ }
+ });
};
- if (!base) { // new group was created
- startSetupMachine(false);
- } else if (!overlay->second) { // existing group was just deleted
- if (base->second->VirtualGroupSetupMachineId) {
- state.Callbacks.push_back([actorId = base->second->VirtualGroupSetupMachineId] {
+ if (!overlay->second || !overlay->second->VirtualGroupState) { // existing group was just deleted (or became non-virtual)
+ if (const TActorId actorId = base ? base->second->VirtualGroupSetupMachineId : TActorId()) {
+ state.Callbacks.push_back([actorId] {
TActivationContext::Send(new IEventHandle(TEvents::TSystem::Poison, 0, actorId, {}, nullptr, 0));
});
}
- } else if (overlay->second->NeedAlter.GetOrElse(false)) {
- startSetupMachine(false);
- } else if (base->second->VirtualGroupState != NKikimrBlobStorage::EVirtualGroupState::DELETING &&
- overlay->second->VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::DELETING) {
- startSetupMachine(true);
+ } else if (overlay->second->NeedAlter && *overlay->second->NeedAlter) {
+ // we need to terminate currently running machine only if we are *initiating* blob depot deletion
+ const bool restartNeeded = base &&
+ base->second->VirtualGroupState != NKikimrBlobStorage::EVirtualGroupState::DELETING &&
+ overlay->second->VirtualGroupState == NKikimrBlobStorage::EVirtualGroupState::DELETING;
+
+ startSetupMachine(restartNeeded);
}
}
}