@@ -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:: ThreadTracker ;
24
25
use databend_common_config:: GlobalConfig ;
25
26
use databend_common_exception:: ErrorCode ;
26
27
use databend_common_expression:: DataSchemaRef ;
@@ -51,6 +52,7 @@ use serde::Deserialize;
51
52
use serde:: Serialize ;
52
53
53
54
use super :: query:: ExecuteStateKind ;
55
+ use super :: query:: HttpQuery ;
54
56
use super :: query:: HttpQueryRequest ;
55
57
use super :: query:: HttpQueryResponseInternal ;
56
58
use super :: query:: RemoveReason ;
@@ -354,39 +356,58 @@ async fn query_page_handler(
354
356
Path ( ( query_id, page_no) ) : Path < ( String , usize ) > ,
355
357
) -> PoemResult < impl IntoResponse > {
356
358
ctx. check_node_id ( & query_id) ?;
357
- let root = get_http_tracing_span ( func_path ! ( ) , ctx, & query_id) ;
358
- let _t = SlowRequestLogTracker :: new ( ctx) ;
359
+ // tracing in middleware
359
360
360
- async {
361
- let http_query_manager = HttpQueryManager :: instance ( ) ;
362
- match http_query_manager. get_query ( & query_id) {
363
- Some ( query) => {
364
- if query. user_name != ctx. user_name {
365
- return Err ( poem:: error:: Error :: from_string (
366
- format ! (
367
- "wrong user, query {} expect {}, got {}" ,
368
- query_id, query. user_name, ctx. user_name
369
- ) ,
370
- StatusCode :: UNAUTHORIZED ,
371
- ) ) ;
372
- }
373
- query. check_client_session_id ( & ctx. client_session_id ) ?;
374
- if let Some ( reason) = query. check_removed ( ) {
375
- Err ( query_id_removed ( & query_id, reason) )
376
- } else {
377
- query. update_expire_time ( true ) . await ;
378
- let resp = query. get_response_page ( page_no) . await . map_err ( |err| {
379
- poem:: Error :: from_string ( err. message ( ) , StatusCode :: NOT_FOUND )
380
- } ) ?;
381
- query. update_expire_time ( false ) . await ;
382
- Ok ( QueryResponse :: from_internal ( query_id, resp, false ) )
383
- }
361
+ let http_query_manager = HttpQueryManager :: instance ( ) ;
362
+
363
+ let Some ( query) = http_query_manager. get_query ( & query_id) else {
364
+ return Err ( query_id_not_found ( & query_id, & ctx. node_id ) ) ;
365
+ } ;
366
+
367
+ let query_mem_stat = query. query_mem_stat . clone ( ) ;
368
+
369
+ let query_page_handle = {
370
+ let query_id = query_id. clone ( ) ;
371
+ async move {
372
+ if query. user_name != ctx. user_name {
373
+ return Err ( poem:: error:: Error :: from_string (
374
+ format ! (
375
+ "wrong user, query {} expect {}, got {}" ,
376
+ query_id, query. user_name, ctx. user_name
377
+ ) ,
378
+ StatusCode :: UNAUTHORIZED ,
379
+ ) ) ;
380
+ }
381
+
382
+ query. check_client_session_id ( & ctx. client_session_id ) ?;
383
+ if let Some ( reason) = query. check_removed ( ) {
384
+ Err ( query_id_removed ( & query_id, reason) )
385
+ } else {
386
+ query. update_expire_time ( true ) . await ;
387
+ let resp = query. get_response_page ( page_no) . await . map_err ( |err| {
388
+ poem:: Error :: from_string ( err. message ( ) , StatusCode :: NOT_FOUND )
389
+ } ) ?;
390
+ query. update_expire_time ( false ) . await ;
391
+ Ok ( QueryResponse :: from_internal ( query_id, resp, false ) )
384
392
}
385
- None => Err ( query_id_not_found ( & query_id, & ctx. node_id ) ) ,
386
393
}
387
- }
388
- . in_span ( root)
389
- . await
394
+ } ;
395
+
396
+ let query_page_handle = {
397
+ let root = get_http_tracing_span ( func_path ! ( ) , ctx, & query_id) ;
398
+ let _t = SlowRequestLogTracker :: new ( ctx) ;
399
+ query_page_handle. in_span ( root)
400
+ } ;
401
+
402
+ let query_page_handle = {
403
+ let mut tracking_payload = ThreadTracker :: new_tracking_payload ( ) ;
404
+ tracking_payload. mem_stat = query_mem_stat;
405
+ tracking_payload. query_id = Some ( query_id. clone ( ) ) ;
406
+ let _tracking_guard = ThreadTracker :: tracking ( tracking_payload) ;
407
+ ThreadTracker :: tracking_future ( query_page_handle)
408
+ } ;
409
+
410
+ query_page_handle. await
390
411
}
391
412
392
413
#[ poem:: handler]
@@ -399,18 +420,29 @@ pub(crate) async fn query_handler(
399
420
let _t = SlowRequestLogTracker :: new ( ctx) ;
400
421
401
422
async {
402
- let agent_info = ctx. user_agent . as_ref ( ) . map ( |s|( format ! ( "(from {s})" ) ) ) . unwrap_or ( "" . to_string ( ) ) ;
403
- let client_session_id_info = ctx. client_session_id . as_ref ( ) . map ( |s|( format ! ( "(client_session_id={s})" ) ) ) . unwrap_or ( "" . to_string ( ) ) ;
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 ( ) ) ;
404
425
info ! ( "http query new request{}{}: {}" , agent_info, client_session_id_info, mask_connection_info( & format!( "{:?}" , req) ) ) ;
405
- let http_query_manager = HttpQueryManager :: instance ( ) ;
406
426
let sql = req. sql . clone ( ) ;
407
427
408
- let query = http_query_manager
409
- . try_create_query ( ctx, req. clone ( ) )
410
- . await
411
- . map_err ( |err| err. display_with_sql ( & sql) ) ;
412
- match query {
413
- Ok ( query) => {
428
+ match HttpQuery :: try_create ( ctx, req. clone ( ) ) . await {
429
+ Err ( err) => {
430
+ let err = err. display_with_sql ( & sql) ;
431
+ error ! ( "http query fail to start sql, error: {:?}" , err) ;
432
+ ctx. set_fail ( ) ;
433
+ Ok ( req. fail_to_start_sql ( err) . into_response ( ) )
434
+ }
435
+ Ok ( mut query) => {
436
+ if let Err ( err) = query. start_query ( sql. clone ( ) ) . await {
437
+ let err = err. display_with_sql ( & sql) ;
438
+ error ! ( "http query fail to start sql, error: {:?}" , err) ;
439
+ ctx. set_fail ( ) ;
440
+ return Ok ( req. fail_to_start_sql ( err) . into_response ( ) ) ;
441
+ }
442
+
443
+ let http_query_manager = HttpQueryManager :: instance ( ) ;
444
+ let query = http_query_manager. add_query ( query) . await ;
445
+
414
446
query. update_expire_time ( true ) . await ;
415
447
// tmp workaround to tolerant old clients
416
448
let resp = query
@@ -431,11 +463,6 @@ pub(crate) async fn query_handler(
431
463
query. update_expire_time ( false ) . await ;
432
464
Ok ( QueryResponse :: from_internal ( query. id . to_string ( ) , resp, false ) . into_response ( ) )
433
465
}
434
- Err ( e) => {
435
- error ! ( "http query fail to start sql, error: {:?}" , e) ;
436
- ctx. set_fail ( ) ;
437
- Ok ( req. fail_to_start_sql ( e) . into_response ( ) )
438
- }
439
466
}
440
467
}
441
468
. in_span ( root)
0 commit comments