Skip to content

Commit a7bf6c2

Browse files
committed
Added sys view path type processing in SchemeCache
1 parent c2d2843 commit a7bf6c2

File tree

6 files changed

+139
-42
lines changed

6 files changed

+139
-42
lines changed

ydb/core/protos/sys_view_types.proto

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,36 @@ option java_package = "ru.yandex.kikimr.proto";
44

55
enum ESysViewType {
66
EPartitionStats = 1;
7+
ENodes = 2;
8+
ETopQueriesByDurationOneMinute = 3;
9+
ETopQueriesByDurationOneHour = 4;
10+
ETopQueriesByReadBytesOneMinute = 5;
11+
ETopQueriesByReadBytesOneHour = 6;
12+
ETopQueriesByCpuTimeOneMinute = 7;
13+
ETopQueriesByCpuTimeOneHour = 8;
14+
ETopQueriesByRequestUnitsOneMinute = 9;
15+
ETopQueriesByRequestUnitsOneHour = 10;
16+
EQuerySessions = 11;
17+
EPDisks = 12;
18+
EVSlots = 13;
19+
EGroups = 14;
20+
EStoragePools = 15;
21+
EStorageStats = 16;
22+
ETablets = 17;
23+
EQueryMetricsOneMinute = 18;
24+
ETopPartitionsByCpuOneMinute = 19;
25+
ETopPartitionsByCpuOneHour = 20;
26+
ETopPartitionsByTliOneMinute = 21;
27+
ETopPartitionsByTliOneHour = 22;
28+
EResourcePoolClassifiers = 23;
29+
EResourcePools = 24;
30+
EAuthUsers = 25;
31+
EAuthGroups = 26;
32+
EAuthGroupMembers = 27;
33+
EAuthOwners = 28;
34+
EAuthPermissions = 29;
35+
EAuthEffectivePermissions = 30;
36+
EPgTables = 31;
37+
EInformationSchemaTables = 32;
38+
EPgClass = 33;
739
}

ydb/core/sys_view/common/schema.cpp

Lines changed: 53 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ class TSystemViewResolver : public ISystemViewResolver {
170170
return view ? TMaybe<TSchema>(*view) : Nothing();
171171
}
172172

