summaryrefslogtreecommitdiffstats
path: root/database/rrdfamily.c
diff options
context:
space:
mode:
Diffstat (limited to 'database/rrdfamily.c')
-rw-r--r--database/rrdfamily.c87
1 files changed, 47 insertions, 40 deletions
diff --git a/database/rrdfamily.c b/database/rrdfamily.c
index 3d91c3788..e7d1536c8 100644
--- a/database/rrdfamily.c
+++ b/database/rrdfamily.c
@@ -3,59 +3,66 @@
#define NETDATA_RRD_INTERNALS
#include "rrd.h"
+typedef struct rrdfamily {
+ STRING *family;
+ DICTIONARY *rrdvars;
+} RRDFAMILY;
+
// ----------------------------------------------------------------------------
// RRDFAMILY index
-int rrdfamily_compare(void *a, void *b) {
- if(((RRDFAMILY *)a)->hash_family < ((RRDFAMILY *)b)->hash_family) return -1;
- else if(((RRDFAMILY *)a)->hash_family > ((RRDFAMILY *)b)->hash_family) return 1;
- else return strcmp(((RRDFAMILY *)a)->family, ((RRDFAMILY *)b)->family);
-}
+struct rrdfamily_constructor {
+ const char *family;
+};
-#define rrdfamily_index_add(host, rc) (RRDFAMILY *)avl_insert_lock(&((host)->rrdfamily_root_index), (avl_t *)(rc))
-#define rrdfamily_index_del(host, rc) (RRDFAMILY *)avl_remove_lock(&((host)->rrdfamily_root_index), (avl_t *)(rc))
+static void rrdfamily_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, void *rrdfamily, void *constructor_data) {
+ RRDFAMILY *rf = rrdfamily;
+ struct rrdfamily_constructor *ctr = constructor_data;
-static RRDFAMILY *rrdfamily_index_find(RRDHOST *host, const char *id, uint32_t hash) {
- RRDFAMILY tmp;
- tmp.family = id;
- tmp.hash_family = (hash)?hash:simple_hash(tmp.family);
+ rf->family = string_strdupz(ctr->family);
+ rf->rrdvars = rrdvariables_create();
+}
- return (RRDFAMILY *)avl_search_lock(&(host->rrdfamily_root_index), (avl_t *) &tmp);
+static void rrdfamily_delete_callback(const DICTIONARY_ITEM *item __maybe_unused, void *rrdfamily, void *rrdhost __maybe_unused) {
+ RRDFAMILY *rf = rrdfamily;
+ string_freez(rf->family);
+ rrdvariables_destroy(rf->rrdvars);
+ rf->family = NULL;
+ rf->rrdvars = NULL;
}
-RRDFAMILY *rrdfamily_create(RRDHOST *host, const char *id) {
- RRDFAMILY *rc = rrdfamily_index_find(host, id, 0);
- if(!rc) {
- rc = callocz(1, sizeof(RRDFAMILY));
+void rrdfamily_index_init(RRDHOST *host) {
+ if(!host->rrdfamily_root_index) {
+ host->rrdfamily_root_index = dictionary_create(DICT_OPTION_DONT_OVERWRITE_VALUE);
- rc->family = strdupz(id);
- rc->hash_family = simple_hash(rc->family);
+ dictionary_register_insert_callback(host->rrdfamily_root_index, rrdfamily_insert_callback, NULL);
+ dictionary_register_delete_callback(host->rrdfamily_root_index, rrdfamily_delete_callback, host);
+ }
+}
- // initialize the variables index
- avl_init_lock(&rc->rrdvar_root_index, rrdvar_compare);
+void rrdfamily_index_destroy(RRDHOST *host) {
+ dictionary_destroy(host->rrdfamily_root_index);
+ host->rrdfamily_root_index = NULL;
+}
- RRDFAMILY *ret = rrdfamily_index_add(host, rc);
- if(ret != rc)
- error("RRDFAMILY: INTERNAL ERROR: Expected to INSERT RRDFAMILY '%s' into index, but inserted '%s'.", rc->family, (ret)?ret->family:"NONE");
- }
- rc->use_count++;
- return rc;
+// ----------------------------------------------------------------------------
+// RRDFAMILY management
+
+const RRDFAMILY_ACQUIRED *rrdfamily_add_and_acquire(RRDHOST *host, const char *id) {
+ struct rrdfamily_constructor tmp = {
+ .family = id,
+ };
+ return (const RRDFAMILY_ACQUIRED *)dictionary_set_and_acquire_item_advanced(host->rrdfamily_root_index, id, -1, NULL, sizeof(RRDFAMILY), &tmp);
}
-void rrdfamily_free(RRDHOST *host, RRDFAMILY *rc) {
- rc->use_count--;
- if(!rc->use_count) {
- RRDFAMILY *ret = rrdfamily_index_del(host, rc);
- if(ret != rc)
- error("RRDFAMILY: INTERNAL ERROR: Expected to DELETE RRDFAMILY '%s' from index, but deleted '%s'.", rc->family, (ret)?ret->family:"NONE");
- else {
- debug(D_RRD_CALLS, "RRDFAMILY: Cleaning up remaining family variables for host '%s', family '%s'", host->hostname, rc->family);
- rrdvar_free_remaining_variables(host, &rc->rrdvar_root_index);
-
- freez((void *) rc->family);
- freez(rc);
- }
- }
+void rrdfamily_release(RRDHOST *host, const RRDFAMILY_ACQUIRED *rfa) {
+ if(unlikely(!rfa)) return;
+ dictionary_acquired_item_release(host->rrdfamily_root_index, (const DICTIONARY_ITEM *)rfa);
}
+DICTIONARY *rrdfamily_rrdvars_dict(const RRDFAMILY_ACQUIRED *rfa) {
+ if(unlikely(!rfa)) return NULL;
+ RRDFAMILY *rf = dictionary_acquired_item_value((const DICTIONARY_ITEM *)rfa);
+ return(rf->rrdvars);
+}