summaryrefslogtreecommitdiffstats
path: root/aclk
diff options
context:
space:
mode:
authorStelios Fragkakis <52996999+stelfrag@users.noreply.github.com>2022-05-05 11:49:44 +0300
committerGitHub <noreply@github.com>2022-05-05 11:49:44 +0300
commitd46fb8d1eca1fb40fc79423a9e6adb5638766014 (patch)
tree1357ff40564e6911e7b337e7244af3aa1c9a972c /aclk
parent51543a91d4f927bad37d18d3305daae0bf8094ff (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.c9
-rw-r--r--aclk/aclk_query_queue.h2
-rw-r--r--aclk/aclk_rx_msgs.c6
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;