diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2022-05-05 11:49:44 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-05 11:49:44 +0300 |
commit | d46fb8d1eca1fb40fc79423a9e6adb5638766014 (patch) | |
tree | 1357ff40564e6911e7b337e7244af3aa1c9a972c /aclk | |
parent | 51543a91d4f927bad37d18d3305daae0bf8094ff (diff) |
Accept a data query timeout parameter from the cloud (#12823)
* Add the ability to parse a "timeout" parameter in the incoming command
* Cancel the incoming query if already in the queue for too long
Diffstat (limited to 'aclk')
-rw-r--r-- | aclk/aclk_query.c | 9 | ||||
-rw-r--r-- | aclk/aclk_query_queue.h | 2 | ||||
-rw-r--r-- | aclk/aclk_rx_msgs.c | 6 |
3 files changed, 16 insertions, 1 deletions
diff --git a/aclk/aclk_query.c b/aclk/aclk_query.c index d66d781dbb..058f6596a6 100644 --- a/aclk/aclk_query.c +++ b/aclk/aclk_query.c @@ -111,6 +111,15 @@ static int http_api_v2(struct aclk_query_thread *query_thr, aclk_query_t query) w->tv_in = query->created_tv; now_realtime_timeval(&w->tv_ready); + if (query->timeout && (dt_usec(&query->created_tv, &w->tv_ready) / 1000.0) > query->timeout) { + log_access("QUERY CANCELED: QUEUE TIME EXCEEDED %0.2f ms (LIMIT %d ms)", + dt_usec(&query->created_tv, &w->tv_ready) / 1000.0, query->timeout); + retval = 1; + w->response.code = HTTP_RESP_BACKEND_FETCH_FAILED; + aclk_http_msg_v2_err(query_thr->client, query->callback_topic, query->msg_id, w->response.code, CLOUD_EC_SND_TIMEOUT, CLOUD_EMSG_SND_TIMEOUT, NULL, 0); + goto cleanup; + } + RRDHOST *temp_host = NULL; if (!strncmp(query->data.http_api_v2.query, NODE_ID_QUERY, strlen(NODE_ID_QUERY))) { char *node_uuid = query->data.http_api_v2.query + strlen(NODE_ID_QUERY); diff --git a/aclk/aclk_query_queue.h b/aclk/aclk_query_queue.h index 88976f9ebb..fbc39aee93 100644 --- a/aclk/aclk_query_queue.h +++ b/aclk/aclk_query_queue.h @@ -67,7 +67,7 @@ struct aclk_query { struct timeval created_tv; usec_t created; - + int timeout; aclk_query_t next; // TODO maybe remove? diff --git a/aclk/aclk_rx_msgs.c b/aclk/aclk_rx_msgs.c index 1f2cb27ef3..00310749bd 100644 --- a/aclk/aclk_rx_msgs.c +++ b/aclk/aclk_rx_msgs.c @@ -17,6 +17,7 @@ struct aclk_request { char *callback_topic; char *payload; int version; + int timeout; int min_version; int max_version; }; @@ -57,6 +58,10 @@ static int cloud_to_agent_parse(JSON_ENTRY *e) data->version = e->data.number; break; } + if (!strcmp(e->name, "timeout")) { + data->timeout = e->data.number; + break; + } if (!strcmp(e->name, "min-version")) { data->min_version = e->data.number; break; @@ -160,6 +165,7 @@ static int aclk_handle_cloud_http_request_v2(struct aclk_request *cloud_to_agent // aclk_queue_query takes ownership of data pointer query->callback_topic = cloud_to_agent->callback_topic; + query->timeout = cloud_to_agent->timeout; // for clarity and code readability as when we process the request // it would be strange to get URL from `dedup_id` query->data.http_api_v2.query = query->dedup_id; |