Skip to content

Commit 8a25ba3

Browse files
committed
refactor describe handler
1 parent 95387e2 commit 8a25ba3

File tree

2 files changed

+35
-63
lines changed

2 files changed

+35
-63
lines changed

Diff for: ydb/core/viewer/json_pipe_req.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ void TViewerPipeClient::InitConfig(const TCgiParameters& params) {
896896
}
897897
if (!FromStringWithDefault<bool>(params.Get("ui64"), false)) {
898898
Proto2JsonConfig.StringifyNumbers = TProto2JsonConfig::EStringifyNumbersMode::StringifyInt64Always;
899+
Proto2JsonConfig.StringifyNumbersRepeated = TProto2JsonConfig::EStringifyNumbersMode::StringifyInt64Always;
899900
}
900901
Proto2JsonConfig.MapAsObject = true;
901902
Proto2JsonConfig.ConvertAny = true;

Diff for: ydb/core/viewer/viewer_describe.h

+34-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)
@@ -51,38 +48,36 @@ class TJsonDescribe : public TViewerPipeClient {
5148
if (NeedToRedirect()) {
5249
return;
5350
}
54-
const auto& params(Event->Get()->Request.GetParams());
55-
JsonSettings.EnumAsNumbers = !FromStringWithDefault<bool>(params.Get("enums"), false);
56-
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), false);
57-
Timeout = FromStringWithDefault<ui32>(params.Get("timeout"), 10000);
58-
ExpandSubElements = FromStringWithDefault<ui32>(params.Get("subs"), ExpandSubElements);
59-
InitConfig(params);
60-
61-
if (params.Has("schemeshard_id")) {
51+
// for describe we keep old behavior where enums is false by default - for compatibility reasons
52+
if (FromStringWithDefault<bool>(Params.Get("enums"), false)) {
53+
Proto2JsonConfig.EnumMode = TProto2JsonConfig::EnumValueMode::EnumName;
54+
} else {
55+
Proto2JsonConfig.EnumMode = TProto2JsonConfig::EnumValueMode::EnumNumber;
56+
}
57+
ExpandSubElements = FromStringWithDefault<ui32>(Params.Get("subs"), ExpandSubElements);
58+
if (Params.Has("schemeshard_id")) {
6259
THolder<TEvSchemeShard::TEvDescribeScheme> request = MakeHolder<TEvSchemeShard::TEvDescribeScheme>();
63-
FillParams(&request->Record, params);
64-
ui64 schemeShardId = FromStringWithDefault<ui64>(params.Get("schemeshard_id"));
65-
SendRequestToPipe(ConnectTabletPipe(schemeShardId), request.Release());
60+
FillParams(&request->Record, Params);
61+
ui64 schemeShardId = FromStringWithDefault<ui64>(Params.Get("schemeshard_id"));
62+
SchemeShardResult = MakeRequestToTablet<TEvSchemeShard::TEvDescribeSchemeResult>(schemeShardId, request.Release());
6663
} else {
6764
THolder<TEvTxUserProxy::TEvNavigate> request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
68-
FillParams(request->Record.MutableDescribePath(), params);
65+
FillParams(request->Record.MutableDescribePath(), Params);
6966
request->Record.SetUserToken(Event->Get()->UserToken);
70-
SendRequest(MakeTxProxyID(), request.Release());
67+
SchemeShardResult = MakeRequest<TEvSchemeShard::TEvDescribeSchemeResult>(MakeTxProxyID(), request.Release());
7168
}
72-
++Requests;
7369

74-
if (params.Has("path")) {
70+
if (Params.Has("path")) {
7571
TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request(new NSchemeCache::TSchemeCacheNavigate());
7672
NSchemeCache::TSchemeCacheNavigate::TEntry entry;
7773
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpList;
7874
entry.SyncVersion = false;
79-
entry.Path = SplitPath(params.Get("path"));
75+
entry.Path = SplitPath(Params.Get("path"));
8076
request->ResultSet.emplace_back(entry);
81-
SendRequest(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
82-
++Requests;
77+
CacheResult = MakeRequest<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(MakeSchemeCacheID(), new TEvTxProxySchemeCache::TEvNavigateKeySet(request));
8378
}
8479

85-
Become(&TThis::StateRequestedDescribe, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup());
80+
Become(&TThis::StateRequestedDescribe, Timeout, new TEvents::TEvWakeup());
8681
}
8782

8883
STATEFN(StateRequestedDescribe) {
@@ -95,27 +90,13 @@ class TJsonDescribe : public TViewerPipeClient {
9590
}
9691

9792
void Handle(TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev) {
98-
SchemeShardResult = ev->Release();
99-
if (SchemeShardResult->GetRecord().GetStatus() == NKikimrScheme::EStatus::StatusSuccess) {
100-
ReplyAndPassAway();
101-
} else {
102-
RequestDone("TEvDescribeSchemeResult");
103-
}
93+
SchemeShardResult.Set(std::move(ev));
94+
RequestDone();
10495
}
10596

106-
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr &ev) {
107-
CacheResult = ev->Release();
108-
RequestDone("TEvNavigateKeySetResult");
109-
}
110-
111-
void RequestDone(const char* name) {
112-
--Requests;
113-
if (Requests == 0) {
114-
ReplyAndPassAway();
115-
}
116-
if (Requests < 0) {
117-
BLOG_CRIT("Requests < 0 in RequestDone(" << name << ")");
118-
}
97+
void Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
98+
CacheResult.Set(std::move(ev));
99+
RequestDone();
119100
}
120101

121102
void FillDescription(NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) {
@@ -242,10 +223,10 @@ class TJsonDescribe : public TViewerPipeClient {
242223
}
243224

244225
void ReplyAndPassAway() override {
245-
TStringStream json;
246-
if (SchemeShardResult != nullptr && SchemeShardResult->GetRecord().GetStatus() == NKikimrScheme::EStatus::StatusSuccess) {
226+
NJson::TJsonValue json;
227+
if (SchemeShardResult.IsOk()) {
247228
DescribeResult = GetSchemeShardDescribeSchemeInfo();
248-
} else if (CacheResult != nullptr) {
229+
} else if (CacheResult.IsOk()) {
249230
NSchemeCache::TSchemeCacheNavigate *navigate = CacheResult->Request.Get();
250231
Y_ABORT_UNLESS(navigate->ResultSet.size() == 1);
251232
if (navigate->ErrorCount == 0) {
@@ -282,8 +263,7 @@ class TJsonDescribe : public TViewerPipeClient {
282263
const auto *descriptor = NKikimrScheme::EStatus_descriptor();
283264
auto accessDeniedStatus = descriptor->FindValueByNumber(NKikimrScheme::StatusAccessDenied)->name();
284265
if (DescribeResult->GetStatus() == accessDeniedStatus) {
285-
Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPFORBIDDEN(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
286-
PassAway();
266+
ReplyAndPassAway(GetHTTPFORBIDDEN("text/plain", "Forbidden"));
287267
return;
288268
}
289269
for (auto& child : *DescribeResult->MutablePathDescription()->MutableChildren()) {
@@ -294,16 +274,14 @@ class TJsonDescribe : public TViewerPipeClient {
294274
child.ClearParentPathId();
295275
}
296276
}
297-
TProtoToJson::ProtoToJson(json, *DescribeResult, JsonSettings);
277+
Proto2Json(*DescribeResult, json);
298278
DecodeExternalTableContent(json);
299-
} else {
300-
json << "null";
301279
}
302280

303-
ReplyAndPassAway(GetHTTPOKJSON(json.Str()));
281+
ReplyAndPassAway(GetHTTPOKJSON(json));
304282
}
305283

306-
void DecodeExternalTableContent(TStringStream& json) const {
284+
void DecodeExternalTableContent(NJson::TJsonValue& json) const {
307285
if (!DescribeResult) {
308286
return;
309287
}
@@ -318,29 +296,21 @@ class TJsonDescribe : public TViewerPipeClient {
318296
}
319297

320298
NExternalSource::IExternalSourceFactory::TPtr externalSourceFactory{NExternalSource::CreateExternalSourceFactory({}, nullptr, 50000, nullptr, false, false, NYql::GetAllExternalDataSourceTypes())};
321-
NJson::TJsonValue root;
322299
const auto& sourceType = DescribeResult->GetPathDescription().GetExternalTableDescription().GetSourceType();
323300
try {
324-
NJson::ReadJsonTree(json.Str(), &root);
325-
root["PathDescription"]["ExternalTableDescription"].EraseValue("Content");
301+
json["PathDescription"]["ExternalTableDescription"].EraseValue("Content");
326302
auto source = externalSourceFactory->GetOrCreate(sourceType);
327303
auto parameters = source->GetParameters(content);
328304
for (const auto& [key, items]: parameters) {
329305
NJson::TJsonValue array{NJson::EJsonValueType::JSON_ARRAY};
330306
for (const auto& item: items) {
331307
array.AppendValue(item);
332308
}
333-
root["PathDescription"]["ExternalTableDescription"]["Content"][key] = array;
309+
json["PathDescription"]["ExternalTableDescription"]["Content"][key] = array;
334310
}
335311
} catch (...) {
336312
BLOG_CRIT("Сan't unpack content for external table: " << sourceType << ", error: " << CurrentExceptionMessage());
337313
}
338-
json.Clear();
339-
json << root;
340-
}
341-
342-
void HandleTimeout() {
343-
ReplyAndPassAway(GetHTTPGATEWAYTIMEOUT());
344314
}
345315

346316
static YAML::Node GetSwagger() {
@@ -369,6 +339,7 @@ class TJsonDescribe : public TViewerPipeClient {
369339
.Name = "enums",
370340
.Description = "convert enums to strings",
371341
.Type = "boolean",
342+
.Default = "false",
372343
});
373344
yaml.AddParameter({
374345
.Name = "ui64",

0 commit comments

Comments
 (0)