Browse Source

Optimize the dimensions option store to the metadata database (#12952)

* Add a flag to "cache" the latest hidden status written in the database

* rrddim hide and unhide will check "cached" state, update the database if needed and set the cache flag accordingly

* Check the dimension option and only do the database update if the cached state is different
Stelios Fragkakis 2 years ago
parent
commit
77b30d25d8
3 changed files with 26 additions and 11 deletions
  1. 19 9
      collectors/plugins.d/pluginsd_parser.c
  2. 1 0
      database/rrd.h
  3. 6 2
      database/rrddim.c

+ 19 - 9
collectors/plugins.d/pluginsd_parser.c

@@ -125,26 +125,36 @@ PARSER_RC pluginsd_dimension_action(void *user, RRDSET *st, char *id, char *name
     UNUSED(algorithm);
 
     RRDDIM *rd = rrddim_add(st, id, name, multiplier, divisor, algorithm_type);
-    rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN);
+    int unhide_dimension = 1;
+
     rrddim_flag_clear(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
     if (options && *options) {
         if (strstr(options, "obsolete") != NULL)
             rrddim_is_obsolete(st, rd);
         else
             rrddim_isnot_obsolete(st, rd);
-        if (strstr(options, "hidden") != NULL) {
-            rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN);
-            (void) sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
-        }
-        else
-            (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+
+        unhide_dimension = !strstr(options, "hidden");
+
         if (strstr(options, "noreset") != NULL)
             rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
         if (strstr(options, "nooverflow") != NULL)
             rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
-    } else {
-        (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+    } else
         rrddim_isnot_obsolete(st, rd);
+
+    if (likely(unhide_dimension)) {
+        rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN);
+        if (rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) {
+            (void)sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+            rrddim_flag_clear(rd, RRDDIM_FLAG_META_HIDDEN);
+        }
+    } else {
+        rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN);
+        if (!rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) {
+           (void)sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
+            rrddim_flag_set(rd, RRDDIM_FLAG_META_HIDDEN);
+        }
     }
     return PARSER_RC_OK;
 }

+ 1 - 0
database/rrd.h

@@ -170,6 +170,7 @@ typedef enum rrddim_flags {
     RRDDIM_FLAG_ACLK                            = (1 << 4),
 
     RRDDIM_FLAG_PENDING_FOREACH_ALARM           = (1 << 5), // set when foreach alarm has not been initialized yet
+    RRDDIM_FLAG_META_HIDDEN                     = (1 << 6), // Status of hidden option in the metadata database
 } RRDDIM_FLAGS;
 
 #define rrddim_flag_check(rd, flag) (__atomic_load_n(&((rd)->flags), __ATOMIC_SEQ_CST) & (flag))

+ 6 - 2
database/rrddim.c

@@ -472,9 +472,11 @@ int rrddim_hide(RRDSET *st, const char *id) {
         error("Cannot find dimension with id '%s' on stats '%s' (%s) on host '%s'.", id, st->name, st->id, host->hostname);
         return 1;
     }
-    (void) sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
+    if (!rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN))
+        (void)sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
 
     rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN);
+    rrddim_flag_set(rd, RRDDIM_FLAG_META_HIDDEN);
     return 0;
 }
 
@@ -487,9 +489,11 @@ int rrddim_unhide(RRDSET *st, const char *id) {
         error("Cannot find dimension with id '%s' on stats '%s' (%s) on host '%s'.", id, st->name, st->id, host->hostname);
         return 1;
     }
-    (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+    if (rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN))
+        (void)sql_set_dimension_option(&rd->state->metric_uuid, NULL);
 
     rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN);
+    rrddim_flag_clear(rd, RRDDIM_FLAG_META_HIDDEN);
     return 0;
 }