Browse Source

Find the chart and dimension UUID from the context (#13868)

* Add functions to find chart uuid and dimension UUIDs from context

* Remove old functions that access the sqlite database directly

* Use new functions to fetch the UUIDs for chart and dimensions

* Remove unused function
Stelios Fragkakis 2 years ago
parent
commit
9e89ac7307

+ 57 - 0
database/rrdcontext.c

@@ -1486,6 +1486,63 @@ void rrdcontext_host_child_connected(RRDHOST *host) {
     ;
 }
 
+int rrdcontext_find_dimension_uuid(RRDSET *st, const char *id, uuid_t *store_uuid) {
+    if(!st->rrdhost) return 1;
+    if(!st->context) return 2;
+
+    RRDCONTEXT_ACQUIRED *rca = (RRDCONTEXT_ACQUIRED *)dictionary_get_and_acquire_item((DICTIONARY *)st->rrdhost->rrdctx, string2str(st->context));
+    if(!rca) return 3;
+
+    RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
+
+    RRDINSTANCE_ACQUIRED *ria = (RRDINSTANCE_ACQUIRED *)dictionary_get_and_acquire_item(rc->rrdinstances, string2str(st->id));
+    if(!ria) {
+        rrdcontext_release(rca);
+        return 4;
+    }
+
+    RRDINSTANCE *ri = rrdinstance_acquired_value(ria);
+
+    RRDMETRIC_ACQUIRED *rma = (RRDMETRIC_ACQUIRED *)dictionary_get_and_acquire_item(ri->rrdmetrics, id);
+    if(!rma) {
+        rrdinstance_release(ria);
+        rrdcontext_release(rca);
+        return 5;
+    }
+
+    RRDMETRIC *rm = rrdmetric_acquired_value(rma);
+
+    uuid_copy(*store_uuid, rm->uuid);
+
+    rrdmetric_release(rma);
+    rrdinstance_release(ria);
+    rrdcontext_release(rca);
+    return 0;
+}
+
+int rrdcontext_find_chart_uuid(RRDSET *st, uuid_t *store_uuid) {
+    if(!st->rrdhost) return 1;
+    if(!st->context) return 2;
+
+    RRDCONTEXT_ACQUIRED *rca = (RRDCONTEXT_ACQUIRED *)dictionary_get_and_acquire_item((DICTIONARY *)st->rrdhost->rrdctx, string2str(st->context));
+    if(!rca) return 3;
+
+    RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
+
+    RRDINSTANCE_ACQUIRED *ria = (RRDINSTANCE_ACQUIRED *)dictionary_get_and_acquire_item(rc->rrdinstances, string2str(st->id));
+    if(!ria) {
+        rrdcontext_release(rca);
+        return 4;
+    }
+
+    RRDINSTANCE *ri = rrdinstance_acquired_value(ria);
+    uuid_copy(*store_uuid, ri->uuid);
+
+    rrdinstance_release(ria);
+    rrdcontext_release(rca);
+    return 0;
+}
+
 void rrdcontext_host_child_disconnected(RRDHOST *host) {
     rrdcontext_recalculate_host_retention(host, RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD, false);
 }

+ 2 - 0
database/rrdcontext.h

@@ -78,6 +78,7 @@ void rrdcontext_updated_rrddim_multiplier(RRDDIM *rd);
 void rrdcontext_updated_rrddim_divisor(RRDDIM *rd);
 void rrdcontext_updated_rrddim_flags(RRDDIM *rd);
 void rrdcontext_collected_rrddim(RRDDIM *rd);
+int rrdcontext_find_dimension_uuid(RRDSET *st, const char *id, uuid_t *store_uuid);
 
 // ----------------------------------------------------------------------------
 // public API for rrdsets
@@ -87,6 +88,7 @@ void rrdcontext_removed_rrdset(RRDSET *st);
 void rrdcontext_updated_rrdset_name(RRDSET *st);
 void rrdcontext_updated_rrdset_flags(RRDSET *st);
 void rrdcontext_collected_rrdset(RRDSET *st);
+int rrdcontext_find_chart_uuid(RRDSET *st, uuid_t *store_uuid);
 
 // ----------------------------------------------------------------------------
 // public API for ACLK

+ 1 - 1
database/rrddim.c

@@ -82,7 +82,7 @@ static void rrddim_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, v
 
     rd->rrd_memory_mode = ctr->memory_mode;
 
-    if (unlikely(find_dimension_uuid(st, rd, &(rd->metric_uuid)))) {
+    if (unlikely(rrdcontext_find_dimension_uuid(st, rrddim_id(rd), &(rd->metric_uuid)))) {
         uuid_generate(rd->metric_uuid);
     }
 

+ 1 - 1
database/rrdset.c

@@ -367,7 +367,7 @@ static void rrdset_react_callback(const DICTIONARY_ITEM *item __maybe_unused, vo
 
     if(ctr->react_action & (RRDSET_REACT_NEW | RRDSET_REACT_PLUGIN_UPDATED | RRDSET_REACT_MODULE_UPDATED)) {
         if (ctr->react_action & RRDSET_REACT_NEW) {
-            if (find_chart_uuid(host, string2str(st->parts.type), string2str(st->parts.id), &st->chart_uuid)) {
+            if(unlikely(rrdcontext_find_chart_uuid(st,  &st->chart_uuid))) {
                 uuid_generate(st->chart_uuid);
             }
         }

+ 0 - 106
database/sqlite/sqlite_functions.c

@@ -474,112 +474,6 @@ void sql_close_database(void)
         error_report("Error %d while closing the SQLite database, %s", rc, sqlite3_errstr(rc));
 }
 
-
-// Expect a UUID in column 0
-// Return 0 and store in store_uuid
-// Return 1 if it fails (store_uuid is left unchanged)
-static int expect_uuid_column0(sqlite3_stmt *res, uuid_t *store_uuid)
-{
-    int rc = sqlite3_step_monitored(res);
-    if (likely(rc == SQLITE_ROW)) {
-        uuid_copy(*store_uuid, *((uuid_t *)sqlite3_column_blob(res, 0)));
-        return 0;
-    }
-    return 1;
-}
-
-
-// Do a database lookup to find the uuid of a dimension
-//  Return 0 if uuid is found and store it in *store_uuid
-//         1 if no uuid is found (needs to be created)
-//
-
-#define SQL_FIND_DIMENSION_UUID \
-    "SELECT dim_id FROM dimension WHERE chart_id=@chart AND id=@id AND name=@name AND LENGTH(dim_id)=16;"
-int find_dimension_uuid(RRDSET *st, RRDDIM *rd, uuid_t *store_uuid)
-{
-    static __thread sqlite3_stmt *res = NULL;
-    int rc;
-    int status = 1;
-
-    if (unlikely(!db_meta) && default_rrd_memory_mode != RRD_MEMORY_MODE_DBENGINE)
-        return 1;
-
-    if (unlikely(!res)) {
-        rc = prepare_statement(db_meta, SQL_FIND_DIMENSION_UUID, &res);
-        if (rc != SQLITE_OK) {
-            error_report("Failed to prepare statement to lookup dimension UUID in the database");
-            return 1;
-        }
-    }
-
-    rc = sqlite3_bind_blob(res, 1, &st->chart_uuid, sizeof(st->chart_uuid), SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    rc = sqlite3_bind_text(res, 2, rrddim_id(rd), -1, SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    rc = sqlite3_bind_text(res, 3, rrddim_name(rd), -1, SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    status = expect_uuid_column0(res, store_uuid);
-
-skip:
-    rc = sqlite3_reset(res);
-    if (unlikely(rc != SQLITE_OK))
-        error_report("Failed to reset statement find dimension uuid, rc = %d", rc);
-    return status;
-}
-
-
-/*
- * Do a database lookup to find the UUID of a chart
- *
- */
-
-#define SQL_FIND_CHART_UUID "SELECT chart_id FROM chart WHERE host_id = @host AND type=@type AND id=@id AND chart_id IS NOT NULL;"
-
-int find_chart_uuid(RRDHOST *host, const char *type, const char *id, uuid_t *store_uuid)
-{
-    static __thread sqlite3_stmt *res = NULL;
-    int rc;
-    int status = 1;
-
-    if (unlikely(!db_meta) && default_rrd_memory_mode != RRD_MEMORY_MODE_DBENGINE)
-        return 1;
-
-    if (unlikely(!res)) {
-        rc = prepare_statement(db_meta, SQL_FIND_CHART_UUID, &res);
-        if (rc != SQLITE_OK) {
-            error_report("Failed to prepare statement to lookup chart UUID in the database");
-            return 1;
-        }
-    }
-
-    rc = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    rc = sqlite3_bind_text(res, 2, type, -1, SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    rc = sqlite3_bind_text(res, 3, id, -1, SQLITE_STATIC);
-    if (unlikely(rc != SQLITE_OK))
-        goto skip;
-
-    status = expect_uuid_column0(res, store_uuid);
-
-skip:
-    rc = sqlite3_reset(res);
-    if (unlikely(rc != SQLITE_OK))
-        error_report("Failed to reset statement when searching for a chart UUID, rc = %d", rc);
-    return status;
-}
-
 int exec_statement_with_uuid(const char *sql, uuid_t *uuid)
 {
     int rc, result = 1;

+ 0 - 2
database/sqlite/sqlite_functions.h

@@ -60,8 +60,6 @@ void add_migrated_file(char *path, uint64_t file_size);
 void db_execute(const char *cmd);
 
 // Look up functions
-int find_dimension_uuid(RRDSET *st, RRDDIM *rd, uuid_t *store_uuid);
-int find_chart_uuid(RRDHOST *host, const char *type, const char *id, uuid_t *store_uuid);
 int get_node_id(uuid_t *host_id, uuid_t *node_id);
 int get_host_id(uuid_t *node_id, uuid_t *host_id);
 struct node_instance_list *get_node_list(void);