Skip to content

Commit 15434ee

Browse files
committed
Added a new sdk method DescribeSystemView and a corresponded Grpc service
1 parent c7e0b8b commit 15434ee

File tree

18 files changed

+463
-27
lines changed

18 files changed

+463
-27
lines changed

ydb/core/driver_lib/cli_base/cli_cmds_db.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <ydb/core/tx/schemeshard/schemeshard_user_attr_limits.h>
55
#include <ydb/core/protos/bind_channel_storage_pool.pb.h>
66
#include <ydb/core/protos/schemeshard/operations.pb.h>
7+
#include <ydb/core/protos/sys_view_types.pb.h>
78

89
#include <ydb/library/aclib/aclib.h>
910

@@ -316,8 +317,15 @@ class TClientCommandSchemaDescribe : public TClientCommand {
316317
Cout << id << type << name << owner << acl << Endl;
317318
if (Details) {
318319
switch(entry.GetPathType()) {
319-
case NKikimrSchemeOp::EPathTypeTable:
320320
case NKikimrSchemeOp::EPathTypeSysView: {
321+
const NKikimrSchemeOp::TSysViewDescription& sysView(path.GetSysViewDescription());
322+
TString typeNumValue(Sprintf("%lu", sysView.GetType()));
323+
TString typeStringValue(NKikimrSysView::ESysViewType_Name(sysView.GetType()));
324+
PadString(typeNumValue, 10);
325+
PadString(typeStringValue, 50);
326+
Cout << typeNumValue << typeStringValue << Endl;
327+
}
328+
case NKikimrSchemeOp::EPathTypeTable: {
321329
const NKikimrSchemeOp::TTableDescription& table(path.GetTable());
322330
size_t szWidth = id.size() + type.size() + entry.GetName().size();
323331
size_t szColumns[3] = {0, 0, 0};
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
#include "rpc_scheme_base.h"
2+
#include "service_table.h"
3+
4+
#include <ydb/core/base/path.h>
5+
#include <ydb/core/grpc_services/base/base.h>
6+
#include <ydb/core/grpc_services/rpc_common/rpc_common.h>
7+
#include <ydb/core/protos/sys_view_types.pb.h>
8+
#include <ydb/core/tx/schemeshard/schemeshard.h>
9+
#include <ydb/core/ydb_convert/table_description.h>
10+
#include <ydb/core/ydb_convert/ydb_convert.h>
11+
12+
namespace NKikimr {
13+
namespace NGRpcService {
14+
15+
using namespace NActors;
16+
using namespace Ydb;
17+
18+
using TEvDescribeSystemViewRequest = TGrpcRequestOperationCall<Ydb::Table::DescribeSystemViewRequest,
19+
Ydb::Table::DescribeSystemViewResponse>;
20+
21+
class TDescribeSystemViewRPC : public TRpcSchemeRequestActor<TDescribeSystemViewRPC, TEvDescribeSystemViewRequest> {
22+
using TBase = TRpcSchemeRequestActor<TDescribeSystemViewRPC, TEvDescribeSystemViewRequest>;
23+
24+
public:
25+
TDescribeSystemViewRPC(IRequestOpCtx* msg)
26+
: TBase(msg) {}
27+
28+
void Bootstrap(const TActorContext &ctx) {
29+
TBase::Bootstrap(ctx);
30+
31+
const auto request = GetProtoRequest();
32+
const auto& path = request->path();
33+
const auto paths = NKikimr::SplitPath(path);
34+
if (paths.empty()) {
35+
Request_->RaiseIssue(NYql::TIssue("Invalid path"));
36+
return Reply(Ydb::StatusIds::BAD_REQUEST, ctx);
37+
}
38+
39+
SendProposeRequest(path, ctx);
40+
Become(&TDescribeSystemViewRPC::StateWork);
41+
}
42+
43+
private:
44+
STATEFN(StateWork) {
45+
switch (ev->GetTypeRewrite()) {
46+
HFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, Handle);
47+
default:
48+
TBase::StateWork(ev);
49+
}
50+
}
51+
52+
void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev, const TActorContext& ctx) {
53+
const auto& record = ev->Get()->GetRecord();
54+
const auto status = record.GetStatus();
55+
56+
if (record.HasReason()) {
57+
auto issue = NYql::TIssue(record.GetReason());
58+
Request_->RaiseIssue(issue);
59+
}
60+
Ydb::Table::DescribeSystemViewResult describeSysViewResult;
61+
switch (status) {
62+
case NKikimrScheme::StatusSuccess: {
63+
const auto& pathDescription = record.GetPathDescription();
64+
if (pathDescription.GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeSysView) {
65+
Request_->RaiseIssue(NYql::TIssue(
66+
TStringBuilder() << "Unexpected path type: " << pathDescription.GetSelf().GetPathType()
67+
));
68+
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
69+
}
70+
71+
Ydb::Scheme::Entry* selfEntry = describeSysViewResult.mutable_self();
72+
ConvertDirectoryEntry(pathDescription.GetSelf(), selfEntry, true);
73+
74+
const auto& sysViewDescription = pathDescription.GetSysViewDescription();
75+
auto& sysViewType = *describeSysViewResult.mutable_type();
76+
sysViewType.set_num_value(sysViewDescription.GetType());
77+
sysViewType.set_string_value(NKikimrSysView::ESysViewType_Name(sysViewDescription.GetType()));
78+
79+
const auto& tableDescription = pathDescription.GetTable();
80+
try {
81+
FillColumnDescription(describeSysViewResult, tableDescription);
82+
} catch (const std::exception& ex) {
83+
return ReplyOnException(ex, "Unable to fill column description");
84+
}
85+
86+
describeSysViewResult.mutable_primary_key()->CopyFrom(tableDescription.GetKeyColumnNames());
87+
FillAttributes(describeSysViewResult, pathDescription);
88+
89+
return ReplyWithResult(Ydb::StatusIds::SUCCESS, describeSysViewResult, ctx);
90+
}
91+
92+
case NKikimrScheme::StatusPathDoesNotExist:
93+
case NKikimrScheme::StatusSchemeError: {
94+
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
95+
}
96+
97+
case NKikimrScheme::StatusAccessDenied: {
98+
return Reply(Ydb::StatusIds::UNAUTHORIZED, ctx);
99+
}
100+
101+
case NKikimrScheme::StatusNotAvailable: {
102+
return Reply(Ydb::StatusIds::UNAVAILABLE, ctx);
103+
}
104+
105+
default: {
106+
return Reply(Ydb::StatusIds::GENERIC_ERROR, ctx);
107+
}
108+
}
109+
}
110+
111+
void SendProposeRequest(const TString& path, const TActorContext& ctx) {
112+
std::unique_ptr<TEvTxUserProxy::TEvNavigate> navigateRequest(new TEvTxUserProxy::TEvNavigate());
113+
SetAuthToken(navigateRequest, *Request_);
114+
SetDatabase(navigateRequest.get(), *Request_);
115+
NKikimrSchemeOp::TDescribePath* record = navigateRequest->Record.MutableDescribePath();
116+
record->SetPath(path);
117+
118+
ctx.Send(MakeTxProxyID(), navigateRequest.release());
119+
}
120+
121+
void ReplyOnException(const std::exception& ex, const char* logPrefix) noexcept {
122+
auto& ctx = TlsActivationContext->AsActorContext();
123+
LOG_ERROR(ctx, NKikimrServices::GRPC_SERVER, "%s: %s", logPrefix, ex.what());
124+
Request_->RaiseIssue(NYql::ExceptionToIssue(ex));
125+
return Reply(Ydb::StatusIds::INTERNAL_ERROR, ctx);
126+
}
127+
};
128+
129+
void DoDescribeSystemViewRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f) {
130+
f.RegisterActor(new TDescribeSystemViewRPC(p.release()));
131+
}
132+
133+
} // namespace NKikimr
134+
} // namespace NGRpcService

ydb/core/grpc_services/service_table.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ void DoRenameTablesRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProv
1818
void DoDescribeTableRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
1919
void DoDescribeExternalDataSourceRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
2020
void DoDescribeExternalTableRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
21+
void DoDescribeSystemViewRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
2122
void DoCreateSessionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
2223
void DoDeleteSessionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
2324
void DoKeepAliveRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);

