diff options
| author | Alexander Rutkovsky <[email protected]> | 2026-07-02 22:13:09 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-07-02 22:13:09 +0300 |
| commit | d437868106f533eddfcfdc2e166bef420f60a7bb (patch) | |
| tree | dca9713ad739e33f1083c69b4f7a6a69bc8f65cb | |
| parent | ebaeb4285edc56a799b493181fde733994ebd615 (diff) | |
Fix hanging SelectGroup command in BSC (#45323)
| -rw-r--r-- | ydb/core/mind/bscontroller/bsc.cpp | 7 | ||||
| -rw-r--r-- | ydb/core/mind/bscontroller/disk_metrics.cpp | 9 | ||||
| -rw-r--r-- | ydb/core/mind/bscontroller/impl.h | 5 |
3 files changed, 12 insertions, 9 deletions
diff --git a/ydb/core/mind/bscontroller/bsc.cpp b/ydb/core/mind/bscontroller/bsc.cpp index dde30a8cf99..13f97a4ab9e 100644 --- a/ydb/core/mind/bscontroller/bsc.cpp +++ b/ydb/core/mind/bscontroller/bsc.cpp @@ -202,10 +202,7 @@ bool TBlobStorageController::TGroupInfo::FillInResources( occupancy = Max(occupancy.value_or(0), vm.GetNormalizedOccupancy()); } - const bool hasAllMetrics = metrics.HasMaxIOPS() - && metrics.HasMaxReadThroughput() - && metrics.HasMaxWriteThroughput() - && vslot->Metrics.HasNormalizedOccupancy(); + const bool hasAllMetrics = pdisk->HasFullMetrics() && vslot->Metrics.HasNormalizedOccupancy(); if (hasAllMetrics) { vdisksWithAllMetrics |= {Topology.get(), vslot->GetShortVDiskId()}; } @@ -224,7 +221,7 @@ bool TBlobStorageController::TGroupInfo::FillInResources( pb->SetReadThroughput(Min<ui64>(pb->HasReadThroughput() ? pb->GetReadThroughput() : Max<ui64>(), *readThroughput * factor)); } if (writeThroughput) { - pb->SetWriteThroughput(Min<ui64>(pb->HasWriteThroughput() ? pb->GetReadThroughput() : Max<ui64>(), *writeThroughput * factor)); + pb->SetWriteThroughput(Min<ui64>(pb->HasWriteThroughput() ? pb->GetWriteThroughput() : Max<ui64>(), *writeThroughput * factor)); } if (occupancy) { pb->SetOccupancy(Max<double>(pb->HasOccupancy() ? pb->GetOccupancy() : Min<double>(), *occupancy)); diff --git a/ydb/core/mind/bscontroller/disk_metrics.cpp b/ydb/core/mind/bscontroller/disk_metrics.cpp index e0340c06308..717e1189498 100644 --- a/ydb/core/mind/bscontroller/disk_metrics.cpp +++ b/ydb/core/mind/bscontroller/disk_metrics.cpp @@ -82,12 +82,16 @@ void TBlobStorageController::Handle(TEvBlobStorage::TEvControllerUpdateDiskStatu // update in-memory metrics i64 allocatedSizeIncrement; - if (slot->UpdateVDiskMetrics(m, &allocatedSizeIncrement) && slot->Group) { + bool statusFlagsChanged; + slot->UpdateVDiskMetrics(m, &allocatedSizeIncrement, &statusFlagsChanged); + if (statusFlagsChanged && slot->Group) { dirtyGroups.insert(slot->Group); + } + if (slot->Group) { groupsToCheck.insert(slot->Group->ID); } if (allocatedSizeIncrement && !slot->IsBeingDeleted()) { - const TGroupInfo *group = FindGroup(slot->GroupId); + const TGroupInfo *group = FindGroup(slot->GroupId); // we don't refer to slot->Group because we account donors too Y_ABORT_UNLESS(group); StoragePoolStat->UpdateAllocatedSize(TStoragePoolStat::ConvertId(group->StoragePoolId), allocatedSizeIncrement); } @@ -140,6 +144,7 @@ void TBlobStorageController::Handle(TEvBlobStorage::TEvControllerUpdateDiskStatu } if (pdisk->UpdatePDiskMetrics(m, now)) { + // this PDisk just did obtain full metrics set, we can unblock any pending SelectGroups operations for (auto& [id, slot] : pdisk->VSlotsOnPDisk) { if (slot->Group) { groupsToCheck.insert(slot->Group->ID); diff --git a/ydb/core/mind/bscontroller/impl.h b/ydb/core/mind/bscontroller/impl.h index d770cffca27..2ae7e230cbb 100644 --- a/ydb/core/mind/bscontroller/impl.h +++ b/ydb/core/mind/bscontroller/impl.h @@ -306,14 +306,15 @@ public: MaximumResourceValues.DataSize = Metrics.GetAvailableSize() + DiskResourceValues.DataSize; } - bool UpdateVDiskMetrics(const NKikimrBlobStorage::TVDiskMetrics& vDiskMetrics, i64 *allocatedSizeIncrementPtr) const { + void UpdateVDiskMetrics(const NKikimrBlobStorage::TVDiskMetrics& vDiskMetrics, i64 *allocatedSizeIncrementPtr, + bool *statusFlagsChanged) const { const ui64 allocatedSizeBefore = Metrics.GetAllocatedSize(); const ui32 prevStatusFlags = Metrics.GetStatusFlags(); Metrics.MergeFrom(vDiskMetrics); Metrics.DiscardUnknownFields(); UpdateVDiskMetrics(); *allocatedSizeIncrementPtr = Metrics.GetAllocatedSize() - allocatedSizeBefore; - return prevStatusFlags != Metrics.GetStatusFlags(); + *statusFlagsChanged = prevStatusFlags != Metrics.GetStatusFlags(); } TResourceRawValues GetResourceCurrentValues() const { |
