Skip to content

Commit cbf3fcf

Browse files
Merge 83488a7 into 9dbab08
2 parents 9dbab08 + 83488a7 commit cbf3fcf

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

ydb/core/viewer/protos/viewer.proto

+1
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ message TTenant {
382382
uint64 StorageAllocatedLimit = 41;
383383
Ydb.Cms.DatabaseQuotas DatabaseQuotas = 42;
384384
repeated TStorageUsage StorageUsage = 43;
385+
repeated TStorageUsage BlobStorage = 44;
385386
}
386387

387388
message TTenants {

ydb/core/viewer/viewer_tenantinfo.h

+42-1
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ class TJsonTenantInfo : public TViewerPipeClient {
4646
THashMap<TString, std::vector<TNodeId>> TenantNodes;
4747
THashMap<TString, NKikimrViewer::TEvViewerResponse> OffloadMergedTabletStateResponse;
4848
THashMap<TString, NKikimrViewer::TEvViewerResponse> OffloadMergedSystemStateResponse;
49+
THashMap<TString, NKikimrViewer::TStorageUsage::EType> StoragePoolType;
4950
TTabletId RootHiveId = 0;
5051
TString RootId; // id of root domain (tenant)
5152
NKikimrViewer::TTenantInfo Result;
53+
std::optional<TRequestResponse<NSysView::TEvSysView::TEvGetStoragePoolsResponse>> GetStoragePoolsResponse;
5254

5355
struct TStorageQuota {
5456
uint64 SoftQuota = 0;
@@ -87,6 +89,7 @@ class TJsonTenantInfo : public TViewerPipeClient {
8789
}
8890

8991
void Bootstrap() override {
92+
Cerr << "iiiiiiii Bootstrap " << Endl;
9093
BLOG_TRACE("Bootstrap()");
9194
const auto& params(Event->Get()->Request.GetParams());
9295
JsonSettings.EnumAsNumbers = !FromStringWithDefault<bool>(params.Get("enums"), true);
@@ -124,6 +127,7 @@ class TJsonTenantInfo : public TViewerPipeClient {
124127
if (Storage) {
125128
RequestHiveStorageStats(RootHiveId);
126129
}
130+
GetStoragePoolsResponse = RequestBSControllerPools();
127131

128132
if (Requests == 0) {
129133
ReplyAndPassAway();
@@ -154,9 +158,10 @@ class TJsonTenantInfo : public TViewerPipeClient {
154158
hFunc(TEvViewer::TEvViewerResponse, Handle);
155159
hFunc(TEvents::TEvUndelivered, Undelivered);
156160
hFunc(TEvInterconnect::TEvNodeDisconnected, Disconnected);
157-
hFunc(TEvTabletPipe::TEvClientConnected, TBase::Handle);
161+
hFunc(TEvTabletPipe::TEvClientConnected, Handle);
158162
hFunc(TEvStateStorage::TEvBoardInfo, Handle);
159163
hFunc(NHealthCheck::TEvSelfCheckResultProto, Handle);
164+
hFunc(NSysView::TEvSysView::TEvGetStoragePoolsResponse, Handle);
160165
cFunc(TEvents::TSystem::Wakeup, HandleTimeout);
161166
}
162167
}
@@ -534,7 +539,32 @@ class TJsonTenantInfo : public TViewerPipeClient {
534539
return type;
535540
}
536541

542+
void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
543+
if (ev->Get()->Status != NKikimrProto::OK) {
544+
TString error = TStringBuilder() << "Failed to establish pipe: " << NKikimrProto::EReplyStatus_Name(ev->Get()->Status);
545+
if (ev->Get()->TabletId == GetBSControllerId()) {
546+
if (GetStoragePoolsResponse.has_value()) {
547+
GetStoragePoolsResponse->Error(error);
548+
}
549+
}
550+
}
551+
TBase::Handle(ev); // all RequestDone() are handled by base handler
552+
}
553+
554+
void Handle(NSysView::TEvSysView::TEvGetStoragePoolsResponse::TPtr& ev) {
555+
GetStoragePoolsResponse->Set(std::move(ev));
556+
557+
if (GetStoragePoolsResponse && GetStoragePoolsResponse->IsOk()) {
558+
for (const NKikimrSysView::TStoragePoolEntry& entry : GetStoragePoolsResponse->Get()->Record.GetEntries()) {
559+
StoragePoolType[entry.GetInfo().GetName()] = GetStorageType(entry.GetInfo().GetKind());
560+
}
561+
}
562+
563+
RequestDone();
564+
}
565+
537566
void ReplyAndPassAway() override {
567+
Cerr << "iiiiiiii ReplyAndPassAway " << Endl;
538568
BLOG_TRACE("ReplyAndPassAway() started");
539569
TIntrusivePtr<TDomainsInfo> domains = AppData()->DomainsInfo;
540570
auto *domain = domains->GetDomain();
@@ -666,6 +696,7 @@ class TJsonTenantInfo : public TViewerPipeClient {
666696
}
667697

668698
if (Storage) {
699+
THashMap<NKikimrViewer::TStorageUsage::EType, ui64> blobStorageByType;
669700
auto itHiveStorageStats = HiveStorageStats.find(hiveId);
670701
if (itHiveStorageStats != HiveStorageStats.end()) {
671702
const NKikimrHive::TEvResponseHiveStorageStats& record = itHiveStorageStats->second.Get()->Record;
@@ -675,9 +706,13 @@ class TJsonTenantInfo : public TViewerPipeClient {
675706
uint64 storageGroups = 0;
676707
for (const NKikimrHive::THiveStoragePoolStats& poolStat : record.GetPools()) {
677708
if (poolStat.GetName().StartsWith(tenantBySubDomainKey.GetName())) {
709+
Cerr << "iiiiiiii PoolStat: " << poolStat.GetName() << Endl;
710+
NKikimrViewer::TStorageUsage::EType storageType = GetStorageType(poolStat.GetName());
678711
for (const NKikimrHive::THiveStorageGroupStats& groupStat : poolStat.GetGroups()) {
679712
storageAllocatedSize += groupStat.GetAllocatedSize();
680713
storageAvailableSize += groupStat.GetAvailableSize();
714+
blobStorageByType[storageType] += groupStat.GetAllocatedSize();
715+
blobStorageByType[storageType] += groupStat.GetAvailableSize();
681716
storageMinAvailableSize = std::min(storageMinAvailableSize, groupStat.GetAvailableSize());
682717
++storageGroups;
683718
}
@@ -729,6 +764,12 @@ class TJsonTenantInfo : public TViewerPipeClient {
729764
storageUsage.SetHardQuota(it->second.HardQuota);
730765
}
731766
}
767+
768+
for (const auto& [type, size] : blobStorageByType) {
769+
auto& blobStorage = *tenant.AddBlobStorage();
770+
blobStorage.SetType(type);
771+
blobStorage.SetSize(size);
772+
}
732773
}
733774

734775
THashSet<TNodeId> tenantNodes;

0 commit comments

Comments
 (0)