summaryrefslogtreecommitdiffstats
path: root/database/engine/metadata_log/metadatalogapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'database/engine/metadata_log/metadatalogapi.c')
-rwxr-xr-xdatabase/engine/metadata_log/metadatalogapi.c515
1 files changed, 6 insertions, 509 deletions
diff --git a/database/engine/metadata_log/metadatalogapi.c b/database/engine/metadata_log/metadatalogapi.c
index 64ea149037..b206cca055 100755
--- a/database/engine/metadata_log/metadatalogapi.c
+++ b/database/engine/metadata_log/metadatalogapi.c
@@ -3,461 +3,6 @@
#include "metadatalog.h"
-static inline struct metalog_instance *get_metalog_ctx(RRDHOST *host)
-{
- if (host->rrdeng_ctx)
- return host->rrdeng_ctx->metalog_ctx;
-
- return NULL;
-}
-
-static inline int metalog_is_initialized(struct metalog_instance *ctx)
-{
- return ctx->rrdeng_ctx->metalog_ctx != NULL;
-}
-
-static inline void metalog_commit_creation_record(struct metalog_instance *ctx, BUFFER *buffer, uuid_t *uuid)
-{
- metalog_commit_record(ctx, buffer, METALOG_COMMIT_CREATION_RECORD, uuid, 0);
-}
-
-static inline void metalog_commit_deletion_record(struct metalog_instance *ctx, BUFFER *buffer)
-{
- metalog_commit_record(ctx, buffer, METALOG_COMMIT_DELETION_RECORD, NULL, 0);
-}
-
-void metalog_upd_objcount(RRDHOST *host, int count)
-{
- struct metalog_instance *ctx = get_metalog_ctx(host);
-
- if (unlikely(!ctx))
- return;
-
- rrd_atomic_fetch_add(&ctx->objects_nr, count);
-}
-
-BUFFER *metalog_update_host_buffer(RRDHOST *host)
-{
- BUFFER *buffer;
- buffer = buffer_create(4096); /* This will be freed after it has been committed to the metadata log buffer */
-
- rrdhost_rdlock(host);
-
- buffer_sprintf(buffer,
- "HOST \"%s\" \"%s\" \"%s\" %d \"%s\" \"%s\" \"%s\"\n",
-// "\"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"" /* system */
-// "\"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"", /* info */
- host->machine_guid,
- host->hostname,
- host->registry_hostname,
- default_rrd_update_every,
- host->os,
- host->timezone,
- (host->tags) ? host->tags : "");
-
- netdata_rwlock_rdlock(&host->labels_rwlock);
- struct label *labels = host->labels;
- while (labels) {
- buffer_sprintf(buffer
- , "LABEL \"%s\" = %d %s\n"
- , labels->key
- , (int)labels->label_source
- , labels->value);
-
- labels = labels->next;
- }
- netdata_rwlock_unlock(&host->labels_rwlock);
-
- buffer_strcat(buffer, "OVERWRITE labels\n");
-
- rrdhost_unlock(host);
- return buffer;
-}
-
-void metalog_commit_update_host(RRDHOST *host)
-{
- struct metalog_instance *ctx;
- BUFFER *buffer;
-
- /* Metadata are only available with dbengine */
- ctx = get_metalog_ctx(host);
- if (!ctx)
- return;
- if (!ctx->initialized) /* metadata log has not been initialized yet */
- return;
-
- buffer = metalog_update_host_buffer(host);
-
- metalog_commit_creation_record(ctx, buffer, &host->host_uuid);
-}
-
-/* compaction_id 0 means it was not called by compaction logic */
-BUFFER *metalog_update_chart_buffer(RRDSET *st, uint32_t compaction_id)
-{
- BUFFER *buffer;
- RRDHOST *host = st->rrdhost;
-
- buffer = buffer_create(1024); /* This will be freed after it has been committed to the metadata log buffer */
-
- rrdset_rdlock(st);
-
- buffer_sprintf(buffer, "CONTEXT %s\n", host->machine_guid);
-
- char uuid_str[37];
- uuid_unparse_lower(*st->chart_uuid, uuid_str);
- buffer_sprintf(buffer, "GUID %s\n", uuid_str);
-
- // properly set the name for the remote end to parse it
- char *name = "";
- if(likely(st->name)) {
- if(unlikely(strcmp(st->id, st->name))) {
- // they differ
- name = strchr(st->name, '.');
- if(name)
- name++;
- else
- name = "";
- }
- }
-
- // send the chart
- buffer_sprintf(
- buffer
- , "CHART \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" %ld %d \"%s %s %s %s\" \"%s\" \"%s\"\n"
- , st->id
- , name
- , st->title
- , st->units
- , st->family
- , st->context
- , rrdset_type_name(st->chart_type)
- , st->priority
- , st->update_every
- , "" /* archived charts cannot be obsolete */
- , rrdset_flag_check(st, RRDSET_FLAG_DETAIL)?"detail":""
- , rrdset_flag_check(st, RRDSET_FLAG_STORE_FIRST)?"store_first":""
- , rrdset_flag_check(st, RRDSET_FLAG_HIDDEN)?"hidden":""
- , (st->plugin_name)?st->plugin_name:""
- , (st->module_name)?st->module_name:""
- );
-
- // send the dimensions
- RRDDIM *rd;
- rrddim_foreach_read(rd, st) {
- char uuid_str[37];
-
- uuid_unparse_lower(*rd->state->metric_uuid, uuid_str);
- buffer_sprintf(buffer, "GUID %s\n", uuid_str);
-
- buffer_sprintf(
- buffer
- , "DIMENSION \"%s\" \"%s\" \"%s\" " COLLECTED_NUMBER_FORMAT " " COLLECTED_NUMBER_FORMAT " \"%s %s %s\"\n"
- , rd->id
- , rd->name
- , rrd_algorithm_name(rd->algorithm)
- , rd->multiplier
- , rd->divisor
- , "" /* archived dimensions cannot be obsolete */
- , rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)?"hidden":""
- , rrddim_flag_check(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS)?"noreset":""
- );
- if (compaction_id && compaction_id > rd->state->compaction_id) {
- /* No need to use this dimension again during this compaction cycle */
- rd->state->compaction_id = compaction_id;
- }
- }
- rrdset_unlock(st);
- return buffer;
-}
-
-void metalog_commit_update_chart(RRDSET *st)
-{
- struct metalog_instance *ctx;
- BUFFER *buffer;
-
- /* Metadata are only available with dbengine */
- if (RRD_MEMORY_MODE_DBENGINE != st->rrd_memory_mode)
- return;
-
- ctx = get_metalog_ctx(st->rrdhost);
- if (!ctx)
- return;
- if (!ctx->initialized) /* metadata log has not been initialized yet */
- return;
-
- buffer = metalog_update_chart_buffer(st, 0);
-
- metalog_commit_creation_record(ctx, buffer, st->chart_uuid);
-}
-
-void metalog_commit_delete_chart(RRDSET *st)
-{
- struct metalog_instance *ctx;
- BUFFER *buffer;
- char uuid_str[37];
-
- /* Metadata are only available with dbengine */
- if (RRD_MEMORY_MODE_DBENGINE != st->rrd_memory_mode)
- return;
-
- ctx = get_metalog_ctx(st->rrdhost);
- if (!ctx)
- return;
- if (!ctx->initialized) /* metadata log has not been initialized yet */
- return;
- buffer = buffer_create(64); /* This will be freed after it has been committed to the metadata log buffer */
-
- uuid_unparse_lower(*st->chart_uuid, uuid_str);
- buffer_sprintf(buffer, "TOMBSTONE %s\n", uuid_str);
-
- metalog_commit_deletion_record(ctx, buffer);
-}
-
-BUFFER *metalog_update_dimension_buffer(RRDDIM *rd)
-{
- BUFFER *buffer;
- RRDSET *st = rd->rrdset;
- char uuid_str[37];
-
- buffer = buffer_create(128); /* This will be freed after it has been committed to the metadata log buffer */
-
- uuid_unparse_lower(*st->chart_uuid, uuid_str);
- buffer_sprintf(buffer, "CONTEXT %s\n", uuid_str);
- // Activate random GUID
- uuid_unparse_lower(*rd->state->metric_uuid, uuid_str);
- buffer_sprintf(buffer, "GUID %s\n", uuid_str);
-
- buffer_sprintf(
- buffer
- , "DIMENSION \"%s\" \"%s\" \"%s\" " COLLECTED_NUMBER_FORMAT " " COLLECTED_NUMBER_FORMAT " \"%s %s %s\"\n"
- , rd->id
- , rd->name
- , rrd_algorithm_name(rd->algorithm)
- , rd->multiplier
- , rd->divisor
- , "" /* archived dimensions cannot be obsolete */
- , rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)?"hidden":""
- , rrddim_flag_check(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS)?"noreset":""
- );
- return buffer;
-}
-
-void metalog_commit_update_dimension(RRDDIM *rd)
-{
- struct metalog_instance *ctx;
- BUFFER *buffer;
- RRDSET *st = rd->rrdset;
-
- /* Metadata are only available with dbengine */
- if (RRD_MEMORY_MODE_DBENGINE != st->rrd_memory_mode)
- return;
-
- ctx = get_metalog_ctx(st->rrdhost);
- if (!ctx)
- return;
- if (!ctx->initialized) /* metadata log has not been initialized yet */
- return;
-
- buffer = metalog_update_dimension_buffer(rd);
-
- metalog_commit_creation_record(ctx, buffer, rd->state->metric_uuid);
-}
-
-void metalog_commit_delete_dimension(RRDDIM *rd)
-{
- struct metalog_instance *ctx;
- BUFFER *buffer;
- RRDSET *st = rd->rrdset;
- char uuid_str[37];
-
- /* Metadata are only available with dbengine */
- if (RRD_MEMORY_MODE_DBENGINE != st->rrd_memory_mode)
- return;
-
- ctx = get_metalog_ctx(st->rrdhost);
- if (!ctx)
- return;
- if (!ctx->initialized) /* metadata log has not been initialized yet */
- return;
- buffer = buffer_create(64); /* This will be freed after it has been committed to the metadata log buffer */
-
- uuid_unparse_lower(*rd->state->metric_uuid, uuid_str);
- buffer_sprintf(buffer, "TOMBSTONE %s\n", uuid_str);
-
- metalog_commit_deletion_record(ctx, buffer);
-}
-
-RRDHOST *metalog_get_host_from_uuid(struct metalog_instance *ctx, uuid_t *host_guid)
-{
- UNUSED(ctx);
- GUID_TYPE ret;
- char machine_guid[37];
-
- uuid_unparse_lower(*host_guid, machine_guid);
- RRDHOST *host = rrdhost_find_by_guid(machine_guid, 0);
- ret = find_object_by_guid(host_guid, NULL, 0);
- if (unlikely(GUID_TYPE_HOST != ret)) {
- errno = 0;
- if (unlikely(!host))
- error("Host with GUID %s not found in the global map or in the list of hosts", machine_guid);
- else
- error("Host with GUID %s not found in the global map", machine_guid);
- }
- return host;
-}
-
-RRDSET *metalog_get_chart_from_uuid(struct metalog_instance *ctx, uuid_t *chart_uuid)
-{
- GUID_TYPE ret;
- char chart_object[33], chart_fullid[RRD_ID_LENGTH_MAX + 1];
- uuid_t *machine_guid, *chart_char_guid;
-
- ret = find_object_by_guid(chart_uuid, chart_object, 33);
- if (unlikely(GUID_TYPE_CHART != ret))
- return NULL;
-
- machine_guid = (uuid_t *)chart_object;
- RRDHOST *host = metalog_get_host_from_uuid(ctx, machine_guid);
- if (unlikely(!host))
- return NULL;
- if (unlikely(uuid_compare(host->host_uuid, *machine_guid))) {
- errno = 0;
- error("Metadata host machine GUID does not match the one assosiated with the chart");
- return NULL;
- }
-
- chart_char_guid = (uuid_t *)(chart_object + 16);
-
- ret = find_object_by_guid(chart_char_guid, chart_fullid, RRD_ID_LENGTH_MAX + 1);
- if (unlikely(GUID_TYPE_CHAR != ret))
- return NULL;
- RRDSET *st = rrdset_find(host, chart_fullid);
-
- return st;
-}
-
-RRDDIM *metalog_get_dimension_from_uuid(struct metalog_instance *ctx, uuid_t *metric_uuid)
-{
- UNUSED(ctx);
-
- GUID_TYPE ret;
- char dim_object[49], chart_object[33], id_str[PLUGINSD_LINE_MAX], chart_fullid[RRD_ID_LENGTH_MAX + 1];
- uuid_t *machine_guid, *chart_guid, *chart_char_guid, *dim_char_guid;
-
- ret = find_object_by_guid(metric_uuid, dim_object, sizeof(dim_object));
- if (GUID_TYPE_DIMENSION != ret) /* not found */
- return NULL;
-
- machine_guid = (uuid_t *)dim_object;
-
- RRDHOST *host = metalog_get_host_from_uuid(ctx, machine_guid);
- if (unlikely(!host))
- return NULL;
- if (unlikely(uuid_compare(host->host_uuid, *machine_guid))) {
- errno = 0;
- error("Metadata host machine GUID does not match the one assosiated with the dimension");
- return NULL;
- }
-
- chart_guid = (uuid_t *)(dim_object + 16);
- dim_char_guid = (uuid_t *)(dim_object + 16 + 16);
-
- ret = find_object_by_guid(dim_char_guid, id_str, sizeof(id_str));
- if (unlikely(GUID_TYPE_CHAR != ret))
- return NULL;
-
- ret = find_object_by_guid(chart_guid, chart_object, sizeof(chart_object));
- if (unlikely(GUID_TYPE_CHART != ret))
- return NULL;
- chart_char_guid = (uuid_t *)(chart_object + 16);
-
- ret = find_object_by_guid(chart_char_guid, chart_fullid, RRD_ID_LENGTH_MAX + 1);
- if (unlikely(GUID_TYPE_CHAR != ret))
- return NULL;
- RRDSET *st = rrdset_find(host, chart_fullid);
- if (!st)
- return NULL;
-
- RRDDIM *rd = rrddim_find(st, id_str);
-
- return rd;
-}
-
-/* This function is called by dbengine rotation logic when the metric has no writers */
-void metalog_delete_dimension_by_uuid(struct metalog_instance *ctx, uuid_t *metric_uuid)
-{
- RRDDIM *rd;
- RRDSET *st;
- RRDHOST *host;
- uint8_t empty_chart;
-
- rd = metalog_get_dimension_from_uuid(ctx, metric_uuid);
- if (!rd) { /* in the case of legacy UUID convert to multihost and try again */
- uuid_t multihost_uuid;
-
- rrdeng_convert_legacy_uuid_to_multihost(ctx->rrdeng_ctx->machine_guid, metric_uuid, &multihost_uuid);
- rd = metalog_get_dimension_from_uuid(ctx, &multihost_uuid);
- }
- if(!rd) {
- info("Rotated unknown archived metric.");
- return;
- }
- st = rd->rrdset;
- host = st->rrdhost;
-
- /* In case there are active metrics in a different database engine do not delete the dimension object */
- if (unlikely(host->rrd_memory_mode != RRD_MEMORY_MODE_DBENGINE))
- return;
-
- /* Since the metric has no writer it will not be commited to the metadata log by rrddim_free_custom().
- * It must be commited explicitly before calling rrddim_free_custom(). */
- metalog_commit_delete_dimension(rd);
-
- rrdset_wrlock(st);
- rrddim_free_custom(st, rd, 1);
- empty_chart = (NULL == st->dimensions);
- rrdset_unlock(st);
-
- if (empty_chart) {
- rrdhost_wrlock(host);
- rrdset_rdlock(st);
- rrdset_delete_custom(st, 1);
- rrdset_unlock(st);
- rrdset_free(st);
- rrdhost_unlock(host);
- }
-}
-
-void metalog_print_dimension_by_uuid(struct metalog_instance *ctx, uuid_t *metric_uuid)
-{
- RRDDIM *rd;
- RRDSET *st;
- RRDHOST *host;
-
- if (!ctx || !ctx->initialized)
- return;
-
- rd = metalog_get_dimension_from_uuid(ctx, metric_uuid);
- if (!rd) { /* in the case of legacy UUID convert to multihost and try again */
- uuid_t multihost_uuid;
-
- rrdeng_convert_legacy_uuid_to_multihost(ctx->rrdeng_ctx->machine_guid, metric_uuid, &multihost_uuid);
- rd = metalog_get_dimension_from_uuid(ctx, &multihost_uuid);
- }
- if(!rd) {
- error_with_guid(metric_uuid, "GUID not found, unknown metric.");
- return;
- }
- st = rd->rrdset;
- host = st->rrdhost;
-
- error_with_guid(metric_uuid, "Host - Chart - Dimension are the below:");
- error("%s %s %s.", host->hostname, st->id, rd->id);
-
- if (unlikely(host->rrd_memory_mode != RRD_MEMORY_MODE_DBENGINE))
- error_with_guid(metric_uuid, "UUID does not belong to RRD_MEMORY_MODE_DBENGINE.");
-}
-
/*
* Returns 0 on success, negative on error
*/
@@ -467,76 +12,28 @@ int metalog_init(struct rrdengine_instance *rrdeng_parent_ctx)
int error;
ctx = callocz(1, sizeof(*ctx));
- ctx->records_nr = 0;
- ctx->objects_nr = 0;
- ctx->current_compaction_id = 0;
- ctx->quiesce = NO_QUIESCE;
ctx->initialized = 0;
rrdeng_parent_ctx->metalog_ctx = ctx;
- memset(&ctx->worker_config, 0, sizeof(ctx->worker_config));
ctx->rrdeng_ctx = rrdeng_parent_ctx;
- ctx->worker_config.ctx = ctx;
- init_metadata_record_log(&ctx->records_log);
error = init_metalog_files(ctx);
if (error) {
goto error_after_init_rrd_files;
}
-
- init_completion(&ctx->metalog_completion);
- fatal_assert(0 == uv_thread_create(&ctx->worker_config.thread, metalog_worker, &ctx->worker_config));
- /* wait for worker thread to initialize */
- wait_for_completion(&ctx->metalog_completion);
- destroy_completion(&ctx->metalog_completion);
- uv_thread_set_name_np(ctx->worker_config.thread, "METALOG");
- if (ctx->worker_config.error) {
- goto error_after_rrdeng_worker;
- }
ctx->initialized = 1; /* notify dbengine that the metadata log has finished initializing */
return 0;
-error_after_rrdeng_worker:
- finalize_metalog_files(ctx);
error_after_init_rrd_files:
freez(ctx);
return UV_EIO;
}
-/*
- * Returns 0 on success, 1 on error
- */
-int metalog_exit(struct metalog_instance *ctx)
-{
- struct metalog_cmd cmd;
-
- if (NULL == ctx) {
- return 1;
- }
-
- cmd.opcode = METALOG_SHUTDOWN;
- metalog_enq_cmd(&ctx->worker_config, &cmd);
-
- fatal_assert(0 == uv_thread_join(&ctx->worker_config.thread));
-
- finalize_metalog_files(ctx);
- freez(ctx);
-
- return 0;
-}
-
-void metalog_prepare_exit(struct metalog_instance *ctx)
+/* This function is called by dbengine rotation logic when the metric has no writers */
+void metalog_delete_dimension_by_uuid(struct metalog_instance *ctx, uuid_t *metric_uuid)
{
- struct metalog_cmd cmd;
-
- if (NULL == ctx) {
- return;
- }
-
- init_completion(&ctx->metalog_completion);
- cmd.opcode = METALOG_QUIESCE;
- metalog_enq_cmd(&ctx->worker_config, &cmd);
+ uuid_t multihost_uuid;
- /* wait for metadata log to quiesce */
- wait_for_completion(&ctx->metalog_completion);
- destroy_completion(&ctx->metalog_completion);
+ delete_dimension_uuid(metric_uuid);
+ rrdeng_convert_legacy_uuid_to_multihost(ctx->rrdeng_ctx->machine_guid, metric_uuid, &multihost_uuid);
+ delete_dimension_uuid(&multihost_uuid);
}