@@ -27,7 +27,6 @@ use databend_common_base::runtime::ParentMemStat;
27
27
use databend_common_base:: runtime:: ThreadTracker ;
28
28
use databend_common_base:: runtime:: GLOBAL_MEM_STAT ;
29
29
use databend_common_config:: GlobalConfig ;
30
- use databend_common_exception:: ErrorCode ;
31
30
use databend_common_expression:: DataSchemaRef ;
32
31
use databend_common_management:: WorkloadGroupResourceManager ;
33
32
use databend_common_metrics:: http:: metrics_incr_http_response_errors_count;
@@ -56,11 +55,11 @@ use serde::Deserialize;
56
55
use serde:: Serialize ;
57
56
use uuid:: Uuid ;
58
57
58
+ use super :: query:: CloseReason ;
59
59
use super :: query:: ExecuteStateKind ;
60
60
use super :: query:: HttpQuery ;
61
61
use super :: query:: HttpQueryRequest ;
62
62
use super :: query:: HttpQueryResponseInternal ;
63
- use super :: query:: StopReason ;
64
63
use crate :: clusters:: ClusterDiscovery ;
65
64
use crate :: servers:: http:: error:: HttpErrorCode ;
66
65
use crate :: servers:: http:: error:: QueryError ;
@@ -166,10 +165,10 @@ pub struct QueryResponse {
166
165
}
167
166
168
167
impl QueryResponse {
169
- pub ( crate ) fn removed ( query_id : & str , remove_reason : StopReason ) -> impl IntoResponse {
168
+ pub ( crate ) fn removed ( query_id : & str , remove_reason : CloseReason ) -> impl IntoResponse {
170
169
let id = query_id. to_string ( ) ;
171
170
let state = match remove_reason {
172
- StopReason :: Finished => ExecuteStateKind :: Succeeded ,
171
+ CloseReason :: Finalized => ExecuteStateKind :: Succeeded ,
173
172
_ => ExecuteStateKind :: Failed ,
174
173
} ;
175
174
Json ( QueryResponse {
@@ -198,7 +197,7 @@ impl QueryResponse {
198
197
id : String ,
199
198
r : HttpQueryResponseInternal ,
200
199
is_final : bool ,
201
- ) -> ( impl IntoResponse , bool ) {
200
+ ) -> impl IntoResponse {
202
201
let state = r. state . clone ( ) ;
203
202
let ( data, next_uri) = if is_final {
204
203
( Arc :: new ( BlocksSerializer :: empty ( ) ) , None )
@@ -248,12 +247,7 @@ impl QueryResponse {
248
247
} ;
249
248
let rows = data. num_rows ( ) ;
250
249
251
- let next_is_final = next_uri
252
- . as_ref ( )
253
- . map ( |u| u. ends_with ( "final" ) )
254
- . unwrap_or ( false ) ;
255
-
256
- let resp = Json ( QueryResponse {
250
+ Json ( QueryResponse {
257
251
data,
258
252
state : state. state ,
259
253
schema : state. schema . clone ( ) ,
@@ -274,8 +268,7 @@ impl QueryResponse {
274
268
} )
275
269
. with_header ( HEADER_QUERY_ID , id. clone ( ) )
276
270
. with_header ( HEADER_QUERY_STATE , state. state . to_string ( ) )
277
- . with_header ( HEADER_QUERY_PAGE_ROWS , rows) ;
278
- ( resp, next_is_final)
271
+ . with_header ( HEADER_QUERY_PAGE_ROWS , rows)
279
272
}
280
273
}
281
274
@@ -305,12 +298,7 @@ async fn query_final_handler(
305
298
) ;
306
299
let http_query_manager = HttpQueryManager :: instance ( ) ;
307
300
match http_query_manager
308
- . stop_query (
309
- & query_id,
310
- & ctx. client_session_id ,
311
- StopReason :: Finished ,
312
- ErrorCode :: ClosedQuery ( "Query closed by client" ) ,
313
- )
301
+ . close_query ( & query_id, & ctx. client_session_id , CloseReason :: Finalized )
314
302
. await ?
315
303
{
316
304
Some ( query) => {
@@ -320,7 +308,7 @@ async fn query_final_handler(
320
308
// it is safe to set these 2 fields to None, because client now check for null/None first.
321
309
response. session = None ;
322
310
response. state . affect = None ;
323
- Ok ( QueryResponse :: from_internal ( query_id, response, true ) . 0 )
311
+ Ok ( QueryResponse :: from_internal ( query_id, response, true ) )
324
312
}
325
313
None => Err ( query_id_not_found ( & query_id, & ctx. node_id ) ) ,
326
314
}
@@ -346,12 +334,7 @@ async fn query_cancel_handler(
346
334
) ;
347
335
let http_query_manager = HttpQueryManager :: instance ( ) ;
348
336
match http_query_manager
349
- . stop_query (
350
- & query_id,
351
- & ctx. client_session_id ,
352
- StopReason :: Canceled ,
353
- ErrorCode :: AbortedQuery ( "canceled by client" ) ,
354
- )
337
+ . close_query ( & query_id, & ctx. client_session_id , CloseReason :: Canceled )
355
338
. await ?
356
339
{
357
340
Some ( _) => Ok ( StatusCode :: OK ) ,
@@ -374,15 +357,13 @@ async fn query_state_handler(
374
357
let http_query_manager = HttpQueryManager :: instance ( ) ;
375
358
match http_query_manager. get_query ( & query_id) {
376
359
Some ( query) => {
377
- if let Some ( reason) = query. check_removed ( ) {
378
- Ok ( QueryResponse :: removed ( & query_id, reason) . into_response ( ) )
360
+ if let Some ( reason) = query. check_closed ( ) {
361
+ Ok ( QueryResponse :: removed ( & query_id, reason. reason ) . into_response ( ) )
379
362
} else {
380
363
let response = query
381
364
. get_response_state_only ( )
382
365
. map_err ( HttpErrorCode :: server_error) ?;
383
- Ok ( QueryResponse :: from_internal ( query_id, response, false )
384
- . 0
385
- . into_response ( ) )
366
+ Ok ( QueryResponse :: from_internal ( query_id, response, false ) . into_response ( ) )
386
367
}
387
368
}
388
369
None => Err ( query_id_not_found ( & query_id, & ctx. node_id ) ) ,
@@ -423,18 +404,16 @@ async fn query_page_handler(
423
404
}
424
405
425
406
query. check_client_session_id ( & ctx. client_session_id ) ?;
426
- if let Some ( reason) = query. check_removed ( ) {
427
- log:: info!(
428
- "[HTTP-QUERY] /query/{}/page/{} - query is removed (reason: {})" ,
429
- query_id,
430
- page_no,
431
- reason
407
+ if let Some ( st) = query. check_closed ( ) {
408
+ info ! (
409
+ "[HTTP-QUERY] /query/{}/page/{} - query is close (reason: {:?})" ,
410
+ query_id, page_no, st
432
411
) ;
433
- Err ( query_id_removed ( & query_id, reason) )
412
+ Err ( query_id_removed ( & query_id, st . reason ) )
434
413
} else {
435
- query. update_expire_time ( true ) . await ;
414
+ query. update_expire_time ( true , false ) . await ;
436
415
let resp = query. get_response_page ( page_no) . await . map_err ( |err| {
437
- log :: info!(
416
+ info ! (
438
417
"[HTTP-QUERY] /query/{}/page/{} - get response page error (reason: {})" ,
439
418
query_id,
440
419
page_no,
@@ -445,12 +424,10 @@ async fn query_page_handler(
445
424
StatusCode :: NOT_FOUND ,
446
425
)
447
426
} ) ?;
448
- query. update_expire_time ( false ) . await ;
449
- let ( resp, next_is_final) = QueryResponse :: from_internal ( query_id, resp, false ) ;
450
- if next_is_final {
451
- query. set_data_drained ( )
452
- }
453
- Ok ( resp)
427
+ query
428
+ . update_expire_time ( false , resp. is_data_drained ( ) )
429
+ . await ;
430
+ Ok ( QueryResponse :: from_internal ( query_id, resp, false ) )
454
431
}
455
432
}
456
433
} ;
@@ -519,7 +496,6 @@ pub(crate) async fn query_handler(
519
496
let http_query_manager = HttpQueryManager :: instance ( ) ;
520
497
let query = http_query_manager. add_query ( query) . await ;
521
498
522
- // tmp workaround to tolerant old clients
523
499
let resp = query
524
500
. get_response_page ( 0 )
525
501
. await
@@ -542,13 +518,10 @@ pub(crate) async fn query_handler(
542
518
info ! ( "[HTTP-QUERY] Initial response for query_id={}, state={:?}, rows={}, next_page={:?}, sql='{}'" ,
543
519
& query. id, & resp. state, rows, next_page, mask_connection_info( & sql)
544
520
) ;
545
- query. update_expire_time ( false ) . await ;
546
- let ( resp, next_is_final) =
547
- QueryResponse :: from_internal ( query. id . to_string ( ) , resp, false ) ;
548
- if next_is_final {
549
- query. set_data_drained ( )
550
- }
551
- Ok ( resp. into_response ( ) )
521
+ query
522
+ . update_expire_time ( false , resp. is_data_drained ( ) )
523
+ . await ;
524
+ Ok ( QueryResponse :: from_internal ( query. id . to_string ( ) , resp, false ) . into_response ( ) )
552
525
}
553
526
}
554
527
} ;
@@ -838,7 +811,7 @@ pub fn query_route() -> Route {
838
811
route
839
812
}
840
813
841
- fn query_id_removed ( query_id : & str , remove_reason : StopReason ) -> PoemError {
814
+ fn query_id_removed ( query_id : & str , remove_reason : CloseReason ) -> PoemError {
842
815
PoemError :: from_string (
843
816
format ! ( "[HTTP-QUERY] Query ID {query_id} {}" , remove_reason) ,
844
817
StatusCode :: BAD_REQUEST ,
0 commit comments