aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Zaspa <zaspa94@ydb.tech>2025-05-22 21:01:59 +0400
committerGitHub <noreply@github.com>2025-05-22 21:01:59 +0400
commit6cb271e52c35ea2045ac0ab63599a8043cde0070 (patch)
treea3ddfca211f910b42cd29eed0f7fb6ea9199846b
parent5000583a0aaee538ec3c8320cecf2cba96cba20b (diff)
downloadydb-6cb271e52c35ea2045ac0ab63599a8043cde0070.tar.gz
Added filling PathDescription for SysView path type in TxProxy (#18543)
-rw-r--r--ydb/core/tx/tx_proxy/commitreq.cpp3
-rw-r--r--ydb/core/tx/tx_proxy/datareq.cpp2
-rw-r--r--ydb/core/tx/tx_proxy/describe.cpp97
-rw-r--r--ydb/core/tx/tx_proxy/read_table_impl.cpp2
-rw-r--r--ydb/core/tx/tx_proxy/resolvereq.cpp5
-rw-r--r--ydb/core/tx/tx_proxy/resolvereq.h2
-rw-r--r--ydb/core/tx/tx_proxy/snapshotreq.cpp20
-rw-r--r--ydb/core/tx/tx_proxy/upload_rows_common_impl.h6
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);
}