diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2022-11-14 02:06:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-14 02:06:51 +0200 |
commit | f2e157e690e34413325c2781d91a894ac39552d3 (patch) | |
tree | 73db30066490830efb0fe78ff9432877e276cc84 | |
parent | cbebc18ca3e52ec5ab41272ef85a5fd45d8d3b10 (diff) |
added debug info on left-over query targets (#13990)
-rw-r--r-- | database/rrdcontext.c | 1 | ||||
-rw-r--r-- | web/api/queries/query.c | 8 | ||||
-rw-r--r-- | web/api/queries/rrdr.c | 7 | ||||
-rw-r--r-- | web/api/web_api_v1.c | 7 |
4 files changed, 15 insertions, 8 deletions
diff --git a/database/rrdcontext.c b/database/rrdcontext.c index d39585cdc4..4e3751e92b 100644 --- a/database/rrdcontext.c +++ b/database/rrdcontext.c @@ -2276,6 +2276,7 @@ typedef struct query_target_locals { static __thread QUERY_TARGET thread_query_target = {}; void query_target_release(QUERY_TARGET *qt) { if(unlikely(!qt)) return; + if(unlikely(!qt->used)) return; simple_pattern_free(qt->hosts.pattern); qt->hosts.pattern = NULL; diff --git a/web/api/queries/query.c b/web/api/queries/query.c index 5c3008c2c9..b6a27755bf 100644 --- a/web/api/queries/query.c +++ b/web/api/queries/query.c @@ -1963,7 +1963,13 @@ RRDR *rrd2rrdr_legacy( } RRDR *rrd2rrdr(ONEWAYALLOC *owa, QUERY_TARGET *qt) { - if(!qt || !owa) return NULL; + if(!qt) + return NULL; + + if(!owa) { + query_target_release(qt); + return NULL; + } time_t timeout = qt->request.timeout; time_t resampling_time_requested = qt->request.resampling_time; diff --git a/web/api/queries/rrdr.c b/web/api/queries/rrdr.c index 50cd9bd5f8..676224c9d8 100644 --- a/web/api/queries/rrdr.c +++ b/web/api/queries/rrdr.c @@ -71,14 +71,9 @@ inline void rrdr_free(ONEWAYALLOC *owa, RRDR *r) { } RRDR *rrdr_create(ONEWAYALLOC *owa, QUERY_TARGET *qt) { - if(unlikely(!qt)) + if(unlikely(!qt || !qt->query.used || !qt->window.points)) return NULL; - if(unlikely(!qt->query.used || !qt->window.points)) { - query_target_release(qt); - return NULL; - } - size_t dimensions = qt->query.used; size_t points = qt->window.points; diff --git a/web/api/web_api_v1.c b/web/api/web_api_v1.c index 2e5aa984c3..e8ca176a9d 100644 --- a/web/api/web_api_v1.c +++ b/web/api/web_api_v1.c @@ -713,6 +713,7 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c RRDSET *st = NULL; ONEWAYALLOC *owa = onewayalloc_create(0); + QUERY_TARGET *qt = NULL; if(!is_valid_sp(chart) && !is_valid_sp(context)) { buffer_sprintf(w->response.data, "No chart or context is given."); @@ -751,7 +752,7 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c .chart_label_key = chart_label_key, .charts_labels_filter = chart_labels_filter, }; - QUERY_TARGET *qt = query_target_create(&qtr); + qt = query_target_create(&qtr); if(!qt || !qt->query.used) { buffer_sprintf(w->response.data, "No metrics where matched to query."); @@ -822,6 +823,10 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c buffer_strcat(w->response.data, ");"); cleanup: + if(qt && qt->used) { + internal_error(true, "QUERY_TARGET: left non-released on query '%s'", qt->id); + query_target_release(qt); + } onewayalloc_destroy(owa); buffer_free(dimensions); return ret; |