summaryrefslogtreecommitdiffstats
path: root/database
diff options
context:
space:
mode:
authorStelios Fragkakis <52996999+stelfrag@users.noreply.github.com>2022-10-26 12:19:57 +0300
committerGitHub <noreply@github.com>2022-10-26 12:19:57 +0300
commit9e89ac73077e269df5662b2b56cb39843a03d4fa (patch)
tree09649b7d62cb9515ee666850e44cf6123464c029 /database
parentb1bc23db0d2f0a2402dcb57aaedebfdc768223a5 (diff)
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
Diffstat (limited to 'database')
-rw-r--r--database/rrdcontext.c57
-rw-r--r--database/rrdcontext.h2
-rw-r--r--database/rrddim.c2
-rw-r--r--database/rrdset.c2
-rw-r--r--database/sqlite/sqlite_functions.c106
-rw-r--r--database/sqlite/sqlite_functions.h2
6 files changed, 61 insertions, 110 deletions
diff --git a/database/rrdcontext.c b/database/rrdcontext.c
index b003efd7d1..b71a7a387d 100644
--- a/database/rrdcontext.c
+++ b/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);
}
diff --git a/database/rrdcontext.h b/database/rrdcontext.h
index 51a53b2ab5..6ddfa2e602 100644
--- a/database/rrdcontext.h
+++ b/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
diff --git a/database/rrddim.c b/database/rrddim.c
index 0b9fa24384..e304d1eba2 100644
--- a/database/rrddim.c
+++ b/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);
}
diff --git a/database/rrdset.c b/database/rrdset.c
index 9b25517b96..a071860def 100644
--- a/database/rrdset.c
+++ b/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);
}
}
diff --git a/database/sqlite/sqlite_functions.c b/database/sqlite/sqlite_functions.c
index 7cb64d094a..b42a1e3ded 100644
--- a/database/sqlite/sqlite_functions.c
+++ b/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;
diff --git a/database/sqlite/sqlite_functions.h b/database/sqlite/sqlite_functions.h
index 10207a1e47..86d1357a79 100644
--- a/database/sqlite/sqlite_functions.h
+++ b/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);