aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-05-22 21:38:00 +0300
committeralexvru <alexvru@ydb.tech>2023-05-22 21:38:00 +0300
commitabe3316ae3c40ced433b6cb0b524b6a8e2701e09 (patch)
tree265e6d5d165052d40d50d21dbe2daf1349eb9940
parentf9ce855990dfd8d19845e20335f10b6658e77ac2 (diff)
downloadydb-abe3316ae3c40ced433b6cb0b524b6a8e2701e09.tar.gz
Fix BSC bugs
-rw-r--r--ydb/core/blobstorage/backpressure/queue_backpressure_client.cpp2
-rw-r--r--ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.cpp4
-rw-r--r--ydb/core/mind/bscontroller/cmds_storage_pool.cpp31
-rw-r--r--ydb/core/mind/bscontroller/impl.h1
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