summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ydb/core/mind/bscontroller/bsc.cpp7
-rw-r--r--ydb/core/mind/bscontroller/disk_metrics.cpp9
-rw-r--r--ydb/core/mind/bscontroller/impl.h5
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 {