summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorStelios Fragkakis <52996999+stelfrag@users.noreply.github.com>2021-02-17 21:13:38 +0200
committerGitHub <noreply@github.com>2021-02-17 21:13:38 +0200
commitb76a297de1a89dfe9a72e68c7c2513bd350f5455 (patch)
tree5ccc8778243014f2e76b79bf3ff1d7c983283419 /web
parent7c793fe25217081ccdb54444dff7bdd157056764 (diff)
Fix the context filtering on the data query endpoint (#10652)
Diffstat (limited to 'web')
-rw-r--r--web/api/formatters/rrd2json.c27
-rw-r--r--web/api/formatters/rrd2json.h1
-rw-r--r--web/api/queries/query.c3
-rw-r--r--web/api/queries/rrdr.c4
4 files changed, 32 insertions, 3 deletions
diff --git a/web/api/formatters/rrd2json.c b/web/api/formatters/rrd2json.c
index 9168f76eb1..d8e2480663 100644
--- a/web/api/formatters/rrd2json.c
+++ b/web/api/formatters/rrd2json.c
@@ -32,6 +32,30 @@ void free_context_param_list(struct context_param **param_list)
*param_list = NULL;
}
+void rebuild_context_param_list(struct context_param *context_param_list, time_t after_requested)
+{
+ RRDDIM *temp_rd = context_param_list->rd;
+ RRDDIM *new_rd_list = NULL, *t;
+ while (temp_rd) {
+ t = temp_rd->next;
+ if (rrdset_last_entry_t(temp_rd->rrdset) >= after_requested) {
+ temp_rd->next = new_rd_list;
+ new_rd_list = temp_rd;
+ } else {
+ freez((char *)temp_rd->id);
+ freez((char *)temp_rd->name);
+#ifdef ENABLE_DBENGINE
+ if (temp_rd->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE)
+ freez(temp_rd->state->metric_uuid);
+#endif
+ freez(temp_rd->state);
+ freez(temp_rd);
+ }
+ temp_rd = t;
+ }
+ context_param_list->rd = new_rd_list;
+};
+
void build_context_param_list(struct context_param **param_list, RRDSET *st)
{
if (unlikely(!param_list || !st))
@@ -193,7 +217,6 @@ int rrdset2anything_api_v1(
time_t last_accessed_time = now_realtime_sec();
st->last_accessed_time = last_accessed_time;
- RRDDIM *temp_rd = context_param_list ? context_param_list->rd : NULL;
RRDR *r = rrd2rrdr(st, points, after, before, group_method, group_time, options, dimensions?buffer_tostring(dimensions):NULL, context_param_list);
if(!r) {
@@ -201,6 +224,8 @@ int rrdset2anything_api_v1(
return HTTP_RESP_INTERNAL_SERVER_ERROR;
}
+ RRDDIM *temp_rd = context_param_list ? context_param_list->rd : NULL;
+
if(r->result_options & RRDR_RESULT_OPTION_RELATIVE)
buffer_no_cacheable(wb);
else if(r->result_options & RRDR_RESULT_OPTION_ABSOLUTE)
diff --git a/web/api/formatters/rrd2json.h b/web/api/formatters/rrd2json.h
index 1f929c4943..3dc5989735 100644
--- a/web/api/formatters/rrd2json.h
+++ b/web/api/formatters/rrd2json.h
@@ -86,6 +86,7 @@ extern int rrdset2value_api_v1(
);
extern void build_context_param_list(struct context_param **param_list, RRDSET *st);
+extern void rebuild_context_param_list(struct context_param *context_param_list, time_t after_requested);
extern void free_context_param_list(struct context_param **param_list);
#endif /* NETDATA_RRD2JSON_H */
diff --git a/web/api/queries/query.c b/web/api/queries/query.c
index 3b9077cd68..663e4bd143 100644
--- a/web/api/queries/query.c
+++ b/web/api/queries/query.c
@@ -1591,6 +1591,9 @@ RRDR *rrd2rrdr(
if (first_entry_t > after_requested)
first_entry_t = after_requested;
+ if (context_param_list)
+ rebuild_context_param_list(context_param_list, after_requested);
+
#ifdef ENABLE_DBENGINE
if (st->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) {
struct rrdeng_region_info *region_info_array;
diff --git a/web/api/queries/rrdr.c b/web/api/queries/rrdr.c
index 6cd0c0b142..ef237fa026 100644
--- a/web/api/queries/rrdr.c
+++ b/web/api/queries/rrdr.c
@@ -130,8 +130,8 @@ RRDR *rrdr_create(struct rrdset *st, long n, struct context_param *context_param
// set the hidden flag on hidden dimensions
int c;
- for(c = 0, rd = temp_rd?temp_rd:st->dimensions ; rd ; c++, rd = rd->next) {
- if(unlikely(rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)))
+ for (c = 0, rd = temp_rd ? temp_rd : st->dimensions; rd; c++, rd = rd->next) {
+ if (unlikely(rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)))
r->od[c] = RRDR_DIMENSION_HIDDEN;
else
r->od[c] = RRDR_DIMENSION_DEFAULT;