Skip to content

Commit b872b0c

Browse files
committed
review fix: send describe request straight to the SchemeShard
1 parent 2a419a8 commit b872b0c

File tree

2 files changed

+98
-92
lines changed

2 files changed

+98
-92
lines changed

ydb/core/grpc_services/rpc_describe_external_data_source.cpp

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include "rpc_scheme_base.h"
22
#include "service_table.h"
33

4-
#include <ydb/core/base/path.h>
54
#include <ydb/core/grpc_services/base/base.h>
65
#include <ydb/public/api/protos/ydb_table.pb.h>
76

87
namespace NKikimr::NGRpcService {
98

109
using namespace NActors;
10+
using namespace NYql;
1111

1212
using TEvDescribeExternalDataSourceRequest = TGrpcRequestOperationCall<
1313
Ydb::Table::DescribeExternalDataSourceRequest,
@@ -18,67 +18,69 @@ class TDescribeExternalDataSourceRPC : public TRpcSchemeRequestActor<TDescribeEx
1818
using TBase = TRpcSchemeRequestActor<TDescribeExternalDataSourceRPC, TEvDescribeExternalDataSourceRequest>;
1919

2020
public:
21-
TDescribeExternalDataSourceRPC(IRequestOpCtx* msg)
22-
: TBase(msg)
23-
{}
24-
25-
void Bootstrap(const TActorContext &ctx) {
26-
TBase::Bootstrap(ctx);
27-
28-
const auto* request = GetProtoRequest();
29-
const auto& path = request->path();
30-
const auto paths = NKikimr::SplitPath(path);
31-
if (paths.empty()) {
32-
Request_->RaiseIssue(NYql::TIssue("Invalid path"));
33-
return Reply(Ydb::StatusIds::BAD_REQUEST, ctx);
34-
}
3521

36-
auto navigate = MakeHolder<NSchemeCache::TSchemeCacheNavigate>();
37-
navigate->DatabaseName = CanonizePath(Request_->GetDatabaseName().GetOrElse(""));
38-
auto& entry = navigate->ResultSet.emplace_back();
39-
entry.Path = std::move(paths);
40-
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpTable;
41-
entry.SyncVersion = true;
22+
using TBase::TBase;
4223

43-
Send(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(navigate));
44-
Become(&TDescribeExternalDataSourceRPC::StateWork);
24+
void Bootstrap() {
25+
DescribeScheme();
4526
}
4627

4728
private:
48-
void StateWork(TAutoPtr<IEventHandle>& ev) {
29+
30+
void DescribeScheme() {
31+
auto ev = std::make_unique<TEvTxUserProxy::TEvNavigate>();
32+
SetAuthToken(ev, *Request_);
33+
SetDatabase(ev.get(), *Request_);
34+
ev->Record.MutableDescribePath()->SetPath(GetProtoRequest()->path());
35+
36+
Send(MakeTxProxyID(), ev.release());
37+
Become(&TDescribeExternalDataSourceRPC::StateDescribeScheme);
38+
}
39+
40+
STATEFN(StateDescribeScheme) {
4941
switch (ev->GetTypeRewrite()) {
50-
HFunc(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle);
51-
default: TBase::StateWork(ev);
42+
HFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, Handle);
43+
default:
44+
return TBase::StateWork(ev);
5245
}
5346
}
5447

55-
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev, const TActorContext& ctx) {
56-
const auto* navigate = ev->Get()->Request.Get();
48+
void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev, const TActorContext& ctx) {
49+
const auto& record = ev->Get()->GetRecord();
50+
const auto& pathDescription = record.GetPathDescription();
5751

58-
if (navigate->ResultSet.size() != 1) {
59-
return Reply(Ydb::StatusIds::INTERNAL_ERROR, ctx);
52+
if (record.HasReason()) {
53+
Request_->RaiseIssue(TIssue(record.GetReason()));
6054
}
61-
const auto& entry = navigate->ResultSet.front();
6255

63-
if (navigate->ErrorCount > 0) {
64-
switch (entry.Status) {
65-
case NSchemeCache::TSchemeCacheNavigate::EStatus::PathErrorUnknown:
66-
case NSchemeCache::TSchemeCacheNavigate::EStatus::RootUnknown:
56+
switch (record.GetStatus()) {
57+
case NKikimrScheme::StatusSuccess: {
58+
if (pathDescription.GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeExternalDataSource) {
59+
Request_->RaiseIssue(TIssue(
60+
TStringBuilder() << "Unexpected path type: " << pathDescription.GetSelf().GetPathType()
61+
));
62+
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
63+
}
64+
65+
return ReplyWithResult(
66+
Ydb::StatusIds::SUCCESS,
67+
Ydb::Table::DescribeExternalDataSourceResult(), // to do: convert private protobuf to public
68+
ctx
69+
);
70+
}
71+
case NKikimrScheme::StatusPathDoesNotExist:
72+
case NKikimrScheme::StatusSchemeError:
6773
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
68-
default:
74+
75+
case NKikimrScheme::StatusAccessDenied:
76+
return Reply(Ydb::StatusIds::UNAUTHORIZED, ctx);
77+
78+
case NKikimrScheme::StatusNotAvailable:
6979
return Reply(Ydb::StatusIds::UNAVAILABLE, ctx);
70-
}
71-
}
72-
if (entry.Status != NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) {
73-
// an invariant is broken: error count is equal to zero, but the status is not ok
74-
return Reply(Ydb::StatusIds::INTERNAL_ERROR, ctx);
75-
}
7680

77-
// to do: fill the entire description from the received navigation entry
78-
Ydb::Table::DescribeExternalDataSourceResult description;
79-
const auto& properties = entry.ExternalDataSourceInfo->Description.GetProperties().GetProperties();
80-
description.mutable_properties()->insert(properties.begin(), properties.end());
81-
return ReplyWithResult(Ydb::StatusIds::SUCCESS, description, ctx);
81+
default:
82+
return Reply(Ydb::StatusIds::GENERIC_ERROR, ctx);
83+
}
8284
}
8385
};
8486

ydb/core/grpc_services/rpc_describe_external_table.cpp

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include "rpc_scheme_base.h"
22
#include "service_table.h"
33

4-
#include <ydb/core/base/path.h>
54
#include <ydb/core/grpc_services/base/base.h>
65
#include <ydb/public/api/protos/ydb_table.pb.h>
76

87
namespace NKikimr::NGRpcService {
98

109
using namespace NActors;
10+
using namespace NYql;
1111

1212
using TEvDescribeExternalTableRequest = TGrpcRequestOperationCall<
1313
Ydb::Table::DescribeExternalTableRequest,
@@ -18,65 +18,69 @@ class TDescribeExternalTableRPC : public TRpcSchemeRequestActor<TDescribeExterna
1818
using TBase = TRpcSchemeRequestActor<TDescribeExternalTableRPC, TEvDescribeExternalTableRequest>;
1919

2020
public:
21-
TDescribeExternalTableRPC(IRequestOpCtx* msg)
22-
: TBase(msg)
23-
{}
24-
25-
void Bootstrap(const TActorContext &ctx) {
26-
TBase::Bootstrap(ctx);
27-
28-
const auto* request = GetProtoRequest();
29-
const auto& path = request->path();
30-
const auto paths = NKikimr::SplitPath(path);
31-
if (paths.empty()) {
32-
Request_->RaiseIssue(NYql::TIssue("Invalid path"));
33-
return Reply(Ydb::StatusIds::BAD_REQUEST, ctx);
34-
}
3521

36-
auto navigate = MakeHolder<NSchemeCache::TSchemeCacheNavigate>();
37-
navigate->DatabaseName = CanonizePath(Request_->GetDatabaseName().GetOrElse(""));
38-
auto& entry = navigate->ResultSet.emplace_back();
39-
entry.Path = std::move(paths);
40-
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpTable;
41-
entry.SyncVersion = true;
22+
using TBase::TBase;
4223

43-
Send(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(navigate));
44-
Become(&TDescribeExternalTableRPC::StateWork);
24+
void Bootstrap() {
25+
DescribeScheme();
4526
}
4627

4728
private:
48-
void StateWork(TAutoPtr<IEventHandle>& ev) {
29+
30+
void DescribeScheme() {
31+
auto ev = std::make_unique<TEvTxUserProxy::TEvNavigate>();
32+
SetAuthToken(ev, *Request_);
33+
SetDatabase(ev.get(), *Request_);
34+
ev->Record.MutableDescribePath()->SetPath(GetProtoRequest()->path());
35+
36+
Send(MakeTxProxyID(), ev.release());
37+
Become(&TDescribeExternalTableRPC::StateDescribeScheme);
38+
}
39+
40+
STATEFN(StateDescribeScheme) {
4941
switch (ev->GetTypeRewrite()) {
50-
HFunc(TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle);
51-
default: TBase::StateWork(ev);
42+
HFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, Handle);
43+
default:
44+
return TBase::StateWork(ev);
5245
}
5346
}
5447

55-
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev, const TActorContext& ctx) {
56-
const auto* navigate = ev->Get()->Request.Get();
48+
void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev, const TActorContext& ctx) {
49+
const auto& record = ev->Get()->GetRecord();
50+
const auto& pathDescription = record.GetPathDescription();
5751

58-
if (navigate->ResultSet.size() != 1) {
59-
return Reply(Ydb::StatusIds::INTERNAL_ERROR, ctx);
52+
if (record.HasReason()) {
53+
Request_->RaiseIssue(TIssue(record.GetReason()));
6054
}
61-
const auto& entry = navigate->ResultSet.front();
6255

63-
if (navigate->ErrorCount > 0) {
64-
switch (entry.Status) {
65-
case NSchemeCache::TSchemeCacheNavigate::EStatus::PathErrorUnknown:
66-
case NSchemeCache::TSchemeCacheNavigate::EStatus::RootUnknown:
56+
switch (record.GetStatus()) {
57+
case NKikimrScheme::StatusSuccess: {
58+
if (pathDescription.GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeExternalTable) {
59+
Request_->RaiseIssue(TIssue(
60+
TStringBuilder() << "Unexpected path type: " << pathDescription.GetSelf().GetPathType()
61+
));
62+
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
63+
}
64+
65+
return ReplyWithResult(
66+
Ydb::StatusIds::SUCCESS,
67+
Ydb::Table::DescribeExternalTableResult(), // to do: convert private proto to public
68+
ctx
69+
);
70+
}
71+
case NKikimrScheme::StatusPathDoesNotExist:
72+
case NKikimrScheme::StatusSchemeError:
6773
return Reply(Ydb::StatusIds::SCHEME_ERROR, ctx);
68-
default:
74+
75+
case NKikimrScheme::StatusAccessDenied:
76+
return Reply(Ydb::StatusIds::UNAUTHORIZED, ctx);
77+
78+
case NKikimrScheme::StatusNotAvailable:
6979
return Reply(Ydb::StatusIds::UNAVAILABLE, ctx);
70-
}
71-
}
72-
if (entry.Status != NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) {
73-
// an invariant is broken: error count is equal to zero, but the status is not ok
74-
return Reply(Ydb::StatusIds::INTERNAL_ERROR, ctx);
75-
}
7680

77-
// to do: fill the description from the received navigation entry
78-
Ydb::Table::DescribeExternalTableResult description;
79-
return ReplyWithResult(Ydb::StatusIds::SUCCESS, description, ctx);
81+
default:
82+
return Reply(Ydb::StatusIds::GENERIC_ERROR, ctx);
83+
}
8084
}
8185
};
8286

0 commit comments

Comments
 (0)