ydb/core/grpc_services/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SRCS(
3636
rpc_describe_external_data_source.cpp
3737
rpc_describe_external_table.cpp
3838
rpc_describe_path.cpp
39+
rpc_describe_system_view.cpp
3940
rpc_describe_table.cpp
4041
rpc_describe_table_options.cpp
4142
rpc_discovery.cpp

ydb/core/jaeger_tracing/request_discriminator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ extern const THashMap<TStringBuf, ERequestType> NameToRequestType = {
4444
{"Table.ReadRows", ERequestType::TABLE_READROWS},
4545
{"Table.DescribeExternalDataSource", ERequestType::TABLE_DESCRIBEEXTERNALDATASOURCE},
4646
{"Table.DescribeExternalTable", ERequestType::TABLE_DESCRIBEEXTERNALTABLE},
47+
{"Table.DescribeSystemView", ERequestType::TABLE_DESCRIBESYSTEMVIEW},
4748

4849
{"Query.ExecuteQuery", ERequestType::QUERY_EXECUTEQUERY},
4950
{"Query.ExecuteScript", ERequestType::QUERY_EXECUTESCRIPT},

ydb/core/jaeger_tracing/request_discriminator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ enum class ERequestType: size_t {
4949
TABLE_READROWS,
5050
TABLE_DESCRIBEEXTERNALDATASOURCE,
5151
TABLE_DESCRIBEEXTERNALTABLE,
52+
TABLE_DESCRIBESYSTEMVIEW,
5253

5354
QUERY_EXECUTEQUERY,
5455
QUERY_EXECUTESCRIPT,

ydb/core/sys_view/ut_kqp.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3551,27 +3551,47 @@ ALTER OBJECT `/Root/test_show_create` (TYPE TABLE) SET (ACTION = UPSERT_OPTIONS,
35513551
TTableClient client(env.GetDriver());
35523552
auto session = client.CreateSession().GetValueSync().GetSession();
35533553
{
3554-
auto settings = TDescribeTableSettings()
3555-
.WithKeyShardBoundary(true)
3556-
.WithTableStatistics(true)
3557-
.WithPartitionStatistics(true);
3554+
if (EnableRealSystemViewPaths) {
3555+
auto result = session.DescribeSystemView("/Root/.sys/partition_stats").GetValueSync();
3556+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
35583557

3559-
auto result = session.DescribeTable("/Root/.sys/partition_stats", settings).GetValueSync();
3560-
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
3558+
const auto& systemView = result.GetSystemViewDescription();
3559+
3560+
const auto& type = systemView.GetType();
3561+
UNIT_ASSERT_VALUES_EQUAL(type.NumValue, 1);
3562+
UNIT_ASSERT_VALUES_EQUAL(type.StringValue, "EPartitionStats");
3563+
3564+
const auto& columns = systemView.GetTableColumns();
3565+
UNIT_ASSERT_VALUES_EQUAL(columns.size(), 30);
3566+
UNIT_ASSERT_STRINGS_EQUAL(columns[0].Name, "OwnerId");
3567+
UNIT_ASSERT_STRINGS_EQUAL(FormatType(columns[0].Type), "Uint64?");
35613568

3562-
const auto& table = result.GetTableDescription();
3563-
const auto& columns = table.GetTableColumns();
3564-
const auto& keyColumns = table.GetPrimaryKeyColumns();
3569+
const auto& keyColumns = systemView.GetPrimaryKeyColumns();
3570+
UNIT_ASSERT_VALUES_EQUAL(keyColumns.size(), 4);
3571+
UNIT_ASSERT_STRINGS_EQUAL(keyColumns[0], "OwnerId");
3572+
} else {
3573+
auto settings = TDescribeTableSettings()
3574+
.WithKeyShardBoundary(true)
3575+
.WithTableStatistics(true)
3576+
.WithPartitionStatistics(true);
3577+
3578+
auto result = session.DescribeTable("/Root/.sys/partition_stats", settings).GetValueSync();
3579+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
35653580

3566-
UNIT_ASSERT_VALUES_EQUAL(columns.size(), 30);
3567-
UNIT_ASSERT_STRINGS_EQUAL(columns[0].Name, "OwnerId");
3568-
UNIT_ASSERT_STRINGS_EQUAL(FormatType(columns[0].Type), "Uint64?");
3581+
const auto& table = result.GetTableDescription();
3582+
const auto& columns = table.GetTableColumns();
3583+
const auto& keyColumns = table.GetPrimaryKeyColumns();
35693584

3570-
UNIT_ASSERT_VALUES_EQUAL(keyColumns.size(), 4);
3571-
UNIT_ASSERT_STRINGS_EQUAL(keyColumns[0], "OwnerId");
3585+
UNIT_ASSERT_VALUES_EQUAL(columns.size(), 30);
3586+
UNIT_ASSERT_STRINGS_EQUAL(columns[0].Name, "OwnerId");
3587+
UNIT_ASSERT_STRINGS_EQUAL(FormatType(columns[0].Type), "Uint64?");
35723588

3573-
UNIT_ASSERT_VALUES_EQUAL(table.GetPartitionStats().size(), 0);
3574-
UNIT_ASSERT_VALUES_EQUAL(table.GetPartitionsCount(), 0);
3589+
UNIT_ASSERT_VALUES_EQUAL(keyColumns.size(), 4);
3590+
UNIT_ASSERT_STRINGS_EQUAL(keyColumns[0], "OwnerId");
3591+
3592+
UNIT_ASSERT_VALUES_EQUAL(table.GetPartitionStats().size(), 0);
3593+
UNIT_ASSERT_VALUES_EQUAL(table.GetPartitionsCount(), 0);
3594+
}
35753595
}
35763596

35773597
TSchemeClient schemeClient(env.GetDriver());

ydb/core/ydb_convert/table_description.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -539,12 +539,14 @@ void FillColumnDescriptionImpl(TYdbProto& out,
539539
}
540540
}
541541

542-
if (in.HasTTLSettings()) {
543-
if (in.GetTTLSettings().HasEnabled()) {
544-
Ydb::StatusIds::StatusCode code;
545-
TString error;
546-
if (!FillTtlSettings(*out.mutable_ttl_settings(), in.GetTTLSettings().GetEnabled(), code, error)) {
547-
ythrow yexception() << "invalid TTL settings: " << error;
542+
if constexpr (!std::is_same_v<TYdbProto, Ydb::Table::DescribeSystemViewResult>) {
543+
if (in.HasTTLSettings()) {
544+
if (in.GetTTLSettings().HasEnabled()) {
545+
Ydb::StatusIds::StatusCode code;
546+
TString error;
547+
if (!FillTtlSettings(*out.mutable_ttl_settings(), in.GetTTLSettings().GetEnabled(), code, error)) {
548+
ythrow yexception() << "invalid TTL settings: " << error;
549+
}
548550
}
549551
}
550552
}
@@ -555,6 +557,11 @@ void FillColumnDescription(Ydb::Table::DescribeTableResult& out,
555557
FillColumnDescriptionImpl(out, splitKeyType, in);
556558
}
557559

560+
void FillColumnDescription(Ydb::Table::DescribeSystemViewResult& out, const NKikimrSchemeOp::TTableDescription& in) {
561+
NKikimrMiniKQL::TType splitKeyType;
562+
FillColumnDescriptionImpl(out, splitKeyType, in);
563+
}
564+
558565
void FillColumnDescription(Ydb::Table::CreateTableRequest& out,
559566
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in) {
560567
FillColumnDescriptionImpl(out, splitKeyType, in);
@@ -1069,7 +1076,7 @@ void FillIndexDescriptionImpl(TYdbProto& out, const NKikimrSchemeOp::TTableDescr
10691076
FillGlobalIndexSettings(
10701077
*index->mutable_global_vector_kmeans_tree_index()->mutable_prefix_table_settings(),
10711078
tableIndex.GetIndexImplTableDescriptions(2)
1072-
);
1079+
);
10731080
}
10741081

10751082
*index->mutable_global_vector_kmeans_tree_index()->mutable_vector_settings() = tableIndex.GetVectorIndexKmeansTreeDescription().GetSettings();
@@ -1541,6 +1548,11 @@ void FillAttributes(Ydb::Table::DescribeTableResult& out,
15411548
FillAttributesImpl(out, in);
15421549
}
15431550

1551+
void FillAttributes(Ydb::Table::DescribeSystemViewResult& out,
1552+
const NKikimrSchemeOp::TPathDescription& in) {
1553+
FillAttributesImpl(out, in);
1554+
}
1555+
15441556
void FillAttributes(Ydb::Table::CreateTableRequest& out,
15451557
const NKikimrSchemeOp::TPathDescription& in) {
15461558
FillAttributesImpl(out, in);

ydb/core/ydb_convert/table_description.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ bool BuildAlterTableAddIndexRequest(const Ydb::Table::AlterTableRequest* req, NK
5454
void FillColumnDescription(Ydb::Table::ColumnMeta& out, const NKikimrSchemeOp::TColumnDescription& in);
5555
void FillColumnDescription(Ydb::Table::DescribeTableResult& out,
5656
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in);
57+
void FillColumnDescription(Ydb::Table::DescribeSystemViewResult& out, const NKikimrSchemeOp::TTableDescription& in);
5758
void FillColumnDescription(Ydb::Table::CreateTableRequest& out,
5859
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in);
5960
void FillColumnDescription(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TColumnTableDescription& in);
@@ -117,6 +118,8 @@ void FillColumnFamilies(Ydb::Table::CreateTableRequest& out,
117118
// out
118119
void FillAttributes(Ydb::Table::DescribeTableResult& out,
119120
const NKikimrSchemeOp::TPathDescription& in);
121+
void FillAttributes(Ydb::Table::DescribeSystemViewResult& out,
122+
const NKikimrSchemeOp::TPathDescription& in);
120123
void FillAttributes(Ydb::Table::CreateTableRequest& out,
121124
const NKikimrSchemeOp::TPathDescription& in);
122125

ydb/public/api/grpc/ydb_table_v1.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,7 @@ service TableService {
9191

9292
// Returns information about a given external table.
9393
rpc DescribeExternalTable(Table.DescribeExternalTableRequest) returns (Table.DescribeExternalTableResponse);
94+
95+
// Returns information about a given system view table.
96+
rpc DescribeSystemView(Table.DescribeSystemViewRequest) returns (Table.DescribeSystemViewResponse);
9497
}

0 commit comments

Comments
 (0)