diff options
author | alexvru <alexvru@ydb.tech> | 2023-05-22 21:38:00 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-05-22 21:38:00 +0300 |
commit | abe3316ae3c40ced433b6cb0b524b6a8e2701e09 (patch) | |
tree | 265e6d5d165052d40d50d21dbe2daf1349eb9940 | |
parent | f9ce855990dfd8d19845e20335f10b6658e77ac2 (diff) | |
download | ydb-abe3316ae3c40ced433b6cb0b524b6a8e2701e09.tar.gz |
Fix BSC bugs
4 files changed, 19 insertions, 19 deletions
diff --git a/ydb/core/blobstorage/backpressure/queue_backpressure_client.cpp b/ydb/core/blobstorage/backpressure/queue_backpressure_client.cpp index 0132b7573d..2aa3501a04 100644 --- a/ydb/core/blobstorage/backpressure/queue_backpressure_client.cpp +++ b/ydb/core/blobstorage/backpressure/queue_backpressure_client.cpp @@ -701,7 +701,7 @@ private: ctx.Send(sender, ev->Release().Release(), 0, cookie, std::move(ev->TraceId)); AssimilateRequests.erase(it); } else { - const TString& message = TStringBuilder() << "unexpected TEvVAssimilateResult received" + const TString message = TStringBuilder() << "unexpected TEvVAssimilateResult received" << " Cookie# " << ev->Cookie << " Sender# " << ev->Sender << " Msg# " << ev->Get()->ToString() diff --git a/ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.cpp b/ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.cpp index 6a8fa70cc4..9ba01fcf67 100644 --- a/ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.cpp +++ b/ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.cpp @@ -359,7 +359,7 @@ bool TBlobStorageGroupInfo::TTopology::IsValidId(const TVDiskID& vdisk) const { if (vdisk.FailRealm >= FailRealms.size()) { return false; } - if (vdisk.FailDomain >= TotalFailDomains) { + if (vdisk.FailDomain >= GetNumFailDomainsPerFailRealm()) { return false; } if (vdisk.VDisk >= GetNumVDisksPerFailDomain()) { @@ -372,7 +372,7 @@ bool TBlobStorageGroupInfo::TTopology::IsValidId(const TVDiskIdShort& vdisk) con if (vdisk.FailRealm >= FailRealms.size()) { return false; } - if (vdisk.FailDomain >= TotalFailDomains) { + if (vdisk.FailDomain >= GetNumFailDomainsPerFailRealm()) { return false; } if (vdisk.VDisk >= GetNumVDisksPerFailDomain()) { diff --git a/ydb/core/mind/bscontroller/cmds_storage_pool.cpp b/ydb/core/mind/bscontroller/cmds_storage_pool.cpp index 30e181a19d..d0b94a4b4b 100644 --- a/ydb/core/mind/bscontroller/cmds_storage_pool.cpp +++ b/ydb/core/mind/bscontroller/cmds_storage_pool.cpp @@ -335,20 +335,19 @@ namespace NKikimr::NBsController { const TVDiskID vdiskId(cmd.GetGroupId(), cmd.GetGroupGeneration(), cmd.GetFailRealmIdx(), cmd.GetFailDomainIdx(), cmd.GetVDiskIdx()); - TMaybe<TVSlotId> matchingVSlotId; - VSlots.ForEachInRange({}, {}, [&](const TVSlotId& vslotId, const TVSlotInfo& vslotInfo) { - if (!vslotInfo.IsBeingDeleted() && vslotInfo.GetVDiskId() == vdiskId) { - matchingVSlotId = vslotId; - return false; - } - return true; - }); - if (!matchingVSlotId) { - throw TExError() << "VDisk# " << vdiskId.ToString() << " not found"; + // validate group and generation + const TGroupInfo *group = Groups.Find(cmd.GetGroupId()); + if (!group) { + throw TExError() << "GroupId# " << cmd.GetGroupId() << " not found"; + } else if (group->Generation != cmd.GetGroupGeneration()) { + throw TExError() << "GroupId# " << cmd.GetGroupId() << " generation mismatch"; + } else if (!group->Topology->IsValidId(vdiskId)) { + throw TExError() << "VDiskId# " << vdiskId << " out of range"; } - // update group generation to mark this VSlot being destroyed - TVSlotInfo *vslotInfo = VSlots.FindForUpdate(*matchingVSlotId); + const ui32 orderNumber = group->Topology->GetOrderNumber(vdiskId); + const TVSlotId vslotId = group->VDisksInGroup[orderNumber]->VSlotId; + TPDiskId targetPDiskId; if (cmd.HasTargetPDiskId()) { const NKikimrBlobStorage::TPDiskId& proto = cmd.GetTargetPDiskId(); @@ -358,13 +357,13 @@ namespace NKikimr::NBsController { } targetPDiskId = pdiskId; } - ExplicitReconfigureMap.emplace(vslotInfo->VSlotId, targetPDiskId); + + ExplicitReconfigureMap.emplace(vslotId, targetPDiskId); if (cmd.GetSuppressDonorMode()) { - SuppressDonorMode.insert(vslotInfo->VSlotId); + SuppressDonorMode.insert(vslotId); } - Y_VERIFY(vslotInfo->Group); - Fit.PoolsAndGroups.emplace(vslotInfo->Group->StoragePoolId, vslotInfo->Group->ID); + Fit.PoolsAndGroups.emplace(group->StoragePoolId, group->ID); } void TBlobStorageController::TConfigState::ExecuteStep(const NKikimrBlobStorage::TMoveGroups& cmd, TStatus& /*status*/) { diff --git a/ydb/core/mind/bscontroller/impl.h b/ydb/core/mind/bscontroller/impl.h index fc18b4774d..d7d8a2eba3 100644 --- a/ydb/core/mind/bscontroller/impl.h +++ b/ydb/core/mind/bscontroller/impl.h @@ -1558,6 +1558,7 @@ private: TVSlotInfo* FindVSlot(TVDiskID id) { // GroupGeneration may be zero if (TGroupInfo *group = FindGroup(id.GroupID); group && !group->VDisksInGroup.empty()) { + Y_VERIFY(group->Topology->IsValidId(id)); const ui32 index = group->Topology->GetOrderNumber(id); const TVSlotInfo *slot = group->VDisksInGroup[index]; Y_VERIFY(slot->GetShortVDiskId() == TVDiskIdShort(id)); // sanity check |