X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fstore.c;h=df8c02fb152a87135c4f44464476d8d8096d5361;hb=703c09231bca96e2e5d680ead4b471ec9e276ef5;hp=b2fb0f602837f62128e09c849b00dde84f1389c0;hpb=a0a73b582d908694116271b75cd82c1a49b6466c;p=sysdb.git diff --git a/src/core/store.c b/src/core/store.c index b2fb0f6..df8c02f 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -67,6 +67,7 @@ store_base_init(sdb_object_t *obj, va_list ap) sobj->type = va_arg(ap, int); sobj->last_update = va_arg(ap, sdb_time_t); + sobj->interval = 0; sobj->parent = NULL; return 0; } /* store_base_init */ @@ -258,8 +259,8 @@ store_obj(int parent_type, const char *parent_name, parent = store_lookup(parent_type, parent_name); if (! parent) { sdb_log(SDB_LOG_ERR, "store: Failed to store %s '%s' - " - "parent %s '%s' not found", TYPE_TO_NAME(type), name, - TYPE_TO_NAME(parent_type), parent_name); + "parent %s '%s' not found", SDB_STORE_TYPE_TO_NAME(type), + name, SDB_STORE_TYPE_TO_NAME(parent_type), parent_name); free(parent_cname); free(cname); return -1; @@ -286,13 +287,22 @@ store_obj(int parent_type, const char *parent_name, if (old->last_update > last_update) { sdb_log(SDB_LOG_DEBUG, "store: Cannot update %s '%s' - " "value too old (%"PRIscTIME" < %"PRIscTIME")", - TYPE_TO_NAME(type), name, last_update, old->last_update); + SDB_STORE_TYPE_TO_NAME(type), name, + last_update, old->last_update); /* don't report an error; the object may be updated by multiple * backends */ status = 1; } else { + sdb_time_t interval = last_update - old->last_update; old->last_update = last_update; + if (interval) { + if (old->interval) + old->interval = (sdb_time_t)((0.9 * (double)old->interval) + + (0.1 * (double)interval)); + else + old->interval = interval; + } } if (updated_obj) @@ -312,7 +322,7 @@ store_obj(int parent_type, const char *parent_name, if (! new) { char errbuf[1024]; sdb_log(SDB_LOG_ERR, "store: Failed to create %s '%s': %s", - TYPE_TO_NAME(type), name, + SDB_STORE_TYPE_TO_NAME(type), name, sdb_strerror(errno, errbuf, sizeof(errbuf))); free(parent_cname); free(cname); @@ -346,6 +356,7 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) { sdb_llist_iter_t *iter; char time_str[64]; + char interval_str[64]; assert((type == SDB_ATTRIBUTE) || (type == SDB_SERVICE)); @@ -355,10 +366,10 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) if (! iter) { char errbuf[1024]; sdb_log(SDB_LOG_ERR, "store: Failed to retrieve %ss: %s\n", - TYPE_TO_NAME(type), + SDB_STORE_TYPE_TO_NAME(type), sdb_strerror(errno, errbuf, sizeof(errbuf))); sdb_strbuf_append(buf, "{\"error\": \"failed to retrieve %ss: %s\"}", - TYPE_TO_NAME(type), errbuf); + SDB_STORE_TYPE_TO_NAME(type), errbuf); } /* has_next returns false if the iterator is NULL */ @@ -371,16 +382,23 @@ store_obj_tojson(sdb_llist_t *list, int type, sdb_strbuf_t *buf) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; + if (! sdb_strfinterval(interval_str, sizeof(interval_str), + sobj->interval)) + snprintf(interval_str, sizeof(interval_str), ""); + interval_str[sizeof(interval_str) - 1] = '\0'; + sdb_strbuf_append(buf, "{\"name\": \"%s\", ", SDB_OBJ(sobj)->name); if (type == SDB_ATTRIBUTE) { char tmp[sdb_data_strlen(&SDB_ATTR(sobj)->value) + 1]; sdb_data_format(&SDB_ATTR(sobj)->value, tmp, sizeof(tmp), SDB_DOUBLE_QUOTED); - sdb_strbuf_append(buf, "\"value\": %s, \"last_update\": \"%s\"}", - tmp, time_str); + sdb_strbuf_append(buf, "\"value\": %s, \"last_update\": \"%s\", " + "\"update_interval\": \"%s\"}", tmp, time_str, + interval_str); } else - sdb_strbuf_append(buf, "\"last_update\": \"%s\"}", time_str); + sdb_strbuf_append(buf, "\"last_update\": \"%s\", " + "\"update_interval\": \"%s\"}", time_str, interval_str); if (sdb_llist_iter_has_next(iter)) sdb_strbuf_append(buf, ","); @@ -464,6 +482,7 @@ sdb_store_attribute(const char *hostname, if (status >= 0) { assert(updated_attr); + sdb_data_free_datum(&SDB_ATTR(updated_attr)->value); if (sdb_data_copy(&SDB_ATTR(updated_attr)->value, value)) { sdb_object_deref(SDB_OBJ(updated_attr)); status = -1; @@ -496,6 +515,7 @@ sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf, int flags) { sdb_store_obj_t *host; char time_str[64]; + char interval_str[64]; if ((! h) || (h->type != SDB_HOST) || (! buf)) return -1; @@ -507,9 +527,14 @@ sdb_store_host_tojson(sdb_store_base_t *h, sdb_strbuf_t *buf, int flags) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; + if (! sdb_strfinterval(interval_str, sizeof(interval_str), + host->_interval)) + snprintf(interval_str, sizeof(interval_str), ""); + interval_str[sizeof(interval_str) - 1] = '\0'; + sdb_strbuf_append(buf, "{\"name\": \"%s\", " - "\"last_update\": \"%s\"", - SDB_OBJ(host)->name, time_str); + "\"last_update\": \"%s\", \"update_interval\": \"%s\"", + SDB_OBJ(host)->name, time_str, interval_str); if (! (flags & SDB_SKIP_ATTRIBUTES)) { sdb_strbuf_append(buf, ", \"attributes\": ");