X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_cache.c;h=aeb662d55bc09e63c18ae856ac182aa04fc6b369;hb=d7ca6a64067a4e01a5e47044a6a80323d0138bee;hp=3577ac6f8baa039723bf6e264ae268ef3c270061;hpb=62e42f8dbbc99815f06d7204fc410bca9aece4ef;p=collectd.git diff --git a/src/utils_cache.c b/src/utils_cache.c index 3577ac6f..aeb662d5 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -46,6 +46,7 @@ typedef struct cache_entry_s * (for purding old entries) */ int interval; int state; + int hits; /* * +-----+-----+-----+-----+-----+-----+-----+-----+-----+---- @@ -98,6 +99,7 @@ static cache_entry_t *cache_alloc (int values_num) ce->history = NULL; ce->history_length = 0; + ce->meta = NULL; return (ce); } /* cache_entry_t *cache_alloc */ @@ -110,6 +112,11 @@ static void cache_free (cache_entry_t *ce) sfree (ce->values_gauge); sfree (ce->values_raw); sfree (ce->history); + if (ce->meta != NULL) + { + meta_data_destroy (ce->meta); + ce->meta = NULL; + } sfree (ce); } /* void cache_free */ @@ -168,7 +175,7 @@ static int uc_send_notification (const char *name) } /* Check if the entry has been updated in the meantime */ - if ((n.time - ce->last_update) < (2 * ce->interval)) + if ((n.time - ce->last_update) < (timeout_g * ce->interval)) { ce->state = STATE_OKAY; pthread_mutex_unlock (&cache_lock); @@ -312,7 +319,7 @@ int uc_check_timeout (void) while (c_avl_iterator_next (iter, (void *) &key, (void *) &ce) == 0) { /* If entry has not been updated, add to `keys' array */ - if ((now - ce->last_update) >= (2 * ce->interval)) + if ((now - ce->last_update) >= (timeout_g * ce->interval)) { char **tmp; @@ -356,6 +363,7 @@ int uc_check_timeout (void) { DEBUG ("uc_check_timeout: %s is missing but ``uninteresting''", keys[i]); + ce = NULL; status = c_avl_remove (cache_tree, keys[i], (void *) &key, (void *) &ce); if (status != 0) @@ -364,7 +372,8 @@ int uc_check_timeout (void) } sfree (keys[i]); sfree (key); - cache_free (ce); + if (ce != NULL) + cache_free (ce); continue; } @@ -605,16 +614,24 @@ int uc_get_rate_by_name (const char *name, gauge_t **ret_values, size_t *ret_val { assert (ce != NULL); - ret_num = ce->values_num; - ret = (gauge_t *) malloc (ret_num * sizeof (gauge_t)); - if (ret == NULL) + /* remove missing values from getval */ + if (ce->state == STATE_MISSING) { - ERROR ("utils_cache: uc_get_rate_by_name: malloc failed."); status = -1; } else { - memcpy (ret, ce->values_gauge, ret_num * sizeof (gauge_t)); + ret_num = ce->values_num; + ret = (gauge_t *) malloc (ret_num * sizeof (gauge_t)); + if (ret == NULL) + { + ERROR ("utils_cache: uc_get_rate_by_name: malloc failed."); + status = -1; + } + else + { + memcpy (ret, ce->values_gauge, ret_num * sizeof (gauge_t)); + } } } else @@ -687,6 +704,10 @@ int uc_get_names (char ***ret_names, time_t **ret_times, size_t *ret_number) { char **temp; + /* remove missing values when list values */ + if (value->state == STATE_MISSING) + continue; + if (ret_times != NULL) { time_t *tmp_times; @@ -875,11 +896,88 @@ int uc_get_history (const data_set_t *ds, const value_list_t *vl, return (uc_get_history_by_name (name, ret_history, num_steps, num_ds)); } /* int uc_get_history */ +int uc_get_hits (const data_set_t *ds, const value_list_t *vl) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = STATE_ERROR; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_get_hits */ + +int uc_set_hits (const data_set_t *ds, const value_list_t *vl, int hits) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = -1; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + ce->hits = hits; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_set_hits */ + +int uc_inc_hits (const data_set_t *ds, const value_list_t *vl, int step) +{ + char name[6 * DATA_MAX_NAME_LEN]; + cache_entry_t *ce = NULL; + int ret = -1; + + if (FORMAT_VL (name, sizeof (name), vl) != 0) + { + ERROR ("uc_get_state: FORMAT_VL failed."); + return (STATE_ERROR); + } + + pthread_mutex_lock (&cache_lock); + + if (c_avl_get (cache_tree, name, (void *) &ce) == 0) + { + assert (ce != NULL); + ret = ce->hits; + ce->hits = ret + step; + } + + pthread_mutex_unlock (&cache_lock); + + return (ret); +} /* int uc_inc_hits */ + /* * Meta data interface */ /* XXX: This function will acquire `cache_lock' but will not free it! */ -static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */ +static meta_data_t *uc_get_meta (const value_list_t *vl) /* {{{ */ { char name[6 * DATA_MAX_NAME_LEN]; cache_entry_t *ce = NULL; @@ -898,7 +996,6 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */ if (status != 0) { pthread_mutex_unlock (&cache_lock); - NOTICE ("utils_cache: uc_get_meta: No such cache entry: %s", name); return (NULL); } assert (ce != NULL); @@ -906,6 +1003,9 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */ if (ce->meta == NULL) ce->meta = meta_data_create (); + if (ce->meta == NULL) + pthread_mutex_unlock (&cache_lock); + return (ce->meta); } /* }}} meta_data_t *uc_get_meta */ @@ -920,10 +1020,10 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */ pthread_mutex_unlock (&cache_lock); \ return (status); \ } -int uc_meta_data_exists (value_list_t *vl, const char *key) +int uc_meta_data_exists (const value_list_t *vl, const char *key) UC_WRAP (meta_data_exists) -int uc_meta_data_delete (value_list_t *vl, const char *key) +int uc_meta_data_delete (const value_list_t *vl, const char *key) UC_WRAP (meta_data_delete) #undef UC_WRAP @@ -938,44 +1038,44 @@ int uc_meta_data_delete (value_list_t *vl, const char *key) pthread_mutex_unlock (&cache_lock); \ return (status); \ } -int uc_meta_data_add_string (value_list_t *vl, +int uc_meta_data_add_string (const value_list_t *vl, const char *key, const char *value) UC_WRAP(meta_data_add_string) -int uc_meta_data_add_signed_int (value_list_t *vl, +int uc_meta_data_add_signed_int (const value_list_t *vl, const char *key, int64_t value) UC_WRAP(meta_data_add_signed_int) -int uc_meta_data_add_unsigned_int (value_list_t *vl, +int uc_meta_data_add_unsigned_int (const value_list_t *vl, const char *key, uint64_t value) UC_WRAP(meta_data_add_unsigned_int) -int uc_meta_data_add_double (value_list_t *vl, +int uc_meta_data_add_double (const value_list_t *vl, const char *key, double value) UC_WRAP(meta_data_add_double) -int uc_meta_data_add_boolean (value_list_t *vl, +int uc_meta_data_add_boolean (const value_list_t *vl, const char *key, _Bool value) UC_WRAP(meta_data_add_boolean) -int uc_meta_data_get_string (value_list_t *vl, +int uc_meta_data_get_string (const value_list_t *vl, const char *key, char **value) UC_WRAP(meta_data_get_string) -int uc_meta_data_get_signed_int (value_list_t *vl, +int uc_meta_data_get_signed_int (const value_list_t *vl, const char *key, int64_t *value) UC_WRAP(meta_data_get_signed_int) -int uc_meta_data_get_unsigned_int (value_list_t *vl, +int uc_meta_data_get_unsigned_int (const value_list_t *vl, const char *key, uint64_t *value) UC_WRAP(meta_data_get_unsigned_int) -int uc_meta_data_get_double (value_list_t *vl, +int uc_meta_data_get_double (const value_list_t *vl, const char *key, double *value) UC_WRAP(meta_data_get_double) -int uc_meta_data_get_boolean (value_list_t *vl, +int uc_meta_data_get_boolean (const value_list_t *vl, const char *key, _Bool *value) UC_WRAP(meta_data_get_boolean)