From b75718ea9fe4d6c90f1794e517a0712729553c0c Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Thu, 24 Sep 2015 20:49:55 +0200 Subject: [PATCH] store, plugin: Let the plugin module determine an objects backends. The store writer plugins are only expected to record the provided backend (after merging it with existing entries). --- src/core/plugin.c | 33 +++++++++++++++++++++++ src/core/store.c | 58 +++++++++++++++++++++++++--------------- src/include/core/store.h | 8 +++--- 3 files changed, 74 insertions(+), 25 deletions(-) diff --git a/src/core/plugin.c b/src/core/plugin.c index 2cb852e..83ef6ea 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -661,6 +661,21 @@ plugin_add_callback(sdb_llist_t **list, const char *type, return 0; } /* plugin_add_callback */ +static void +get_backend(const char **backends, size_t *backends_num) +{ + const sdb_plugin_info_t *info; + + info = sdb_plugin_current(); + if ((! info) || (! info->plugin_name) || (! *info->plugin_name)) { + *backends_num = 0; + return; + } + + backends[0] = info->plugin_name; + *backends_num = 1; +} /* get_backend */ + /* * public API */ @@ -1470,6 +1485,7 @@ int sdb_plugin_store_host(const char *name, sdb_time_t last_update) { sdb_store_host_t host = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1492,6 +1508,8 @@ sdb_plugin_store_host(const char *name, sdb_time_t last_update) host.name = cname; host.last_update = last_update; + host.backends = backends; + get_backend(host.backends, &host.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { @@ -1512,6 +1530,7 @@ sdb_plugin_store_service(const char *hostname, const char *name, sdb_time_t last_update) { sdb_store_service_t service = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1537,6 +1556,8 @@ sdb_plugin_store_service(const char *hostname, const char *name, service.hostname = cname; service.name = name; service.last_update = last_update; + service.backends = backends; + get_backend(service.backends, &service.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { @@ -1567,6 +1588,7 @@ sdb_plugin_store_metric(const char *hostname, const char *name, sdb_metric_store_t *store, sdb_time_t last_update) { sdb_store_metric_t metric = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1599,6 +1621,8 @@ sdb_plugin_store_metric(const char *hostname, const char *name, metric.store.id = store->id; } metric.last_update = last_update; + metric.backends = backends; + get_backend(metric.backends, &metric.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { @@ -1629,6 +1653,7 @@ sdb_plugin_store_attribute(const char *hostname, const char *key, const sdb_data_t *value, sdb_time_t last_update) { sdb_store_attribute_t attr = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1654,6 +1679,8 @@ sdb_plugin_store_attribute(const char *hostname, const char *key, attr.key = key; attr.value = *value; attr.last_update = last_update; + attr.backends = backends; + get_backend(attr.backends, &attr.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { @@ -1674,6 +1701,7 @@ sdb_plugin_store_service_attribute(const char *hostname, const char *service, const char *key, const sdb_data_t *value, sdb_time_t last_update) { sdb_store_attribute_t attr = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1700,6 +1728,8 @@ sdb_plugin_store_service_attribute(const char *hostname, const char *service, attr.key = key; attr.value = *value; attr.last_update = last_update; + attr.backends = backends; + get_backend(attr.backends, &attr.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { @@ -1720,6 +1750,7 @@ sdb_plugin_store_metric_attribute(const char *hostname, const char *metric, const char *key, const sdb_data_t *value, sdb_time_t last_update) { sdb_store_attribute_t attr = { 0 }; + const char *backends[1]; char *cname; sdb_llist_iter_t *iter; @@ -1746,6 +1777,8 @@ sdb_plugin_store_metric_attribute(const char *hostname, const char *metric, attr.key = key; attr.value = *value; attr.last_update = last_update; + attr.backends = backends; + get_backend(attr.backends, &attr.backends_num); iter = sdb_llist_get_iter(writer_list); while (sdb_llist_iter_has_next(iter)) { diff --git a/src/core/store.c b/src/core/store.c index 9c83218..c6e22df 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -66,8 +66,10 @@ typedef struct { int type; const char *name; sdb_time_t last_update; + const char **backends; + size_t backends_num; } store_obj_t; -#define STORE_OBJ_INIT { NULL, NULL, 0, NULL, 0 } +#define STORE_OBJ_INIT { NULL, NULL, 0, NULL, 0, NULL, 0 } static sdb_type_t host_type; static sdb_type_t service_type; @@ -304,33 +306,39 @@ static sdb_type_t attribute_type = { */ static int -record_backend(sdb_store_obj_t *obj) +record_backends(sdb_store_obj_t *obj, + const char **backends, size_t backends_num) { - const sdb_plugin_info_t *info; char **tmp; size_t i; - info = sdb_plugin_current(); - if (! info) - return 0; + for (i = 0; i < backends_num; i++) { + bool found = 0; + size_t j; - for (i = 0; i < obj->backends_num; ++i) - if (!strcasecmp(obj->backends[i], info->plugin_name)) - return 0; + for (j = 0; j < obj->backends_num; ++j) { + if (!strcasecmp(obj->backends[j], backends[i])) { + found = 1; + break; + } + } + if (found) + continue; - tmp = realloc(obj->backends, - (obj->backends_num + 1) * sizeof(*obj->backends)); - if (! tmp) - return -1; + tmp = realloc(obj->backends, + (obj->backends_num + 1) * sizeof(*obj->backends)); + if (! tmp) + return -1; - obj->backends = tmp; - obj->backends[obj->backends_num] = strdup(info->plugin_name); - if (! obj->backends[obj->backends_num]) - return -1; + obj->backends = tmp; + obj->backends[obj->backends_num] = strdup(backends[i]); + if (! obj->backends[obj->backends_num]) + return -1; - ++obj->backends_num; + ++obj->backends_num; + } return 0; -} /* record_backend */ +} /* record_backends */ static int store_obj(store_obj_t *obj, sdb_store_obj_t **updated_obj) @@ -421,7 +429,7 @@ store_obj(store_obj_t *obj, sdb_store_obj_t **updated_obj) if (updated_obj) *updated_obj = new; - if (record_backend(new)) + if (record_backends(new, obj->backends, obj->backends_num)) return -1; return status; } /* store_obj */ @@ -599,6 +607,8 @@ store_attribute(sdb_store_attribute_t *attr, sdb_object_t *user_data) obj.type = SDB_ATTRIBUTE; obj.name = attr->key; obj.last_update = attr->last_update; + obj.backends = attr->backends; + obj.backends_num = attr->backends_num; if (! status) status = store_obj(&obj, &new); @@ -622,7 +632,7 @@ static int store_host(sdb_store_host_t *host, sdb_object_t *user_data) { sdb_store_t *st = SDB_STORE(user_data); - store_obj_t obj = { NULL, st->hosts, SDB_HOST, NULL, 0 }; + store_obj_t obj = { NULL, st->hosts, SDB_HOST, NULL, 0, NULL, 0 }; int status = 0; if ((! host) || (! host->name)) @@ -630,6 +640,8 @@ store_host(sdb_store_host_t *host, sdb_object_t *user_data) obj.name = host->name; obj.last_update = host->last_update; + obj.backends = host->backends; + obj.backends_num = host->backends_num; pthread_rwlock_wrlock(&st->host_lock); status = store_obj(&obj, NULL); pthread_rwlock_unlock(&st->host_lock); @@ -662,6 +674,8 @@ store_service(sdb_store_service_t *service, sdb_object_t *user_data) obj.name = service->name; obj.last_update = service->last_update; + obj.backends = service->backends; + obj.backends_num = service->backends_num; if (! status) status = store_obj(&obj, NULL); @@ -699,6 +713,8 @@ store_metric(sdb_store_metric_t *metric, sdb_object_t *user_data) obj.name = metric->name; obj.last_update = metric->last_update; + obj.backends = metric->backends; + obj.backends_num = metric->backends_num; if (! status) status = store_obj(&obj, &new); sdb_object_deref(SDB_OBJ(host)); diff --git a/src/include/core/store.h b/src/include/core/store.h index a1e5e17..bccb792 100644 --- a/src/include/core/store.h +++ b/src/include/core/store.h @@ -118,7 +118,7 @@ typedef struct { sdb_time_t last_update; sdb_time_t interval; - char **backends; + const char **backends; size_t backends_num; } sdb_store_host_t; @@ -131,7 +131,7 @@ typedef struct { sdb_time_t last_update; sdb_time_t interval; - char **backends; + const char **backends; size_t backends_num; } sdb_store_service_t; @@ -156,7 +156,7 @@ typedef struct { sdb_time_t last_update; sdb_time_t interval; - char **backends; + const char **backends; size_t backends_num; } sdb_store_metric_t; @@ -172,7 +172,7 @@ typedef struct { sdb_time_t last_update; sdb_time_t interval; - char **backends; + const char **backends; size_t backends_num; } sdb_store_attribute_t; -- 2.30.2