summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 1dbeeff)
raw | patch | inline | side by side (parent: 1dbeeff)
author | Sebastian Harl <sh@tokkee.org> | |
Thu, 24 Sep 2015 18:49:55 +0000 (20:49 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Thu, 24 Sep 2015 18:49:55 +0000 (20:49 +0200) |
The store writer plugins are only expected to record the provided backend
(after merging it with existing entries).
(after merging it with existing entries).
src/core/plugin.c | patch | blob | history | |
src/core/store.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history |
diff --git a/src/core/plugin.c b/src/core/plugin.c
index 2cb852e45112156229a0a22899c20580f254d7ff..83ef6ead9cb150aa447515ba60036691eedfd451 100644 (file)
--- a/src/core/plugin.c
+++ b/src/core/plugin.c
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
*/
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;
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)) {
sdb_time_t last_update)
{
sdb_store_service_t service = { 0 };
+ const char *backends[1];
char *cname;
sdb_llist_iter_t *iter;
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)) {
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;
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)) {
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;
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)) {
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;
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)) {
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;
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 9c83218f1efccbde39512f6831383d5f99c5801e..c6e22df69f55591e433c2d52fee5341dea6c2d90 100644 (file)
--- a/src/core/store.c
+++ b/src/core/store.c
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;
*/
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)
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 */
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);
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))
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);
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);
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));
index a1e5e179ca5ec03d40fedc20081ec9b9f86a3e7f..bccb792202955f00c14924a99ed30db2d788ddda 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
sdb_time_t last_update;
sdb_time_t interval;
- char **backends;
+ const char **backends;
size_t backends_num;
} sdb_store_host_t;
sdb_time_t last_update;
sdb_time_t interval;
- char **backends;
+ const char **backends;
size_t backends_num;
} sdb_store_service_t;
sdb_time_t last_update;
sdb_time_t interval;
- char **backends;
+ const char **backends;
size_t backends_num;
} sdb_store_metric_t;
sdb_time_t last_update;
sdb_time_t interval;
- char **backends;
+ const char **backends;
size_t backends_num;
} sdb_store_attribute_t;