@@ -90,22 +90,23 @@ class TGRpcRequestProxyImpl
90
90
void Handle (TAutoPtr<TEventHandle<TEvent>>& event, const TActorContext& ctx) {
91
91
IRequestProxyCtx* requestBaseCtx = event->Get ();
92
92
if (ValidateAndReplyOnError (requestBaseCtx)) {
93
- requestBaseCtx->LegacyFinishSpan ();
93
+ requestBaseCtx->FinishSpan ();
94
94
TGRpcRequestProxyHandleMethods::Handle (event, ctx);
95
95
}
96
96
}
97
97
98
98
void Handle (TEvListEndpointsRequest::TPtr& event, const TActorContext& ctx) {
99
99
IRequestProxyCtx* requestBaseCtx = event->Get ();
100
100
if (ValidateAndReplyOnError (requestBaseCtx)) {
101
- requestBaseCtx->LegacyFinishSpan ();
101
+ requestBaseCtx->FinishSpan ();
102
102
TGRpcRequestProxy::Handle (event, ctx);
103
103
}
104
104
}
105
105
106
106
void Handle (TEvProxyRuntimeEvent::TPtr& event, const TActorContext&) {
107
107
IRequestProxyCtx* requestBaseCtx = event->Get ();
108
108
if (ValidateAndReplyOnError (requestBaseCtx)) {
109
+ requestBaseCtx->FinishSpan ();
109
110
event->Release ().Release ()->Pass (*this );
110
111
}
111
112
}
@@ -137,34 +138,32 @@ class TGRpcRequestProxyImpl
137
138
return true ;
138
139
}
139
140
140
- template < typename TEvent>
141
- void PreHandle (TAutoPtr<TEventHandle<TEvent>>& event, const TActorContext& ctx) {
141
+ template < class TEvent >
142
+ bool PreHandleImpl (TAutoPtr<TEventHandle<TEvent>>& event, const TActorContext& ctx) {
142
143
IRequestProxyCtx* requestBaseCtx = event->Get ();
143
-
144
- LogRequest (event);
145
-
146
144
if (!SchemeCache) {
147
145
const TString error = " Grpc proxy is not ready to accept request, no proxy service" ;
148
146
LOG_ERROR_S (ctx, NKikimrServices::GRPC_SERVER, error);
149
147
const auto issue = MakeIssue (NKikimrIssues::TIssuesIds::GENERIC_TXPROXY_ERROR, error);
150
148
requestBaseCtx->RaiseIssue (issue);
151
149
requestBaseCtx->ReplyWithYdbStatus (Ydb::StatusIds::UNAVAILABLE);
152
- return ;
150
+ return true ;
153
151
}
154
152
155
-
156
- MaybeStartTracing (*requestBaseCtx);
153
+ if (!IsHandlingDeferred) {
154
+ MaybeStartTracing (*requestBaseCtx);
155
+ }
157
156
158
157
if (IsAuthStateOK (*requestBaseCtx)) {
159
158
Handle (event, ctx);
160
- return ;
159
+ return false ;
161
160
}
162
161
163
162
auto state = requestBaseCtx->GetAuthState ();
164
163
165
164
if (state.State == NYdbGrpc::TAuthState::AS_FAIL) {
166
165
requestBaseCtx->ReplyUnauthenticated ();
167
- return ;
166
+ return true ;
168
167
}
169
168
170
169
if (state.State == NYdbGrpc::TAuthState::AS_UNAVAILABLE) {
@@ -173,7 +172,7 @@ class TGRpcRequestProxyImpl
173
172
const auto issue = MakeIssue (NKikimrIssues::TIssuesIds::YDB_AUTH_UNAVAILABLE, error);
174
173
requestBaseCtx->RaiseIssue (issue);
175
174
requestBaseCtx->ReplyUnavaliable ();
176
- return ;
175
+ return true ;
177
176
}
178
177
179
178
TString databaseName;
@@ -190,7 +189,7 @@ class TGRpcRequestProxyImpl
190
189
} else {
191
190
if (!AllowYdbRequestsWithoutDatabase && DynamicNode) {
192
191
requestBaseCtx->ReplyUnauthenticated (" Requests without specified database is not allowed" );
193
- return ;
192
+ return true ;
194
193
} else {
195
194
databaseName = RootDatabase;
196
195
skipResourceCheck = true ;
@@ -199,8 +198,9 @@ class TGRpcRequestProxyImpl
199
198
}
200
199
if (databaseName.empty ()) {
201
200
Counters->IncDatabaseUnavailableCounter ();
201
+ requestBaseCtx->FinishSpan ();
202
202
requestBaseCtx->ReplyUnauthenticated (" Empty database name" );
203
- return ;
203
+ return true ;
204
204
}
205
205
auto it = Databases.find (databaseName);
206
206
if (it != Databases.end () && it->second .IsDatabaseReady ()) {
@@ -214,8 +214,9 @@ class TGRpcRequestProxyImpl
214
214
const auto issue = MakeIssue (NKikimrIssues::TIssuesIds::YDB_DB_NOT_READY, error);
215
215
requestBaseCtx->RaiseIssue (issue);
216
216
requestBaseCtx->ReplyUnavaliable ();
217
+ return true ;
217
218
}
218
- return ;
219
+ return false ;
219
220
}
220
221
}
221
222
@@ -234,7 +235,7 @@ class TGRpcRequestProxyImpl
234
235
auto issue = MakeIssue (NKikimrIssues::TIssuesIds::ACCESS_DENIED, error);
235
236
requestBaseCtx->RaiseIssue (issue);
236
237
requestBaseCtx->ReplyWithYdbStatus (Ydb::StatusIds::UNAUTHORIZED);
237
- return ;
238
+ return true ;
238
239
}
239
240
}
240
241
if (domain.GetDomainState ().GetDiskQuotaExceeded ()) {
@@ -245,15 +246,15 @@ class TGRpcRequestProxyImpl
245
246
auto issue = MakeIssue (NKikimrIssues::TIssuesIds::YDB_DB_NOT_READY, " database unavailable" );
246
247
requestBaseCtx->RaiseIssue (issue);
247
248
requestBaseCtx->ReplyWithYdbStatus (Ydb::StatusIds::UNAVAILABLE);
248
- return ;
249
+ return true ;
249
250
}
250
251
251
252
if (requestBaseCtx->IsClientLost ()) {
252
253
// Any status here
253
254
LOG_DEBUG (*TlsActivationContext, NKikimrServices::GRPC_SERVER,
254
255
" Client was disconnected before processing request (grpc request proxy)" );
255
256
requestBaseCtx->ReplyWithYdbStatus (Ydb::StatusIds::UNAVAILABLE);
256
- return ;
257
+ return true ;
257
258
}
258
259
259
260
Register (CreateGrpcRequestCheckActor<TEvent>(SelfId (),
@@ -263,13 +264,23 @@ class TGRpcRequestProxyImpl
263
264
Counters,
264
265
skipCheckConnectRigths,
265
266
this ));
266
- return ;
267
+ return false ;
267
268
}
268
269
269
270
// in case we somehow skipped all auth checks
270
271
const auto issue = MakeIssue (NKikimrIssues::TIssuesIds::GENERIC_TXPROXY_ERROR, " Can't authenticate request" );
271
272
requestBaseCtx->RaiseIssue (issue);
272
273
requestBaseCtx->ReplyWithYdbStatus (Ydb::StatusIds::BAD_REQUEST);
274
+ return true ;
275
+ }
276
+
277
+ template <typename TEvent>
278
+ void PreHandle (TAutoPtr<TEventHandle<TEvent>>& event, const TActorContext& ctx) {
279
+ LogRequest (event);
280
+
281
+ if (PreHandleImpl (event, ctx)) {
282
+ event->Get ()->FinishSpan ();
283
+ }
273
284
}
274
285
275
286
void ForgetDatabase (const TString& database);
@@ -286,11 +297,14 @@ class TGRpcRequestProxyImpl
286
297
}
287
298
288
299
virtual void PassAway () override {
300
+ auto prevIsHandlingDeferred = std::exchange (IsHandlingDeferred, true );
289
301
for (auto & [_, queue] : DeferredEvents) {
290
302
for (TEventReqHolder& req : queue) {
291
303
req.Ctx ->ReplyUnavaliable ();
304
+ req.Ctx ->FinishSpan ();
292
305
}
293
306
}
307
+ IsHandlingDeferred = prevIsHandlingDeferred;
294
308
295
309
for (const auto & [_, actor] : Subscribers) {
296
310
Send (actor, new TEvents::TEvPoisonPill ());
@@ -314,6 +328,7 @@ class TGRpcRequestProxyImpl
314
328
TString RootDatabase;
315
329
IGRpcProxyCounters::TPtr Counters;
316
330
TIntrusivePtr<NJaegerTracing::TSamplingThrottlingControl> TracingControl;
331
+ bool IsHandlingDeferred = false ; // A crutch for proper tracing
317
332
};
318
333
319
334
void TGRpcRequestProxyImpl::Bootstrap (const TActorContext& ctx) {
@@ -352,6 +367,7 @@ void TGRpcRequestProxyImpl::Bootstrap(const TActorContext& ctx) {
352
367
}
353
368
354
369
void TGRpcRequestProxyImpl::ReplayEvents (const TString& databaseName, const TActorContext&) {
370
+ auto prevIsHandlingDeferred = std::exchange (IsHandlingDeferred, true );
355
371
auto itDeferredEvents = DeferredEvents.find (databaseName);
356
372
if (itDeferredEvents != DeferredEvents.end ()) {
357
373
std::deque<TEventReqHolder>& queue = itDeferredEvents->second ;
@@ -365,6 +381,7 @@ void TGRpcRequestProxyImpl::ReplayEvents(const TString& databaseName, const TAct
365
381
DeferredEvents.erase (itDeferredEvents);
366
382
}
367
383
}
384
+ IsHandlingDeferred = prevIsHandlingDeferred;
368
385
}
369
386
370
387
void TGRpcRequestProxyImpl::HandleConfig (NConsole::TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse::TPtr&) {
@@ -423,6 +440,7 @@ void TGRpcRequestProxyImpl::MaybeStartTracing(IRequestProxyCtx& ctx) {
423
440
if (auto database = ctx.GetDatabaseName ()) {
424
441
grpcRequestProxySpan.Attribute (" database" , std::move (*database));
425
442
}
443
+ grpcRequestProxySpan.Attribute (" request_type" , ctx.GetRequestName ());
426
444
ctx.StartTracing (std::move (grpcRequestProxySpan));
427
445
}
428
446
}
@@ -479,17 +497,20 @@ void TGRpcRequestProxyImpl::ForgetDatabase(const TString& database) {
479
497
Send (itSubscriber->second , new TEvents::TEvPoisonPill ());
480
498
Subscribers.erase (itSubscriber);
481
499
}
500
+ auto prevIsHandlingDeferred = std::exchange (IsHandlingDeferred, true );
482
501
auto itDeferredEvents = DeferredEvents.find (database);
483
502
if (itDeferredEvents != DeferredEvents.end ()) {
484
503
auto & queue (itDeferredEvents->second );
485
504
while (!queue.empty ()) {
486
505
Counters->IncDatabaseUnavailableCounter ();
487
506
queue.front ().Ctx ->ReplyUnauthenticated (" Unknown database" );
507
+ queue.front ().Ctx ->FinishSpan ();
488
508
queue.pop_front ();
489
509
}
490
510
DeferredEvents.erase (itDeferredEvents);
491
511
}
492
512
Databases.erase (database);
513
+ IsHandlingDeferred = prevIsHandlingDeferred;
493
514
}
494
515
495
516
void TGRpcRequestProxyImpl::SubscribeToDatabase (const TString& database) {
0 commit comments