added debug info on left-over query targets (#13990)
Costa Tsaousis committed
Nov 14, 2022 at 02:06 UTC
f2e157e690e34413325c2781d91a894ac39552d3
4 files changed
+15
-8
database/rrdcontext.c
+1
@@ -2276,6 +2276,7 @@ typedef struct query_target_locals {
2276
static __thread QUERY_TARGET thread_query_target = {};
2277
void query_target_release(QUERY_TARGET *qt) {
2278
if(unlikely(!qt)) return;
2279
+ if(unlikely(!qt->used)) return;
2280
2281
simple_pattern_free(qt->hosts.pattern);
2282
qt->hosts.pattern = NULL;
web/api/queries/query.c
+7
-1
@@ -1963,7 +1963,13 @@ RRDR *rrd2rrdr_legacy(
1963
}
1964
1965
RRDR *rrd2rrdr(ONEWAYALLOC *owa, QUERY_TARGET *qt) {
1966
- if(!qt || !owa) return NULL;
1966
+ if(!qt)
1967
+ return NULL;
1968
+
1969
+ if(!owa) {
1970
+ query_target_release(qt);
1971
+ return NULL;
1972
+ }
1973
1974
time_t timeout = qt->request.timeout;
1975
time_t resampling_time_requested = qt->request.resampling_time;
web/api/queries/rrdr.c
+1
-6
@@ -71,14 +71,9 @@ inline void rrdr_free(ONEWAYALLOC *owa, RRDR *r) {
71
}
72
73
RRDR *rrdr_create(ONEWAYALLOC *owa, QUERY_TARGET *qt) {
74
- if(unlikely(!qt))
74
+ if(unlikely(!qt || !qt->query.used || !qt->window.points))
75
return NULL;
76
77
- if(unlikely(!qt->query.used || !qt->window.points)) {
78
- query_target_release(qt);
79
- return NULL;
80
- }
81
-
77
size_t dimensions = qt->query.used;
78
size_t points = qt->window.points;
79
web/api/web_api_v1.c
+6
-1
@@ -713,6 +713,7 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c
713
714
RRDSET *st = NULL;
715
ONEWAYALLOC *owa = onewayalloc_create(0);
716
+ QUERY_TARGET *qt = NULL;
717
718
if(!is_valid_sp(chart) && !is_valid_sp(context)) {
719
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
752
.chart_label_key = chart_label_key,
753
.charts_labels_filter = chart_labels_filter,
754
};
754
- QUERY_TARGET *qt = query_target_create(&qtr);
755
+ qt = query_target_create(&qtr);
756
757
if(!qt || !qt->query.used) {
758
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
823
buffer_strcat(w->response.data, ");");
824
825
cleanup:
826
+ if(qt && qt->used) {
827
+ internal_error(true, "QUERY_TARGET: left non-released on query '%s'", qt->id);
828
+ query_target_release(qt);
829
+ }
830
onewayalloc_destroy(owa);
831
buffer_free(dimensions);
832
return ret;