@@ -21,6 +21,7 @@ use databend_common_base::headers::HEADER_QUERY_PAGE_ROWS;
21
21
use databend_common_base:: headers:: HEADER_QUERY_STATE ;
22
22
use databend_common_base:: runtime:: drop_guard;
23
23
use databend_common_base:: runtime:: execute_futures_in_parallel;
24
+ use databend_common_base:: runtime:: MemStat ;
24
25
use databend_common_base:: runtime:: ThreadTracker ;
25
26
use databend_common_config:: GlobalConfig ;
26
27
use databend_common_exception:: ErrorCode ;
@@ -416,13 +417,24 @@ pub(crate) async fn query_handler(
416
417
ctx : & HttpQueryContext ,
417
418
Json ( req) : Json < HttpQueryRequest > ,
418
419
) -> PoemResult < impl IntoResponse > {
419
- let root = get_http_tracing_span ( func_path ! ( ) , ctx, & ctx. query_id ) ;
420
- let _t = SlowRequestLogTracker :: new ( ctx) ;
421
-
422
- async {
423
- let agent_info = ctx. user_agent . as_ref ( ) . map ( |s| ( format ! ( "(from {s})" ) ) ) . unwrap_or ( "" . to_string ( ) ) ;
424
- let client_session_id_info = ctx. client_session_id . as_ref ( ) . map ( |s| ( format ! ( "(client_session_id={s})" ) ) ) . unwrap_or ( "" . to_string ( ) ) ;
425
- info ! ( "http query new request{}{}: {}" , agent_info, client_session_id_info, mask_connection_info( & format!( "{:?}" , req) ) ) ;
420
+ let query_handle = async {
421
+ let agent_info = ctx
422
+ . user_agent
423
+ . as_ref ( )
424
+ . map ( |s| format ! ( "(from {s})" ) )
425
+ . unwrap_or ( "" . to_string ( ) ) ;
426
+
427
+ let client_session_id_info = ctx
428
+ . client_session_id
429
+ . as_ref ( )
430
+ . map ( |s| format ! ( "(client_session_id={s})" ) )
431
+ . unwrap_or ( "" . to_string ( ) ) ;
432
+ info ! (
433
+ "http query new request{}{}: {}" ,
434
+ agent_info,
435
+ client_session_id_info,
436
+ mask_connection_info( & format!( "{:?}" , req) )
437
+ ) ;
426
438
let sql = req. sql . clone ( ) ;
427
439
428
440
match HttpQuery :: try_create ( ctx, req. clone ( ) ) . await {
@@ -449,10 +461,14 @@ pub(crate) async fn query_handler(
449
461
. get_response_page ( 0 )
450
462
. await
451
463
. map_err ( |err| err. display_with_sql ( & sql) )
452
- . map_err ( |err| poem:: Error :: from_string ( err. message ( ) , StatusCode :: NOT_FOUND ) ) ?;
464
+ . map_err ( |err| {
465
+ poem:: Error :: from_string ( err. message ( ) , StatusCode :: NOT_FOUND )
466
+ } ) ?;
467
+
453
468
if matches ! ( resp. state. state, ExecuteStateKind :: Failed ) {
454
469
ctx. set_fail ( ) ;
455
470
}
471
+
456
472
let ( rows, next_page) = match & resp. data {
457
473
None => ( 0 , None ) ,
458
474
Some ( p) => ( p. page . data . num_rows ( ) , p. next_page_no ) ,
@@ -464,9 +480,24 @@ pub(crate) async fn query_handler(
464
480
Ok ( QueryResponse :: from_internal ( query. id . to_string ( ) , resp, false ) . into_response ( ) )
465
481
}
466
482
}
467
- }
468
- . in_span ( root)
469
- . await
483
+ } ;
484
+
485
+ let query_handle = {
486
+ let root = get_http_tracing_span ( func_path ! ( ) , ctx, & ctx. query_id ) ;
487
+ let _t = SlowRequestLogTracker :: new ( ctx) ;
488
+ query_handle. in_span ( root)
489
+ } ;
490
+
491
+ let query_handle = {
492
+ let query_mem_stat = MemStat :: create ( format ! ( "Query-{}" , ctx. query_id) ) ;
493
+ let mut tracking_payload = ThreadTracker :: new_tracking_payload ( ) ;
494
+ tracking_payload. query_id = Some ( ctx. query_id . clone ( ) ) ;
495
+ tracking_payload. mem_stat = Some ( query_mem_stat. clone ( ) ) ;
496
+ let _tracking_guard = ThreadTracker :: tracking ( tracking_payload) ;
497
+ ThreadTracker :: tracking_future ( query_handle)
498
+ } ;
499
+
500
+ query_handle. await
470
501
}
471
502
472
503
#[ derive( Deserialize , Serialize , Debug ) ]
0 commit comments