From: Andrés J. Díaz Date: Tue, 11 Aug 2009 19:57:34 +0000 (+0200) Subject: src/utils_cache.c: Update GETVAL output when missing state. X-Git-Tag: collectd-4.7.3~13 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=b6c75ecde000fd1377338a1ceb40f567ff60fbb6;p=collectd.git src/utils_cache.c: Update GETVAL output when missing state. Hi I think that I've found a bug when use unixsock plugin. The problem is releate with missing state, when no value is received by daemon for a while in the cache is marked as MISSING, but the last value is still showing even when machine is not reporting in a GETVAL and LISTVAL commands. Some utlities like collectd-nagios does not work correctly, and report an OKAY value when host is not reporting from a long time. I attach a patch with check the state value of an cache entry in uc_get_names and in uc_get_rate_by_name. This patch works for me, but it's not very tested yet, and I not very sure about if it's a good way to check the problem. The patch is tested on 4.7.2 release version. BTW a GETSTATE command will be an useful feature too :P Regards, Andres Signed-off-by: Florian Forster --- diff --git a/src/utils_cache.c b/src/utils_cache.c index 60d32832..4d2c5549 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -497,16 +497,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 @@ -579,6 +587,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;