@@ -15,13 +15,10 @@ class TJsonDescribe : public TViewerPipeClient {
15
15
using TThis = TJsonDescribe;
16
16
using TBase = TViewerPipeClient;
17
17
using TBase::ReplyAndPassAway;
18
- TAutoPtr <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19
- TAutoPtr <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
18
+ TRequestResponse <TEvSchemeShard::TEvDescribeSchemeResult> SchemeShardResult;
19
+ TRequestResponse <TEvTxProxySchemeCache::TEvNavigateKeySetResult> CacheResult;
20
20
TAutoPtr<NKikimrViewer::TEvDescribeSchemeInfo> DescribeResult;
21
- TJsonSettings JsonSettings;
22
- ui32 Timeout = 0 ;
23
21
bool ExpandSubElements = true ;
24
- int Requests = 0 ;
25
22
26
23
public:
27
24
TJsonDescribe (IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
@@ -48,38 +45,33 @@ class TJsonDescribe : public TViewerPipeClient {
48
45
}
49
46
50
47
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" )) {
59
53
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 ());
63
57
} else {
64
58
THolder<TEvTxUserProxy::TEvNavigate> request = MakeHolder<TEvTxUserProxy::TEvNavigate>();
65
- FillParams (request->Record .MutableDescribePath (), params );
59
+ FillParams (request->Record .MutableDescribePath (), Params );
66
60
request->Record .SetUserToken (Event->Get ()->UserToken );
67
- SendRequest (MakeTxProxyID (), request.Release ());
61
+ SchemeShardResult = MakeRequest<TEvSchemeShard::TEvDescribeSchemeResult> (MakeTxProxyID (), request.Release ());
68
62
}
69
- ++Requests;
70
63
71
- if (params .Has (" path" )) {
64
+ if (Params .Has (" path" )) {
72
65
TAutoPtr<NSchemeCache::TSchemeCacheNavigate> request (new NSchemeCache::TSchemeCacheNavigate ());
73
66
NSchemeCache::TSchemeCacheNavigate::TEntry entry;
74
67
entry.Operation = NSchemeCache::TSchemeCacheNavigate::OpList;
75
68
entry.SyncVersion = false ;
76
- entry.Path = SplitPath (params .Get (" path" ));
69
+ entry.Path = SplitPath (Params .Get (" path" ));
77
70
request->ResultSet .emplace_back (entry);
78
- SendRequest (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
79
- ++Requests;
71
+ CacheResult = MakeRequest<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (request));
80
72
}
81
73
82
- Become (&TThis::StateRequestedDescribe, TDuration::MilliSeconds ( Timeout) , new TEvents::TEvWakeup ());
74
+ Become (&TThis::StateRequestedDescribe, Timeout, new TEvents::TEvWakeup ());
83
75
}
84
76
85
77
STATEFN (StateRequestedDescribe) {
@@ -92,27 +84,13 @@ class TJsonDescribe : public TViewerPipeClient {
92
84
}
93
85
94
86
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 ();
101
89
}
102
90
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 ();
116
94
}
117
95
118
96
void FillDescription (NKikimrSchemeOp::TDirEntry* descr, ui64 schemeShardId) {
@@ -239,10 +217,10 @@ class TJsonDescribe : public TViewerPipeClient {
239
217
}
240
218
241
219
void ReplyAndPassAway () override {
242
- TStringStream json;
243
- if (SchemeShardResult != nullptr && SchemeShardResult-> GetRecord (). GetStatus () == NKikimrScheme::EStatus::StatusSuccess ) {
220
+ NJson::TJsonValue json;
221
+ if (SchemeShardResult. IsOk () ) {
244
222
DescribeResult = GetSchemeShardDescribeSchemeInfo ();
245
- } else if (CacheResult != nullptr ) {
223
+ } else if (CacheResult. IsOk () ) {
246
224
NSchemeCache::TSchemeCacheNavigate *navigate = CacheResult->Request .Get ();
247
225
Y_ABORT_UNLESS (navigate->ResultSet .size () == 1 );
248
226
if (navigate->ErrorCount == 0 ) {
@@ -279,8 +257,7 @@ class TJsonDescribe : public TViewerPipeClient {
279
257
const auto *descriptor = NKikimrScheme::EStatus_descriptor ();
280
258
auto accessDeniedStatus = descriptor->FindValueByNumber (NKikimrScheme::StatusAccessDenied)->name ();
281
259
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" ));
284
261
return ;
285
262
}
286
263
for (auto & child : *DescribeResult->MutablePathDescription ()->MutableChildren ()) {
@@ -291,16 +268,14 @@ class TJsonDescribe : public TViewerPipeClient {
291
268
child.ClearParentPathId ();
292
269
}
293
270
}
294
- TProtoToJson::ProtoToJson (json, *DescribeResult, JsonSettings );
271
+ Proto2Json ( *DescribeResult, json );
295
272
DecodeExternalTableContent (json);
296
- } else {
297
- json << " null" ;
298
273
}
299
274
300
- ReplyAndPassAway (GetHTTPOKJSON (json. Str () ));
275
+ ReplyAndPassAway (GetHTTPOKJSON (json));
301
276
}
302
277
303
- void DecodeExternalTableContent (TStringStream & json) const {
278
+ void DecodeExternalTableContent (NJson::TJsonValue & json) const {
304
279
if (!DescribeResult) {
305
280
return ;
306
281
}
@@ -315,29 +290,21 @@ class TJsonDescribe : public TViewerPipeClient {
315
290
}
316
291
317
292
NExternalSource::IExternalSourceFactory::TPtr externalSourceFactory{NExternalSource::CreateExternalSourceFactory ({}, nullptr , 50000 , nullptr , false , false , NYql::GetAllExternalDataSourceTypes ())};
318
- NJson::TJsonValue root;
319
293
const auto & sourceType = DescribeResult->GetPathDescription ().GetExternalTableDescription ().GetSourceType ();
320
294
try {
321
- NJson::ReadJsonTree (json.Str (), &root);
322
- root[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
295
+ json[" PathDescription" ][" ExternalTableDescription" ].EraseValue (" Content" );
323
296
auto source = externalSourceFactory->GetOrCreate (sourceType);
324
297
auto parameters = source->GetParameters (content);
325
298
for (const auto & [key, items]: parameters) {
326
299
NJson::TJsonValue array{NJson::EJsonValueType::JSON_ARRAY};
327
300
for (const auto & item: items) {
328
301
array.AppendValue (item);
329
302
}
330
- root [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
303
+ json [" PathDescription" ][" ExternalTableDescription" ][" Content" ][key] = array;
331
304
}
332
305
} catch (...) {
333
306
BLOG_CRIT (" Сan't unpack content for external table: " << sourceType << " , error: " << CurrentExceptionMessage ());
334
307
}
335
- json.Clear ();
336
- json << root;
337
- }
338
-
339
- void HandleTimeout () {
340
- ReplyAndPassAway (GetHTTPGATEWAYTIMEOUT ());
341
308
}
342
309
343
310
static YAML::Node GetSwagger () {
0 commit comments