Skip to content

Commit 53473a5

Browse files
committed
feat: remove useless optional fields in response of query_state_handler.
1 parent 16c7380 commit 53473a5

File tree

6 files changed

+437
-50
lines changed

6 files changed

+437
-50
lines changed

src/query/service/src/servers/http/middleware/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ impl<E> HTTPSessionEndpoint<E> {
447447
let sid = s.header.id.clone();
448448
session.set_client_session_id(sid.clone());
449449
login_history.session_id = sid.clone();
450-
if !s.is_new_session {
450+
if !s.is_new_session || is_worksheet {
451451
// if session enabled by client:
452452
// log for the first request of the session.
453453
// else:

src/query/service/src/servers/http/v1/http_query_handlers.rs

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -165,34 +165,6 @@ pub struct QueryResponse {
165165
}
166166

167167
impl QueryResponse {
168-
pub(crate) fn closed(query_id: &str, close_reason: CloseReason) -> impl IntoResponse {
169-
let id = query_id.to_string();
170-
let state = match close_reason {
171-
CloseReason::Finalized => ExecuteStateKind::Succeeded,
172-
_ => ExecuteStateKind::Failed,
173-
};
174-
Json(QueryResponse {
175-
id: query_id.to_string(),
176-
session_id: None,
177-
node_id: GlobalConfig::instance().query.node_id.clone(),
178-
state,
179-
session: None,
180-
error: None,
181-
warnings: vec![],
182-
has_result_set: None,
183-
schema: vec![],
184-
data: Arc::new(BlocksSerializer::empty()),
185-
affect: None,
186-
result_timeout_secs: None,
187-
stats: Default::default(),
188-
stats_uri: None,
189-
final_uri: None,
190-
next_uri: None,
191-
kill_uri: None,
192-
})
193-
.with_header(HEADER_QUERY_ID, id.clone())
194-
.with_header(HEADER_QUERY_STATE, state.to_string())
195-
}
196168
pub(crate) fn from_internal(
197169
id: String,
198170
r: HttpQueryResponseInternal,
@@ -272,6 +244,56 @@ impl QueryResponse {
272244
}
273245
}
274246

247+
#[derive(Serialize, Debug, Clone)]
248+
pub struct StateResponse {
249+
pub state: ExecuteStateKind,
250+
pub error: Option<QueryError>,
251+
pub warnings: Vec<String>,
252+
pub stats: QueryStats,
253+
}
254+
255+
impl StateResponse {
256+
pub(crate) fn from_internal(id: String, r: HttpQueryResponseInternal) -> impl IntoResponse {
257+
let state = r.state.clone();
258+
259+
if let Some(err) = &r.state.error {
260+
metrics_incr_http_response_errors_count(err.name(), err.code());
261+
}
262+
263+
let stats = QueryStats {
264+
progresses: state.progresses.clone(),
265+
running_time_ms: state.running_time_ms,
266+
};
267+
let rows = r.data.map(|d| d.page.data.num_rows()).unwrap_or_default();
268+
269+
Json(StateResponse {
270+
state: state.state,
271+
stats,
272+
warnings: r.state.warnings,
273+
error: r.state.error.map(QueryError::from_error_code),
274+
})
275+
.with_header(HEADER_QUERY_ID, id.clone())
276+
.with_header(HEADER_QUERY_STATE, state.state.to_string())
277+
.with_header(HEADER_QUERY_PAGE_ROWS, rows)
278+
}
279+
280+
pub(crate) fn closed(query_id: &str, close_reason: CloseReason) -> impl IntoResponse {
281+
let id = query_id.to_string();
282+
let state = match close_reason {
283+
CloseReason::Finalized => ExecuteStateKind::Succeeded,
284+
_ => ExecuteStateKind::Failed,
285+
};
286+
Json(StateResponse {
287+
state,
288+
error: None,
289+
warnings: vec![],
290+
stats: Default::default(),
291+
})
292+
.with_header(HEADER_QUERY_ID, id.clone())
293+
.with_header(HEADER_QUERY_STATE, state.to_string())
294+
}
295+
}
296+
275297
/// final is not ACKed by client, so client should not depend on the final response,
276298
///
277299
/// for server:
@@ -368,12 +390,12 @@ async fn query_state_handler(
368390
match http_query_manager.get_query(&query_id) {
369391
Some(query) => {
370392
if let Some(reason) = query.check_closed() {
371-
Ok(QueryResponse::closed(&query_id, reason.reason).into_response())
393+
Ok(StateResponse::closed(&query_id, reason.reason).into_response())
372394
} else {
373395
let response = query
374396
.get_response_state_only()
375397
.map_err(HttpErrorCode::server_error)?;
376-
Ok(QueryResponse::from_internal(query_id, response, false).into_response())
398+
Ok(StateResponse::from_internal(query_id, response).into_response())
377399
}
378400
}
379401
None => Err(query_id_not_found(&query_id, &ctx.node_id)),

src/query/service/src/servers/http/v1/query/http_query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,7 @@ impl HttpQuery {
937937
}
938938
ClientState::Closed(st) => {
939939
let to = match st.reason {
940-
CloseReason::Finalized => 30,
940+
CloseReason::Finalized => self.result_timeout_secs.min(30),
941941
_ => self.result_timeout_secs,
942942
};
943943
let expire_at = st.ts + Duration::from_secs(to);

src/query/service/src/servers/http/v1/query/page_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ impl PageManager {
127127
.clone())
128128
} else {
129129
let message = format!(
130-
"[HTTP-QUERY] Invalid page number: requested {}, current page is {}",
130+
"Invalid page number: requested {}, current page is {}",
131131
page_no, next_no
132132
);
133133
Err(ErrorCode::HttpNotFound(message))

src/query/service/tests/it/servers/http/http_query_handlers.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -348,16 +348,6 @@ async fn test_simple_sql() -> Result<()> {
348348
assert_eq!(result.data.len(), 10, "{:?}", result);
349349
assert_eq!(result.schema.len(), 31, "{:?}", result);
350350

351-
// get state
352-
let uri = result.stats_uri.unwrap();
353-
let (status, result) = get_uri_checked(&ep, &uri).await?;
354-
assert_eq!(status, StatusCode::OK, "{:?}", result);
355-
assert!(result.error.is_none(), "{:?}", result);
356-
assert_eq!(result.data.len(), 0, "{:?}", result);
357-
assert_eq!(result.next_uri, Some(final_uri.clone()), "{:?}", result);
358-
// assert!(result.schema.is_empty(), "{:?}", result);
359-
assert_eq!(result.state, ExecuteStateKind::Succeeded, "{:?}", result);
360-
361351
// get page, support retry
362352
let page_0_uri = make_page_uri(query_id, 0);
363353
for _ in 1..3 {
@@ -385,7 +375,7 @@ async fn test_simple_sql() -> Result<()> {
385375
let body = response.into_body().into_string().await.unwrap();
386376
assert_eq!(
387377
body,
388-
r#"{"error":{"code":404,"message":"[HTTP-QUERY] [HTTP-QUERY] Invalid page number: requested 2, current page is 1"}}"#
378+
r#"{"error":{"code":404,"message":"[HTTP-QUERY] Invalid page number: requested 2, current page is 1"}}"#
389379
);
390380

391381
// final
@@ -667,7 +657,7 @@ async fn test_pagination() -> Result<()> {
667657
let body = response.into_body().into_string().await.unwrap();
668658
assert_eq!(
669659
body,
670-
r#"{"error":{"code":404,"message":"[HTTP-QUERY] [HTTP-QUERY] Invalid page number: requested 6, current page is 1"}}"#
660+
r#"{"error":{"code":404,"message":"[HTTP-QUERY] Invalid page number: requested 6, current page is 1"}}"#
671661
);
672662

673663
let mut next_uri = result.next_uri.clone().unwrap();
@@ -679,11 +669,6 @@ async fn test_pagination() -> Result<()> {
679669
assert!(result.error.is_none(), "{:?}", msg());
680670
assert!(!result.schema.is_empty(), "{:?}", result);
681671
if page == 5 {
682-
// get state
683-
let uri = result.stats_uri.clone().unwrap();
684-
let (status, _state_result) = get_uri_checked(&ep, &uri).await?;
685-
assert_eq!(status, StatusCode::OK);
686-
687672
expect_end(&ep, result).await?;
688673
} else {
689674
assert_eq!(result.data.len(), 2, "{:?}", msg());

0 commit comments

Comments
 (0)