173+
TMaybe<TSchema> GetSystemViewSchema(ESysViewType viewType) const override final {
174+
const TSchema* view = SystemViews.FindPtr(viewType);
175+
return view ? TMaybe<TSchema>(*view) : Nothing();
176+
}
177+
173178
TVector<TString> GetSystemViewNames(ETarget target) const override {
174179
TVector<TString> result;
175180
switch (target) {
@@ -210,41 +215,50 @@ class TSystemViewResolver : public ISystemViewResolver {
210215

211216
private:
212217
void RegisterPgTablesSystemViews() {
213-
auto registerView = [&](TStringBuf tableName, const TVector<Schema::PgColumn>& columns) {
218+
auto registerView = [&](TStringBuf tableName, ESysViewType type, const TVector<Schema::PgColumn>& columns) {
214219
auto& dsv = DomainSystemViews[tableName];
215220
auto& sdsv = SubDomainSystemViews[tableName];
221+
auto& sv = SystemViews[type];
216222
for (const auto& column : columns) {
217223
dsv.Columns[column._ColumnId + 1] = TSysTables::TTableColumnInfo(
218224
column._ColumnName, column._ColumnId + 1, column._ColumnTypeInfo, "", -1
219225
);
220226
sdsv.Columns[column._ColumnId + 1] = TSysTables::TTableColumnInfo(
221227
column._ColumnName, column._ColumnId + 1, column._ColumnTypeInfo, "", -1
222228
);
229+
sv.Columns[column._ColumnId + 1] = TSysTables::TTableColumnInfo(
230+
column._ColumnName, column._ColumnId + 1, column._ColumnTypeInfo, "", -1
231+
);
223232
}
224233
};
225234
registerView(
226235
PgTablesName,
236+
ESysViewType::EPgTables,
227237
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(PgTablesName)
228238
);
229239
registerView(
230240
InformationSchemaTablesName,
241+
ESysViewType::EInformationSchemaTables,
231242
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(InformationSchemaTablesName)
232243
);
233244
registerView(
234245
PgClassName,
246+
ESysViewType::EPgClass,
235247
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(PgClassName)
236248
);
237249
}
238250

239251
template <typename Table>
240-
void RegisterSystemView(const TStringBuf& name) {
252+
void RegisterSystemView(const TStringBuf& name, ESysViewType type) {
241253
TSchemaFiller<Table>::Fill(DomainSystemViews[name]);
242254
TSchemaFiller<Table>::Fill(SubDomainSystemViews[name]);
255+
TSchemaFiller<Table>::Fill(SystemViews[type]);
243256
}
244257

245258
template <typename Table>
246-
void RegisterDomainSystemView(const TStringBuf& name) {
259+
void RegisterDomainSystemView(const TStringBuf& name, ESysViewType type) {
247260
TSchemaFiller<Table>::Fill(DomainSystemViews[name]);
261+
TSchemaFiller<Table>::Fill(SystemViews[type]);
248262
}
249263

250264
template <typename Table>
@@ -258,29 +272,29 @@ class TSystemViewResolver : public ISystemViewResolver {
258272
}
259273

260274
void RegisterSystemViews() {
261-
RegisterSystemView<Schema::PartitionStats>(PartitionStatsName);
275+
RegisterSystemView<Schema::PartitionStats>(PartitionStatsName, ESysViewType::EPartitionStats);
262276

263-
RegisterSystemView<Schema::Nodes>(NodesName);
277+
RegisterSystemView<Schema::Nodes>(NodesName, ESysViewType::ENodes);
264278

265-
RegisterSystemView<Schema::QueryStats>(TopQueriesByDuration1MinuteName);
266-
RegisterSystemView<Schema::QueryStats>(TopQueriesByDuration1HourName);
267-
RegisterSystemView<Schema::QueryStats>(TopQueriesByReadBytes1MinuteName);
268-
RegisterSystemView<Schema::QueryStats>(TopQueriesByReadBytes1HourName);
269-
RegisterSystemView<Schema::QueryStats>(TopQueriesByCpuTime1MinuteName);
270-
RegisterSystemView<Schema::QueryStats>(TopQueriesByCpuTime1HourName);
271-
RegisterSystemView<Schema::QueryStats>(TopQueriesByRequestUnits1MinuteName);
272-
RegisterSystemView<Schema::QueryStats>(TopQueriesByRequestUnits1HourName);
273-
RegisterSystemView<Schema::QuerySessions>(QuerySessions);
279+
RegisterSystemView<Schema::QueryStats>(TopQueriesByDuration1MinuteName, ESysViewType::ETopQueriesByDurationOneMinute);
280+
RegisterSystemView<Schema::QueryStats>(TopQueriesByDuration1HourName, ESysViewType::ETopQueriesByDurationOneHour);
281+
RegisterSystemView<Schema::QueryStats>(TopQueriesByReadBytes1MinuteName, ESysViewType::ETopQueriesByReadBytesOneMinute);
282+
RegisterSystemView<Schema::QueryStats>(TopQueriesByReadBytes1HourName, ESysViewType::ETopQueriesByReadBytesOneHour);
283+
RegisterSystemView<Schema::QueryStats>(TopQueriesByCpuTime1MinuteName, ESysViewType::ETopQueriesByCpuTimeOneMinute);
284+
RegisterSystemView<Schema::QueryStats>(TopQueriesByCpuTime1HourName, ESysViewType::ETopQueriesByCpuTimeOneHour);
285+
RegisterSystemView<Schema::QueryStats>(TopQueriesByRequestUnits1MinuteName, ESysViewType::ETopQueriesByRequestUnitsOneMinute);
286+
RegisterSystemView<Schema::QueryStats>(TopQueriesByRequestUnits1HourName, ESysViewType::ETopQueriesByRequestUnitsOneHour);
287+
RegisterSystemView<Schema::QuerySessions>(QuerySessions, ESysViewType::EQuerySessions);
274288

275-
RegisterDomainSystemView<Schema::PDisks>(PDisksName);
276-
RegisterDomainSystemView<Schema::VSlots>(VSlotsName);
277-
RegisterDomainSystemView<Schema::Groups>(GroupsName);
278-
RegisterDomainSystemView<Schema::StoragePools>(StoragePoolsName);
279-
RegisterDomainSystemView<Schema::StorageStats>(StorageStatsName);
289+
RegisterDomainSystemView<Schema::PDisks>(PDisksName, ESysViewType::EPDisks);
290+
RegisterDomainSystemView<Schema::VSlots>(VSlotsName, ESysViewType::EVSlots);
291+
RegisterDomainSystemView<Schema::Groups>(GroupsName, ESysViewType::EGroups);
292+
RegisterDomainSystemView<Schema::StoragePools>(StoragePoolsName, ESysViewType::EStoragePools);
293+
RegisterDomainSystemView<Schema::StorageStats>(StorageStatsName, ESysViewType::EStorageStats);
280294

281-
RegisterDomainSystemView<Schema::Tablets>(TabletsName);
295+
RegisterDomainSystemView<Schema::Tablets>(TabletsName, ESysViewType::ETablets);
282296

283-
RegisterSystemView<Schema::QueryMetrics>(QueryMetricsName);
297+
RegisterSystemView<Schema::QueryMetrics>(QueryMetricsName, ESysViewType::EQueryMetricsOneMinute);
284298

285299
RegisterOlapStoreSystemView<Schema::PrimaryIndexStats>(StorePrimaryIndexStatsName);
286300
RegisterOlapStoreSystemView<Schema::PrimaryIndexPortionStats>(StorePrimaryIndexPortionStatsName);
@@ -291,24 +305,24 @@ class TSystemViewResolver : public ISystemViewResolver {
291305
RegisterColumnTableSystemView<Schema::PrimaryIndexGranuleStats>(TablePrimaryIndexGranuleStatsName);
292306
RegisterColumnTableSystemView<Schema::PrimaryIndexOptimizerStats>(TablePrimaryIndexOptimizerStatsName);
293307

294-
RegisterSystemView<Schema::TopPartitions>(TopPartitionsByCpu1MinuteName);
295-
RegisterSystemView<Schema::TopPartitions>(TopPartitionsByCpu1HourName);
296-
RegisterSystemView<Schema::TopPartitionsTli>(TopPartitionsByTli1MinuteName);
297-
RegisterSystemView<Schema::TopPartitionsTli>(TopPartitionsByTli1HourName);
308+
RegisterSystemView<Schema::TopPartitions>(TopPartitionsByCpu1MinuteName, ESysViewType::ETopPartitionsByCpuOneMinute);
309+
RegisterSystemView<Schema::TopPartitions>(TopPartitionsByCpu1HourName, ESysViewType::ETopPartitionsByCpuOneHour);
310+
RegisterSystemView<Schema::TopPartitionsTli>(TopPartitionsByTli1MinuteName, ESysViewType::ETopPartitionsByTliOneMinute);
311+
RegisterSystemView<Schema::TopPartitionsTli>(TopPartitionsByTli1HourName, ESysViewType::ETopPartitionsByTliOneHour);
298312

299313
RegisterPgTablesSystemViews();
300314

301-
RegisterSystemView<Schema::ResourcePoolClassifiers>(ResourcePoolClassifiersName);
302-
RegisterSystemView<Schema::ResourcePools>(ResourcePoolsName);
315+
RegisterSystemView<Schema::ResourcePoolClassifiers>(ResourcePoolClassifiersName, ESysViewType::EResourcePoolClassifiers);
316+
RegisterSystemView<Schema::ResourcePools>(ResourcePoolsName, ESysViewType::EResourcePools);
303317

304318
{
305319
using namespace NAuth;
306-
RegisterSystemView<Schema::AuthUsers>(UsersName);
307-
RegisterSystemView<Schema::AuthGroups>(NAuth::GroupsName);
308-
RegisterSystemView<Schema::AuthGroupMembers>(GroupMembersName);
309-
RegisterSystemView<Schema::AuthOwners>(OwnersName);
310-
RegisterSystemView<Schema::AuthPermissions>(PermissionsName);
311-
RegisterSystemView<Schema::AuthPermissions>(EffectivePermissionsName);
320+
RegisterSystemView<Schema::AuthUsers>(UsersName, ESysViewType::EAuthUsers);
321+
RegisterSystemView<Schema::AuthGroups>(NAuth::GroupsName, ESysViewType::EAuthGroups);
322+
RegisterSystemView<Schema::AuthGroupMembers>(GroupMembersName, ESysViewType::EAuthGroupMembers);
323+
RegisterSystemView<Schema::AuthOwners>(OwnersName, ESysViewType::EAuthOwners);
324+
RegisterSystemView<Schema::AuthPermissions>(PermissionsName, ESysViewType::EAuthPermissions);
325+
RegisterSystemView<Schema::AuthPermissions>(EffectivePermissionsName, ESysViewType::EAuthEffectivePermissions);
312326
}
313327
}
314328

@@ -317,6 +331,7 @@ class TSystemViewResolver : public ISystemViewResolver {
317331
THashMap<TString, TSchema> SubDomainSystemViews;
318332
THashMap<TString, TSchema> OlapStoreSystemViews;
319333
THashMap<TString, TSchema> ColumnTableSystemViews;
334+
THashMap<ESysViewType, TSchema> SystemViews;
320335
};
321336

322337
class TSystemViewRewrittenResolver : public ISystemViewResolver {
@@ -346,6 +361,11 @@ class TSystemViewRewrittenResolver : public ISystemViewResolver {
346361
return view ? TMaybe<TSchema>(*view) : Nothing();
347362
}
348363

364+
TMaybe<TSchema> GetSystemViewSchema(NKikimrSysView::ESysViewType sysViewType) const override final {
365+
Y_UNUSED(sysViewType);
366+
return Nothing();
367+
}
368+
349369
TVector<TString> GetSystemViewNames(ETarget target) const override {
350370
Y_UNUSED(target);
351371
return {};

ydb/core/sys_view/common/schema.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22

33
#include "path.h"
44

5+
#include <ydb/core/protos/sys_view_types.pb.h>
56
#include <ydb/core/tablet_flat/flat_cxx_database.h>
67
#include <ydb/core/tx/locks/sys_tables.h>
78
#include <yql/essentials/parser/pg_catalog/catalog.h>
89
#include <yql/essentials/parser/pg_wrapper/interface/type_desc.h>
910

11+
namespace {
12+
using NKikimrSysView::ESysViewType;
13+
}
14+
1015
namespace NKikimr {
1116
namespace NSysView {
1217

@@ -827,6 +832,8 @@ class ISystemViewResolver {
827832

828833
virtual TMaybe<TSchema> GetSystemViewSchema(const TStringBuf viewName, ETarget target) const = 0;
829834

835+
virtual TMaybe<TSchema> GetSystemViewSchema(ESysViewType viewType) const = 0;
836+
830837
virtual bool IsSystemView(const TStringBuf viewName) const = 0;
831838

832839
virtual TVector<TString> GetSystemViewNames(ETarget target) const = 0;

ydb/core/tx/scheme_board/cache.cpp

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ namespace {
100100
SetError(context, entry, TResolve::EStatus::LookupError, TKeyDesc::EStatus::NotExists);
101101
}
102102

103+
bool IsVirtualSysView(const TString& cacheItemPath, const TString& sysViewInfo) {
104+
return !cacheItemPath.EndsWith(sysViewInfo);
105+
}
106+
103107
template <typename TEvRequest, typename TDerived>
104108
class TDbResolver: public TActorBootstrapped<TDerived> {
105109
void Handle() {
@@ -240,6 +244,7 @@ namespace {
240244
entry.BlockStoreVolumeInfo.Drop();
241245
entry.FileStoreInfo.Drop();
242246
entry.BackupCollectionInfo.Drop();
247+
entry.SysViewInfo.Drop();
243248
}
244249

245250
static void SetErrorAndClear(TResolveContext* context, TResolve::TEntry& entry, const bool isDescribeDenied) {
@@ -759,6 +764,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
759764
ViewInfo.Drop();
760765
ResourcePoolInfo.Drop();
761766
BackupCollectionInfo.Drop();
767+
SysViewInfo.Drop();
762768
}
763769

764770
void FillTableInfo(const NKikimrSchemeOp::TPathDescription& pathDesc) {
@@ -873,6 +879,13 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
873879
}
874880
}
875881

882+
void FillSystemViewInfo(const NKikimrSchemeOp::TPathDescription& pathDesc) {
883+
if (auto schema = Owner->SystemViewResolver->GetSystemViewSchema(pathDesc.GetSysViewDescription().GetType())) {
884+
Columns = std::move(schema->Columns);
885+
KeyColumnTypes = std::move(schema->KeyColumnTypes);
886+
}
887+
}
888+
876889
static TResolve::EKind PathSubTypeToTableKind(NKikimrSchemeOp::EPathSubType subType) {
877890
switch (subType) {
878891
case NKikimrSchemeOp::EPathSubTypeSyncIndexImplTable:
@@ -1283,6 +1296,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
12831296
DESCRIPTION_PART(ViewInfo);
12841297
DESCRIPTION_PART(ResourcePoolInfo);
12851298
DESCRIPTION_PART(BackupCollectionInfo);
1299+
DESCRIPTION_PART(SysViewInfo);
12861300

12871301
#undef DESCRIPTION_PART
12881302

@@ -1624,6 +1638,12 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
16241638
FillInfo(Kind, BackupCollectionInfo, std::move(*pathDesc.MutableBackupCollectionDescription()));
16251639
break;
16261640
case NKikimrSchemeOp::EPathTypeSysView:
1641+
Kind = TNavigate::KindSysView;
1642+
if (Created) {
1643+
FillSystemViewInfo(pathDesc);
1644+
}
1645+
FillInfo(Kind, SysViewInfo, std::move(*pathDesc.MutableSysViewDescription()));
1646+
break;
16271647
case NKikimrSchemeOp::EPathTypeInvalid:
16281648
Y_DEBUG_ABORT("Invalid path type");
16291649
break;
@@ -1704,6 +1724,8 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
17041724
ListNodeEntry->Children.emplace_back(name, pathId, TNavigate::KindBackupCollection);
17051725
break;
17061726
case NKikimrSchemeOp::EPathTypeSysView:
1727+
ListNodeEntry->Children.emplace_back(name, pathId, TNavigate::KindSysView);
1728+
break;
17071729
case NKikimrSchemeOp::EPathTypeTableIndex:
17081730
case NKikimrSchemeOp::EPathTypeInvalid:
17091731
Y_DEBUG_ABORT("Invalid path type");
@@ -1829,7 +1851,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
18291851
return SetError(context, entry, TNavigate::EStatus::LookupError);
18301852
}
18311853

1832-
if (!entry.TableId.SysViewInfo.empty()) {
1854+
if (!entry.TableId.SysViewInfo.empty() && IsVirtualSysView(Path, entry.TableId.SysViewInfo)) {
18331855
if (Kind == TNavigate::KindPath) {
18341856
auto split = SplitPath(Path);
18351857
if (split.size() == 1) {
@@ -1858,12 +1880,17 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
18581880
|| Kind == TNavigate::KindView;
18591881
const bool isTopic = Kind == TNavigate::KindTopic
18601882
|| Kind == TNavigate::KindCdcStream;
1883+
const bool isSysView = Kind == TNavigate::KindSysView;
18611884

1862-
if (entry.Operation == TNavigate::OpTable && !isTable) {
1885+
if (entry.Operation == TNavigate::OpTable && !(isTable || isSysView)) {
18631886
return SetError(context, entry, TNavigate::EStatus::PathNotTable);
18641887
}
18651888

1866-
if (!Created && (isTable || isTopic)) {
1889+
if (!Created && (isTable || isTopic || isSysView)) {
1890+
return SetError(context, entry, TNavigate::EStatus::PathErrorUnknown);
1891+
}
1892+
1893+
if (isSysView && !Columns) {
18671894
return SetError(context, entry, TNavigate::EStatus::PathErrorUnknown);
18681895
}
18691896

@@ -1889,7 +1916,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
18891916
if (Kind == TNavigate::KindTable || Kind == TNavigate::KindColumnTable) {
18901917
entry.TableId = TTableId(PathId.OwnerId, PathId.LocalPathId, SchemaVersion);
18911918
} else {
1892-
entry.TableId = TTableId(PathId.OwnerId, PathId.LocalPathId);
1919+
entry.TableId = TTableId(PathId.OwnerId, PathId.LocalPathId, entry.TableId.SysViewInfo);
18931920
}
18941921
} else {
18951922
entry.Path = SplitPath(Path);
@@ -1927,6 +1954,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
19271954
entry.ViewInfo = ViewInfo;
19281955
entry.ResourcePoolInfo = ResourcePoolInfo;
19291956
entry.BackupCollectionInfo = BackupCollectionInfo;
1957+
entry.SysViewInfo = SysViewInfo;
19301958
}
19311959

19321960
bool CheckColumns(TResolveContext* context, TResolve::TEntry& entry,
@@ -2042,7 +2070,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
20422070
return SetError(context, entry, TResolve::EStatus::LookupError, TKeyDesc::EStatus::NotExists);
20432071
}
20442072

2045-
if (!keyDesc.TableId.SysViewInfo.empty()) {
2073+
if (!keyDesc.TableId.SysViewInfo.empty() && IsVirtualSysView(Path, keyDesc.TableId.SysViewInfo)) {
20462074
if (Kind == TNavigate::KindPath) {
20472075
auto split = SplitPath(Path);
20482076
if (split.size() == 1) {
@@ -2124,7 +2152,8 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
21242152
}
21252153
}
21262154

2127-
if (keyDesc.GetPartitions().empty()) {
2155+
const bool isSysView = Kind == TNavigate::KindSysView;
2156+
if (keyDesc.GetPartitions().empty() && !isSysView) {
21282157
entry.Status = TResolve::EStatus::TypeCheckError;
21292158
keyDesc.Status = TKeyDesc::EStatus::OperationNotSupported;
21302159
}
@@ -2228,6 +2257,9 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
22282257

22292258
// BackupCollection specific
22302259
TIntrusivePtr<TNavigate::TBackupCollectionInfo> BackupCollectionInfo;
2260+
2261+
// SysView specific
2262+
TIntrusivePtr<TNavigate::TSysViewInfo> SysViewInfo;
22312263
}; // TCacheItem
22322264

22332265
struct TMerger {

ydb/core/tx/scheme_cache/scheme_cache.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ struct TSchemeCacheNavigate {
316316
NKikimrSchemeOp::TBackupCollectionDescription Description;
317317
};
318318

319+
struct TSysViewInfo : public TAtomicRefCount<TSysViewInfo> {
320+
EKind Kind = KindUnknown;
321+
NKikimrSchemeOp::TSysViewDescription Description;
322+
};
323+
319324
struct TEntry {
320325
enum class ERequestType : ui8 {
321326
ByPath,
@@ -370,6 +375,7 @@ struct TSchemeCacheNavigate {
370375
TIntrusiveConstPtr<TViewInfo> ViewInfo;
371376
TIntrusiveConstPtr<TResourcePoolInfo> ResourcePoolInfo;
372377
TIntrusiveConstPtr<TBackupCollectionInfo> BackupCollectionInfo;
378+
TIntrusiveConstPtr<TSysViewInfo> SysViewInfo;
373379

374380
TString ToString() const;
375381
TString ToString(const NScheme::TTypeRegistry& typeRegistry) const;

0 commit comments

Comments
 (0)