diff options
author | Andrey Zaspa <zaspa94@ydb.tech> | 2025-05-22 21:01:59 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-22 21:01:59 +0400 |
commit | 6cb271e52c35ea2045ac0ab63599a8043cde0070 (patch) | |
tree | a3ddfca211f910b42cd29eed0f7fb6ea9199846b | |
parent | 5000583a0aaee538ec3c8320cecf2cba96cba20b (diff) | |
download | ydb-6cb271e52c35ea2045ac0ab63599a8043cde0070.tar.gz |
Added filling PathDescription for SysView path type in TxProxy (#18543)
-rw-r--r-- | ydb/core/tx/tx_proxy/commitreq.cpp | 3 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/datareq.cpp | 2 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/describe.cpp | 97 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/read_table_impl.cpp | 2 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/resolvereq.cpp | 5 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/resolvereq.h | 2 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/snapshotreq.cpp | 20 | ||||
-rw-r--r-- | ydb/core/tx/tx_proxy/upload_rows_common_impl.h | 6 |
8 files changed, 105 insertions, 32 deletions
diff --git a/ydb/core/tx/tx_proxy/commitreq.cpp b/ydb/core/tx/tx_proxy/commitreq.cpp index 5a09e0f4397..b6b6acdefd1 100644 --- a/ydb/core/tx/tx_proxy/commitreq.cpp +++ b/ydb/core/tx/tx_proxy/commitreq.cpp @@ -209,7 +209,8 @@ private: break; } - if (entry.KeyDescription->TableId.IsSystemView() || + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) || TSysTables::IsSystemTable(entry.KeyDescription->TableId)) { const TString explanation = TStringBuilder() diff --git a/ydb/core/tx/tx_proxy/datareq.cpp b/ydb/core/tx/tx_proxy/datareq.cpp index 208793d05b1..695e0a1d84a 100644 --- a/ydb/core/tx/tx_proxy/datareq.cpp +++ b/ydb/core/tx/tx_proxy/datareq.cpp @@ -1498,7 +1498,7 @@ void TDataReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev, auto &res = resp->ResultSet[0]; ReadTableRequest->TableId = res.TableId; - if (res.TableId.IsSystemView()) { + if (res.TableId.IsSystemView() || res.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) { IssueManager.RaiseIssue(MakeIssue(NKikimrIssues::TIssuesIds::GENERIC_RESOLVE_ERROR, Sprintf("Table '%s' is a system view. Read table is not supported", ReadTableRequest->TablePath.data()))); ReportStatus(TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ResolveError, NKikimrIssues::TStatusIds::SCHEME_ERROR, true, ctx); diff --git a/ydb/core/tx/tx_proxy/describe.cpp b/ydb/core/tx/tx_proxy/describe.cpp index 3e2821a1bd2..fa6b65b072f 100644 --- a/ydb/core/tx/tx_proxy/describe.cpp +++ b/ydb/core/tx/tx_proxy/describe.cpp @@ -17,6 +17,10 @@ namespace NKikimr { namespace NTxProxy { +namespace { + using TNavigate = NSchemeCache::TSchemeCacheNavigate; +} + class TDescribeReq : public TActor<TDescribeReq> { const TTxProxyServices Services; @@ -32,6 +36,8 @@ class TDescribeReq : public TActor<TDescribeReq> { TString TextPath; + THolder<NSysView::ISystemViewResolver> SystemViewResolver; + void Die(const TActorContext &ctx) override { --*TxProxyMon->NavigateReqInFly; @@ -69,13 +75,51 @@ class TDescribeReq : public TActor<TDescribeReq> { //descr->SetOwner(BUILTIN_ACL_ROOT); } - void FillSystemViewDescr(NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) { - descr->SetSchemeshardId(schemeShardId); - descr->SetPathId(InvalidLocalPathId); - descr->SetParentPathId(InvalidLocalPathId); - descr->SetCreateFinished(true); - descr->SetCreateTxId(0); - descr->SetCreateStep(0); + void FillSystemViewDirEntry(NKikimrSchemeOp::TDirEntry* self, ui64 schemeShardId) { + self->SetSchemeshardId(schemeShardId); + self->SetPathId(InvalidLocalPathId); + self->SetParentPathId(InvalidLocalPathId); + self->SetCreateFinished(true); + self->SetCreateTxId(0); + self->SetCreateStep(0); + } + + void FillSystemViewDescr(NKikimrSchemeOp::TPathDescription& descr, NSysView::ISystemViewResolver::TSchema schema) { + auto* table = descr.MutableTable(); + table->MutableColumns()->Reserve(schema.Columns.size()); + const size_t keySize = schema.KeyColumnTypes.size(); + table->MutableKeyColumnIds()->Resize(keySize, 0); + + for (auto& [id, column] : schema.Columns) { + auto* col = table->AddColumns(); + col->SetId(column.Id); + col->SetName(column.Name); + col->SetType(NScheme::TypeName(column.PType, column.PTypeMod)); + auto columnType = NScheme::ProtoColumnTypeFromTypeInfoMod(column.PType, column.PTypeMod); + col->SetTypeId(columnType.TypeId); + if (columnType.TypeInfo) { + *col->MutableTypeInfo() = std::move(*columnType.TypeInfo); + } + + if (column.IsNotNullColumn) { + col->SetNotNull(true); + } + + if (column.KeyOrder >= 0) { + Y_ABORT_UNLESS((size_t)column.KeyOrder < keySize); + table->SetKeyColumnIds(column.KeyOrder, column.Id); + } + } + + table->MutableKeyColumnNames()->Reserve(keySize); + for (const auto& id : table->GetKeyColumnIds()) { + auto columnIt = schema.Columns.find(id); + Y_ABORT_UNLESS(columnIt != schema.Columns.end()); + table->AddKeyColumnNames(std::move(columnIt->second.Name)); + } + + auto* stats = descr.MutableTableStats(); + stats->SetPartCount(0); } void SendSystemViewResult(const NSchemeCache::TSchemeCacheNavigate::TEntry& entry, const TString& path, @@ -92,7 +136,7 @@ class TDescribeReq : public TActor<TDescribeReq> { Y_ABORT_UNLESS(!entry.Path.empty()); self->SetName(entry.Path.back()); self->SetPathType(NKikimrSchemeOp::EPathTypeTable); - FillSystemViewDescr(self, schemeShardId); + FillSystemViewDirEntry(self, schemeShardId); auto* table = pathDescription->MutableTable(); @@ -159,14 +203,14 @@ class TDescribeReq : public TActor<TDescribeReq> { self->SetName(TString(NSysView::SysPathName)); self->SetPathType(NKikimrSchemeOp::EPathTypeDir); - FillSystemViewDescr(self, schemeShardId); + FillSystemViewDirEntry(self, schemeShardId); if (entry.ListNodeEntry) { for (const auto& child : entry.ListNodeEntry->Children) { auto descr = pathDescription->AddChildren(); descr->SetName(child.Name); descr->SetPathType(NKikimrSchemeOp::EPathTypeTable); - FillSystemViewDescr(descr, schemeShardId); + FillSystemViewDirEntry(descr, schemeShardId); } }; @@ -197,6 +241,7 @@ public: : TActor(&TThis::StateWaitInit) , Services(services) , TxProxyMon(txProxyMon) + , SystemViewResolver(NSysView::CreateSystemViewResolver()) { ++*TxProxyMon->NavigateReqInFly; } @@ -355,8 +400,9 @@ void TDescribeReq::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr & const auto& describePath = SchemeRequest->Ev->Get()->Record.GetDescribePath(); - if (entry.TableId.IsSystemView()) { - // don't go to schemeshard + if (entry.TableId.IsSystemView() && entry.Kind != TNavigate::KindSysView) { + // don't go to schemeshard if entry describes sys view path and this path is virtual + // for materialized sys view paths send the request to SchemeShard const auto& path = describePath.GetPath(); if (entry.TableId.SysViewInfo == NSysView::SysPathName) { @@ -403,7 +449,8 @@ void TDescribeReq::Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult: TxProxyMon->NavigateLatency->Collect((ctx.Now() - WallClockStarted).MilliSeconds()); - if (AppData()->FeatureFlags.GetEnableSystemViews()) { + if (AppData()->FeatureFlags.GetEnableSystemViews() && + ev->Get()->GetRecord().GetStatus() == NKikimrScheme::StatusSuccess) { const auto& pathDescription = ev->Get()->GetRecord().GetPathDescription(); const auto& self = pathDescription.GetSelf(); @@ -426,9 +473,11 @@ void TDescribeReq::Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult: const auto& children = pathDescription.GetChildren(); if (!children.empty()) { - auto size = children.size(); - if (children[size - 1].GetName() == NSysView::SysPathName) { - hasSysFolder = true; + for (const auto& child : children) { + if (child.GetName() == NSysView::SysPathName) { + hasSysFolder = true; + break; + } } } @@ -437,7 +486,21 @@ void TDescribeReq::Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult: auto* descr = record->MutablePathDescription()->AddChildren(); descr->SetName(TString(NSysView::SysPathName)); descr->SetPathType(NKikimrSchemeOp::EPathTypeDir); - FillSystemViewDescr(descr, self.GetSchemeshardId()); + FillSystemViewDirEntry(descr, self.GetSchemeshardId()); + } + } + + if (self.GetPathType() == NKikimrSchemeOp::EPathType::EPathTypeSysView) { + // have to fill schema related fields for sys views with materialized paths + // sys views with virtual paths get these fields from SchemeCache + auto* record = ev->Get()->MutableRecord(); + auto& descr = *record->MutablePathDescription(); + + if (auto schema = SystemViewResolver->GetSystemViewSchema(descr.GetSysViewDescription().GetType())) { + FillSystemViewDescr(descr, std::move(*schema)); + } else { + ReportError(NKikimrScheme::StatusPathDoesNotExist, "Unknown system view type", ctx); + return Die(ctx); } } } diff --git a/ydb/core/tx/tx_proxy/read_table_impl.cpp b/ydb/core/tx/tx_proxy/read_table_impl.cpp index 0ebf186d241..a6f2773f8ce 100644 --- a/ydb/core/tx/tx_proxy/read_table_impl.cpp +++ b/ydb/core/tx/tx_proxy/read_table_impl.cpp @@ -593,7 +593,7 @@ private: DomainInfo = res.DomainInfo; Y_ABORT_UNLESS(DomainInfo, "Missing DomainInfo in TEvNavigateKeySetResult"); - if (TableId.IsSystemView() || + if ((TableId.IsSystemView() || res.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) || TSysTables::IsSystemTable(TableId)) { TString error = TStringBuilder() diff --git a/ydb/core/tx/tx_proxy/resolvereq.cpp b/ydb/core/tx/tx_proxy/resolvereq.cpp index 399466137d1..e105353c09e 100644 --- a/ydb/core/tx/tx_proxy/resolvereq.cpp +++ b/ydb/core/tx/tx_proxy/resolvereq.cpp @@ -60,7 +60,8 @@ namespace { NSchemeCache::TDomainInfo::TPtr domainInfo; for (const auto& entry : Tables) { - if (entry.KeyDescription->TableId.IsSystemView() || + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) || TSysTables::IsSystemTable(entry.KeyDescription->TableId)) { continue; @@ -181,7 +182,7 @@ namespace { auto& entry = resp->ResultSet[index]; table.TableId = entry.TableId; - table.IsColumnTable = (entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindColumnTable); + table.Kind = entry.Kind; TVector<NScheme::TTypeInfo> keyColumnTypes(entry.Columns.size()); TVector<TKeyDesc::TColumnOp> columns(entry.Columns.size()); diff --git a/ydb/core/tx/tx_proxy/resolvereq.h b/ydb/core/tx/tx_proxy/resolvereq.h index 4f4dbfbaa03..7cc358d5ca4 100644 --- a/ydb/core/tx/tx_proxy/resolvereq.h +++ b/ydb/core/tx/tx_proxy/resolvereq.h @@ -20,7 +20,7 @@ namespace NTxProxy { TSerializedCellVec ToValues; THolder<TKeyDesc> KeyDescription; NSchemeCache::TDomainInfo::TPtr DomainInfo; - bool IsColumnTable = false; + NSchemeCache::TSchemeCacheNavigate::EKind Kind; }; using TResolveTableResponses = TVector<TResolveTableResponse>; diff --git a/ydb/core/tx/tx_proxy/snapshotreq.cpp b/ydb/core/tx/tx_proxy/snapshotreq.cpp index 09f89b6e3b0..dc00b30bbf8 100644 --- a/ydb/core/tx/tx_proxy/snapshotreq.cpp +++ b/ydb/core/tx/tx_proxy/snapshotreq.cpp @@ -287,17 +287,21 @@ public: break; } - if (entry.KeyDescription->TableId.IsSystemView() && IgnoreSystemViews) { + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) && + IgnoreSystemViews) + { continue; } - if (entry.IsColumnTable) { + if (entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindColumnTable) { // OLAP tables don't create snapshots explicitly hasColumnTable = true; continue; } - if (entry.KeyDescription->TableId.IsSystemView() || + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) || TSysTables::IsSystemTable(entry.KeyDescription->TableId)) { const TString explanation = TStringBuilder() @@ -1311,16 +1315,20 @@ public: TxProxyMon->TxPrepareResolveHgram->Collect((WallClockResolved - WallClockResolveStarted).MicroSeconds()); for (const auto& entry : msg->Tables) { - if (entry.KeyDescription->TableId.IsSystemView() && IgnoreSystemViews) { + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) && + IgnoreSystemViews) + { continue; } - if (entry.IsColumnTable) { + if (entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindColumnTable) { // OLAP tables don't create snapshots explicitly continue; } - if (entry.KeyDescription->TableId.IsSystemView() || + if ((entry.KeyDescription->TableId.IsSystemView() || + entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) || TSysTables::IsSystemTable(entry.KeyDescription->TableId)) { const TString explanation = TStringBuilder() diff --git a/ydb/core/tx/tx_proxy/upload_rows_common_impl.h b/ydb/core/tx/tx_proxy/upload_rows_common_impl.h index 744a5107f56..8128d71c929 100644 --- a/ydb/core/tx/tx_proxy/upload_rows_common_impl.h +++ b/ydb/core/tx/tx_proxy/upload_rows_common_impl.h @@ -396,14 +396,14 @@ private: if (!cp) { return TConclusionStatus::Fail(Sprintf("Unknown column: %s", name.c_str())); } - i32 pgTypeMod = -1; + i32 pgTypeMod = -1; const ui32 colId = *cp; auto& ci = *entry.Columns.FindPtr(colId); TString columnTypeName = NScheme::TypeName(ci.PType, ci.PTypeMod); const Ydb::Type& typeInProto = (*reqColumns)[pos].second; - + TString parseProtoError; NScheme::TTypeInfoMod inTypeInfoMod; if (!NScheme::TypeInfoFromProto(typeInProto, inTypeInfoMod, parseProtoError)){ @@ -593,7 +593,7 @@ private: TableKind = entry.Kind; const bool isColumnTable = (TableKind == NSchemeCache::TSchemeCacheNavigate::KindColumnTable); - if (entry.TableId.IsSystemView()) { + if (entry.TableId.IsSystemView() || entry.Kind == NSchemeCache::TSchemeCacheNavigate::KindSysView) { return ReplyWithError(Ydb::StatusIds::SCHEME_ERROR, "is not supported. Table is a system view", ctx); } |