X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Fstore.c;h=bf12a9378eb228e811a87ea268eb8fa403991672;hp=1eb7ed138435eaa021bd54f1f4f8fca607033e8d;hb=bbd1b997cf153d54878efebc182bd88f1c64d45c;hpb=5a570b8e22d3972dc5e2b9ba386afce5fa7d688e diff --git a/src/core/store.c b/src/core/store.c index 1eb7ed1..bf12a93 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -423,6 +423,37 @@ store_attr(sdb_store_obj_t *parent, sdb_avltree_t *attributes, return status; } /* store_attr */ +static int +store_metric_store(sdb_metric_t *metric, sdb_metric_store_t *store) +{ + char *type = metric->store.type; + char *id = metric->store.id; + + if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { + if (! (type = strdup(store->type))) + return -1; + } + if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { + if (! (id = strdup(store->id))) { + if (type != metric->store.type) + free(type); + return -1; + } + } + + if (type != metric->store.type) { + if (metric->store.type) + free(metric->store.type); + metric->store.type = type; + } + if (id != metric->store.id) { + if (metric->store.id) + free(metric->store.id); + metric->store.id = id; + } + return 0; +} /* store_metric_store */ + /* The host_lock has to be acquired before calling this function. */ static sdb_avltree_t * get_host_children(sdb_host_t *host, int type) @@ -609,6 +640,7 @@ sdb_store_service(const char *hostname, const char *name, { sdb_host_t *host; sdb_avltree_t *services; + sdb_data_t d; int status = 0; @@ -631,8 +663,17 @@ sdb_store_service(const char *hostname, const char *name, sdb_object_deref(SDB_OBJ(host)); pthread_rwlock_unlock(&host_lock); + if (status) + return status; + if (sdb_plugin_store_service(hostname, name, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_service_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_service */ @@ -687,6 +728,7 @@ sdb_store_metric(const char *hostname, const char *name, sdb_store_obj_t *obj = NULL; sdb_host_t *host; sdb_metric_t *metric; + sdb_data_t d; sdb_avltree_t *metrics; @@ -716,7 +758,7 @@ sdb_store_metric(const char *hostname, const char *name, name, last_update, &obj); sdb_object_deref(SDB_OBJ(host)); - if (status || (! store)) { + if (status) { pthread_rwlock_unlock(&host_lock); return status; } @@ -724,29 +766,19 @@ sdb_store_metric(const char *hostname, const char *name, assert(obj); metric = METRIC(obj); - if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { - if (metric->store.type) - free(metric->store.type); - metric->store.type = strdup(store->type); - } - if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { - if (metric->store.id) - free(metric->store.id); - metric->store.id = strdup(store->id); - } - - if ((! metric->store.type) || (! metric->store.id)) { - if (metric->store.type) - free(metric->store.type); - if (metric->store.id) - free(metric->store.id); - metric->store.type = metric->store.id = NULL; - status = -1; - } + if (store) + if (store_metric_store(metric, store)) + status = -1; pthread_rwlock_unlock(&host_lock); if (sdb_plugin_store_metric(hostname, name, store, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_metric_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_metric */ @@ -818,6 +850,8 @@ sdb_store_fetch_timeseries(const char *hostname, const char *metric, sdb_timeseries_t *ts; + int status = 0; + if ((! hostname) || (! metric) || (! opts) || (! buf)) return -1; @@ -844,6 +878,7 @@ sdb_store_fetch_timeseries(const char *hostname, const char *metric, sdb_log(SDB_LOG_ERR, "store: Failed to fetch time-series '%s/%s' " "- no data-store configured for the stored metric", hostname, metric); + sdb_object_deref(SDB_OBJ(m)); pthread_rwlock_unlock(&host_lock); return -1; } @@ -861,13 +896,14 @@ sdb_store_fetch_timeseries(const char *hostname, const char *metric, sdb_log(SDB_LOG_ERR, "store: Failed to fetch time-series '%s/%s' " "- %s fetcher callback returned no data for '%s'", hostname, metric, type, id); - return -1; + status = -1; } } ts_tojson(ts, buf); + sdb_object_deref(SDB_OBJ(m)); sdb_timeseries_destroy(ts); - return 0; + return status; } /* sdb_store_fetch_timeseries */ int @@ -904,6 +940,17 @@ sdb_store_get_field(sdb_store_obj_t *obj, int field, sdb_data_t *res) tmp.data.array.length = obj->backends_num; tmp.data.array.values = obj->backends; return sdb_data_copy(res, &tmp); + case SDB_FIELD_VALUE: + if (obj->type != SDB_ATTRIBUTE) + return -1; + if (! res) + return 0; + return sdb_data_copy(res, &ATTR(obj)->value); + case SDB_FIELD_TIMESERIES: + if (obj->type != SDB_METRIC) + return -1; + tmp.type = SDB_TYPE_BOOLEAN; + tmp.data.boolean = METRIC(obj)->store.type != NULL; default: return -1; }