Browse Source

Fix the context filtering on the data query endpoint (#10652)

Stelios Fragkakis 4 years ago
parent
commit
b76a297de1
4 changed files with 32 additions and 3 deletions
  1. 26 1
      web/api/formatters/rrd2json.c
  2. 1 0
      web/api/formatters/rrd2json.h
  3. 3 0
      web/api/queries/query.c
  4. 2 2
      web/api/queries/rrdr.c

+ 26 - 1
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)

+ 1 - 0
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 */

+ 3 - 0
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;

+ 2 - 2
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;