diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2021-11-09 21:25:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-09 21:25:04 +0200 |
commit | a2852377d09811a18772f63de116c5b8068f2b59 (patch) | |
tree | 14c97d4a1826a754138f5b5ab272a789ca16f3cf /database | |
parent | f44dd56681bf6ece4129735b74d4b2baab729aab (diff) |
Store and submit dimension delete messages for new cloud architecture (#11765)
* Enhance the dimension delete table and adjust the trigger to include chart_id and host_id
* Add the aclk_process_dimension_deletion function
* Change variable chart_name in aclk_upd_dimension_event (it is st->id from st.type dot st.id)
* Process dimension deletion when retention updates are sent
* Do not send charts if we don't have dimensions
* Add check for uuid_parse return code
Diffstat (limited to 'database')
-rw-r--r-- | database/rrdset.c | 2 | ||||
-rw-r--r-- | database/sqlite/sqlite_aclk.c | 11 | ||||
-rw-r--r-- | database/sqlite/sqlite_aclk_chart.c | 73 | ||||
-rw-r--r-- | database/sqlite/sqlite_aclk_chart.h | 1 |
4 files changed, 82 insertions, 5 deletions
diff --git a/database/rrdset.c b/database/rrdset.c index 46a3d1fdb2..75696d8f85 100644 --- a/database/rrdset.c +++ b/database/rrdset.c @@ -1392,7 +1392,7 @@ void rrdset_done(RRDSET *st) { #ifdef ENABLE_ACLK if (unlikely(!rrdset_flag_check(st, RRDSET_FLAG_ACLK))) { - if (st->counter_done >= RRDSET_MINIMUM_LIVE_COUNT) { + if (st->counter_done >= RRDSET_MINIMUM_LIVE_COUNT && st->dimensions) { if (likely(!queue_chart_to_aclk(st))) rrdset_flag_set(st, RRDSET_FLAG_ACLK); } diff --git a/database/sqlite/sqlite_aclk.c b/database/sqlite/sqlite_aclk.c index 20c7017ec4..dedba6159d 100644 --- a/database/sqlite/sqlite_aclk.c +++ b/database/sqlite/sqlite_aclk.c @@ -11,6 +11,15 @@ #endif const char *aclk_sync_config[] = { + "CREATE TABLE IF NOT EXISTS dimension_delete (dimension_id blob, dimension_name text, chart_type_id text, " + "dim_id blob, chart_id blob, host_id blob, date_created);", + + "CREATE INDEX IF NOT EXISTS ind_h1 ON dimension_delete (host_id);", + + "CREATE TRIGGER IF NOT EXISTS tr_dim_del AFTER DELETE ON dimension BEGIN INSERT INTO dimension_delete " + "(dimension_id, dimension_name, chart_type_id, dim_id, chart_id, host_id, date_created)" + " select old.id, old.name, c.type||\".\"||c.id, old.dim_id, old.chart_id, c.host_id, strftime('%s') FROM" + " chart c WHERE c.chart_id = old.chart_id; END;", NULL, }; @@ -446,10 +455,12 @@ void aclk_database_worker(void *arg) #ifdef ENABLE_NEW_CLOUD_PROTOCOL case ACLK_DATABASE_DIM_DELETION: debug(D_ACLK_SYNC,"Sending dimension deletion information %s", wc->uuid_str); + aclk_process_dimension_deletion(wc, cmd); break; case ACLK_DATABASE_UPD_RETENTION: debug(D_ACLK_SYNC,"Sending retention info for %s", wc->uuid_str); aclk_update_retention(wc, cmd); + aclk_process_dimension_deletion(wc, cmd); break; #endif diff --git a/database/sqlite/sqlite_aclk_chart.c b/database/sqlite/sqlite_aclk_chart.c index cc1cb028d9..21d6c52d3f 100644 --- a/database/sqlite/sqlite_aclk_chart.c +++ b/database/sqlite/sqlite_aclk_chart.c @@ -170,24 +170,28 @@ int aclk_add_chart_event(struct aclk_database_worker_config *wc, struct aclk_dat } static inline int aclk_upd_dimension_event(struct aclk_database_worker_config *wc, char *claim_id, uuid_t *dim_uuid, - const char *dim_id, const char *dim_name, const char *chart_name, time_t first_time, time_t last_time) + const char *dim_id, const char *dim_name, const char *chart_type_id, time_t first_time, time_t last_time) { int rc = 0; size_t size; - if (unlikely(!dim_uuid || !dim_id || !dim_name || !chart_name)) + if (unlikely(!dim_uuid || !dim_id || !dim_name || !chart_type_id)) return 0; struct chart_dimension_updated dim_payload; memset(&dim_payload, 0, sizeof(dim_payload)); +#ifdef NETDATA_INTERNAL_CHECKS if (!first_time) - info("DEBUG: Deleting dimension [%s] [%s] [%s] [%s] [%s]", wc->node_id, claim_id, dim_id, dim_name, chart_name); + info("Host %s (node %s) deleting dimension id=[%s] name=[%s] chart=[%s]", + wc->host_guid, wc->node_id, dim_id, dim_name, chart_type_id); +#endif + dim_payload.node_id = wc->node_id; dim_payload.claim_id = claim_id; dim_payload.name = dim_name; dim_payload.id = dim_id; - dim_payload.chart_id = chart_name; + dim_payload.chart_id = chart_type_id; dim_payload.created_at.tv_sec = first_time; dim_payload.last_timestamp.tv_sec = last_time; char *payload = generate_chart_dimension_updated(&size, &dim_payload); @@ -197,6 +201,67 @@ static inline int aclk_upd_dimension_event(struct aclk_database_worker_config *w return rc; } +void aclk_process_dimension_deletion(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd) +{ + int rc = 0; + sqlite3_stmt *res = NULL; + + if (!aclk_use_new_cloud_arch || !aclk_connected) + return; + + if (unlikely(!db_meta)) + return; + + uuid_t host_id; + if (uuid_parse(wc->host_guid, host_id)) + return; + + char *claim_id = is_agent_claimed(); + if (!claim_id) + return; + + rc = sqlite3_prepare_v2(db_meta, "DELETE FROM dimension_delete where host_id = @host_id " \ + "RETURNING dimension_id, dimension_name, chart_type_id, dim_id LIMIT 10;", -1, &res, 0); + + if (rc != SQLITE_OK) { + error_report("Failed to prepare statement when trying to delete dimension deletes"); + freez(claim_id); + return; + } + + rc = sqlite3_bind_blob(res, 1, &host_id , sizeof(host_id), SQLITE_STATIC); + if (unlikely(rc != SQLITE_OK)) + goto bind_fail; + + unsigned count = 0; + while (sqlite3_step(res) == SQLITE_ROW) { + (void) aclk_upd_dimension_event( + wc, + claim_id, + (uuid_t *)sqlite3_column_text(res, 3), + (const char *)sqlite3_column_text(res, 0), + (const char *)sqlite3_column_text(res, 1), + (const char *)sqlite3_column_text(res, 2), + 0, + 0); + count++; + } + + if (count) { + memset(&cmd, 0, sizeof(cmd)); + cmd.opcode = ACLK_DATABASE_DIM_DELETION; + if (aclk_database_enq_cmd_noblock(wc, &cmd)) + info("Failed to queue a dimension deletion message"); + } + +bind_fail: + rc = sqlite3_finalize(res); + if (unlikely(rc != SQLITE_OK)) + error_report("Failed to finalize statement when adding dimension deletion events, rc = %d", rc); + freez(claim_id); + return; +} + int aclk_add_dimension_event(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd) { int rc = 0; diff --git a/database/sqlite/sqlite_aclk_chart.h b/database/sqlite/sqlite_aclk_chart.h index dfdaae4265..cd545f70d4 100644 --- a/database/sqlite/sqlite_aclk_chart.h +++ b/database/sqlite/sqlite_aclk_chart.h @@ -32,5 +32,6 @@ void sql_check_rotation_state(struct aclk_database_worker_config *wc, struct acl void sql_get_last_chart_sequence(struct aclk_database_worker_config *wc); void aclk_receive_chart_reset(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd); void aclk_receive_chart_ack(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd); +void aclk_process_dimension_deletion(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd); uint32_t sql_get_pending_count(struct aclk_database_worker_config *wc); #endif //NETDATA_SQLITE_ACLK_CHART_H |