Skip to content

Commit ad27921

Browse files
authored
Merge ed48895 into d257768
2 parents d257768 + ed48895 commit ad27921

File tree

1 file changed

+30
-63
lines changed

1 file changed

+30
-63
lines changed

ydb/core/viewer/viewer_describe.h

+30-63
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@ class TJsonDescribe : public TViewerPipeClient {
1515
using TThis = TJsonDescribe;
1616
using TBase = TViewerPipeClient;
1717
using TBase::ReplyAndPassAway;
18-
TAutoPtr<TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19-
TAutoPtr<TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
18+
TRequestResponse<TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19+
TRequestResponse<TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
2020
TAutoPtr<NKikimrViewer::TEvDescribeSchemeInfo> DescribeResult;
21-
TJsonSettings JsonSettings;
22-
ui32 Timeout = 0;
2321
bool ExpandSubElements = true;
24-
int Requests = 0;
2522

2623
public:
2724
TJsonDescribe(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
@@ -48,38 +45,33 @@ class TJsonDescribe : public TViewerPipeClient {
4845
}
4946

5047
void Bootstrap() override {
51-
const auto& params(Event->Get()->Request.GetParams());
52-
JsonSettings.EnumAsNumbers = !FromStringWithDefault<bool>(params.Get("enums"), false);
53-
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), false);
54-
Timeout = FromStringWithDefault<ui32>(params.Get("timeout"), 10000);
55-
ExpandSubElements = FromStringWithDefault<ui32>(params.Get("subs"), ExpandSubElements);
56-
InitConfig(params);
57-
58-
if (params.Has("schemeshard_id")) {
48+
if (NeedToRedirect()) {
49+
return;
50+
}
51+
ExpandSubElements = FromStringWithDefault<ui32>(Params.Get("subs"), ExpandSubElements);
52+
if (Params.Has("schemeshard_id")) {
5953
THolder<TEvSchemeShard::TEvDescribeScheme> request = MakeHolder<TEvSchemeShard::TEvDescribeScheme>();
60-
FillParams(&request->Record, params);
61-
ui64 schemeShardId = FromStringWithDefault<ui64>(params.Get("schemeshard_id"));
62-
SendRequestToPipe(ConnectTabletPipe(schemeShardId), request.Release());
54+
FillParams(&request->Record, Params);
55+
ui64 schemeShardId = FromStringWithDefault<ui64>(Params.Get("schemeshard_id"));
56+
SchemeShardResult = MakeRequestToTablet<TEvSchemeShard::TEvDescribeSchemeResult>(schemeShardId, request.Release());
6357
} else {
6458
THolder<TEvTxUserProxy::TEvNavigate> request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
65-
FillParams(request->Record.MutableDescribePath(), params);
59+
FillParams(request->Record.MutableDescribePath(), Params);
6660
request->Record.SetUserToken(Event->Get()->UserToken);
67-
SendRequest(MakeTxProxyID(), request.Release());
61+
SchemeShardResult = MakeRequest<TEvSchemeShard::TEvDescribeSchemeResult>(MakeTxProxyID(), request.Release());
6862
}
69-
++Requests;
7063

71-
if (params.Has("path")) {
64+
if (Params.Has("path")) {
7265
TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request(new NSchemeCache::TSchemeCacheNavigate());
7366
NSchemeCache::TSchemeCacheNavigate::TEntry entry;
7467
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpList;
7568
entry.SyncVersion = false;
76-
entry.Path = SplitPath(params.Get("path"));
69+
entry.Path = SplitPath(Params.Get("path"));
7770
request->ResultSet.emplace_back(entry);
78-
SendRequest(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
79-
++Requests;
71+
CacheResult = MakeRequest<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
8072
}
8173

82-
Become(&TThis::StateRequestedDescribe, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup());
74+
Become(&TThis::StateRequestedDescribe, Timeout, new TEvents::TEvWakeup());
8375
}
8476

8577
STATEFN(StateRequestedDescribe) {
@@ -92,27 +84,13 @@ class TJsonDescribe : public TViewerPipeClient {
9284
}
9385

9486
void Handle(TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev) {
95-
SchemeShardResult = ev->Release();
96-
if (SchemeShardResult->GetRecord().GetStatus() == NKikimrScheme::EStatus::StatusSuccess) {
97-
ReplyAndPassAway();
98-
} else {
99-
RequestDone("TEvDescribeSchemeResult");
100-
}
87+
SchemeShardResult.Set(std::move(ev));
88+
RequestDone();
10189
}
10290

103-
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev) {
104-
CacheResult = ev->Release();
105-
RequestDone("TEvNavigateKeySetResult");
106-
}
107-
108-
void RequestDone(const char* name) {
109-
--Requests;
110-
if (Requests == 0) {
111-
ReplyAndPassAway();
112-
}
113-
if (Requests < 0) {
114-
BLOG_CRIT("Requests < 0 in RequestDone(" << name << ")");
115-
}
91+
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
92+
CacheResult.Set(std::move(ev));
93+
RequestDone();
11694
}
11795

11896
void FillDescription(NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) {
@@ -239,10 +217,10 @@ class TJsonDescribe : public TViewerPipeClient {
239217
}
240218

241219
void ReplyAndPassAway() override {
242-
TStringStream json;
243-
if (SchemeShardResult != nullptr && SchemeShardResult->GetRecord().GetStatus() == NKikimrScheme::EStatus::StatusSuccess) {
220+
NJson::TJsonValue json;
221+
if (SchemeShardResult.IsOk()) {
244222
DescribeResult = GetSchemeShardDescribeSchemeInfo();
245-
} else if (CacheResult != nullptr) {
223+
} else if (CacheResult.IsOk()) {
246224
NSchemeCache::TSchemeCacheNavigate *navigate = CacheResult->Request.Get();
247225
Y_ABORT_UNLESS(navigate->ResultSet.size() == 1);
248226
if (navigate->ErrorCount == 0) {
@@ -279,8 +257,7 @@ class TJsonDescribe : public TViewerPipeClient {
279257
const auto *descriptor = NKikimrScheme::EStatus_descriptor();
280258
auto accessDeniedStatus = descriptor->FindValueByNumber(NKikimrScheme::StatusAccessDenied)->name();
281259
if (DescribeResult->GetStatus() == accessDeniedStatus) {
282-
Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPFORBIDDEN(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
283-
PassAway();
260+
ReplyAndPassAway(GetHTTPFORBIDDEN("text/plain", "Forbidden"));
284261
return;
285262
}
286263
for (auto& child : *DescribeResult->MutablePathDescription()->MutableChildren()) {
@@ -291,16 +268,14 @@ class TJsonDescribe : public TViewerPipeClient {
291268
child.ClearParentPathId();
292269
}
293270
}
294-
TProtoToJson::ProtoToJson(json, *DescribeResult, JsonSettings);
271+
Proto2Json(*DescribeResult, json);
295272
DecodeExternalTableContent(json);
296-
} else {
297-
json << "null";
298273
}
299274

300-
ReplyAndPassAway(GetHTTPOKJSON(json.Str()));
275+
ReplyAndPassAway(GetHTTPOKJSON(json));
301276
}
302277

303-
void DecodeExternalTableContent(TStringStream& json) const {
278+
void DecodeExternalTableContent(NJson::TJsonValue& json) const {
304279
if (!DescribeResult) {
305280
return;
306281
}
@@ -315,29 +290,21 @@ class TJsonDescribe : public TViewerPipeClient {
315290
}
316291

317292
NExternalSource::IExternalSourceFactory::TPtr externalSourceFactory{NExternalSource::CreateExternalSourceFactory({}, nullptr, 50000, nullptr, false, false, NYql::GetAllExternalDataSourceTypes())};
318-
NJson::TJsonValue root;
319293
const auto& sourceType = DescribeResult->GetPathDescription().GetExternalTableDescription().GetSourceType();
320294
try {
321-
NJson::ReadJsonTree(json.Str(), &root);
322-
root["PathDescription"]["ExternalTableDescription"].EraseValue("Content");
295+
json["PathDescription"]["ExternalTableDescription"].EraseValue("Content");
323296
auto source = externalSourceFactory->GetOrCreate(sourceType);
324297
auto parameters = source->GetParameters(content);
325298
for (const auto& [key, items]: parameters) {
326299
NJson::TJsonValue array{NJson::EJsonValueType::JSON_ARRAY};
327300
for (const auto& item: items) {
328301
array.AppendValue(item);
329302
}
330-
root["PathDescription"]["ExternalTableDescription"]["Content"][key] = array;
303+
json["PathDescription"]["ExternalTableDescription"]["Content"][key] = array;
331304
}
332305
} catch (...) {
333306
BLOG_CRIT("Сan't unpack content for external table: " << sourceType << ", error: " << CurrentExceptionMessage());
334307
}
335-
json.Clear();
336-
json << root;
337-
}
338-
339-
void HandleTimeout() {
340-
ReplyAndPassAway(GetHTTPGATEWAYTIMEOUT());
341308
}
342309

343310
static YAML::Node GetSwagger() {

0 commit comments

Comments
 (0)