summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <[email protected]>2022-10-12 13:48:41 +0300
committeralexvru <[email protected]>2022-10-12 13:48:41 +0300
commitac7fab5882732770d08bdc98e5fd8b9a0d291cd5 (patch)
tree705246c125ba66b258232900fc954200d6d5dc47
parenteaddec45ab37af96ce24b3d296dd0aababe0893e (diff)
Correct available space calculation in PDisk
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
index f22671d35c1..609edbf2927 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
@@ -1448,12 +1448,18 @@ void TPDisk::WhiteboardReport(TWhiteboardReport &whiteboardReport) {
reportResult->DiskMetrics = MakeHolder<TEvBlobStorage::TEvControllerUpdateDiskStatus>();
i64 minSlotSize = Max<i64>();
+ for (const auto& [_, owner] : VDiskOwners) {
+ minSlotSize = Min(minSlotSize, Keeper.GetOwnerHardLimit(owner) * Format.ChunkSize);
+ }
+
for (const auto& [vdiskId, owner] : VDiskOwners) {
const TOwnerData &data = OwnerData[owner];
// May be less than 0 if owner exceeded his quota
- i64 ownerFree = Max<i64>(0, Keeper.GetOwnerFree(owner)) * Format.ChunkSize;
i64 ownerAllocated = (i64)Keeper.GetOwnerUsed(owner) * Format.ChunkSize;
- minSlotSize = Min(minSlotSize, Keeper.GetOwnerHardLimit(owner) * Format.ChunkSize);
+ i64 ownerFree = Max<i64>(0, minSlotSize == Max<i64>()
+ ? Keeper.GetOwnerFree(owner) * Format.ChunkSize // fallback calculation method
+ : minSlotSize - ownerAllocated);
+
reportResult->VDiskStateVect.emplace_back(data.WhiteboardProxyId, NKikimrWhiteboard::TVDiskStateInfo());
auto& vdiskInfo = std::get<1>(reportResult->VDiskStateVect.back());
vdiskInfo.SetAvailableSize(ownerFree);