X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Frrdtool.c;h=80833902a21e7b05656c3d6baa4fb91ffd5d170d;hb=c97eef40cf19b106e6a00006a3b8f3f9ee409045;hp=b1d13ee3c19ee279c836741739b521359872c63b;hpb=a05485da75ec42a9aa38354e0d0364885b1ecad9;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index b1d13ee3..80833902 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -1,6 +1,6 @@ /** * collectd - src/rrdtool.c - * Copyright (C) 2006-2008 Florian octo Forster + * Copyright (C) 2006-2013 Florian octo Forster * Copyright (C) 2008-2008 Sebastian Harl * Copyright (C) 2009 Mariusz Gronczewski * @@ -18,7 +18,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster * Sebastian Harl * Mariusz Gronczewski **/ @@ -27,6 +27,7 @@ #include "plugin.h" #include "common.h" #include "utils_avltree.h" +#include "utils_random.h" #include "utils_rrdcreate.h" #include @@ -75,6 +76,7 @@ static const char *config_keys[] = { "CacheTimeout", "CacheFlush", + "CreateFilesAsync", "DataDir", "StepSize", "HeartBeat", @@ -102,7 +104,9 @@ static rrdcreate_config_t rrdcreate_config = /* timespans_num = */ 0, /* consolidation_functions = */ NULL, - /* consolidation_functions_num = */ 0 + /* consolidation_functions_num = */ 0, + + /* async = */ 0 }; /* XXX: If you need to lock both, cache_lock and queue_lock, at the same time, @@ -240,47 +244,26 @@ static int value_list_to_string (char *buffer, int buffer_len, return (0); } /* int value_list_to_string */ -static int value_list_to_filename (char *buffer, int buffer_len, - const data_set_t __attribute__((unused)) *ds, const value_list_t *vl) +static int value_list_to_filename (char *buffer, size_t buffer_size, + value_list_t const *vl) { - int offset = 0; + char const suffix[] = ".rrd"; int status; + size_t len; - if (datadir != NULL) - { - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", datadir); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; - } + status = FORMAT_VL (buffer, buffer_size, vl); + if (status != 0) + return (status); - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->host); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + len = strlen (buffer); + assert (len < buffer_size); + buffer += len; + buffer_size -= len; - if (strlen (vl->plugin_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s/", vl->plugin, vl->plugin_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->plugin); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; - - if (strlen (vl->type_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s.rrd", vl->type, vl->type_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s.rrd", vl->type); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + if (buffer_size <= sizeof (suffix)) + return (ENOMEM); + memcpy (buffer, suffix, sizeof (suffix)); return (0); } /* int value_list_to_filename */ @@ -652,11 +635,8 @@ static int rrd_cache_flush_identifier (cdtime_t timeout, static int64_t rrd_get_random_variation (void) { - double dbl_timeout; - cdtime_t ctm_timeout; - double rand_fact; - _Bool negative; - int64_t ret; + long min; + long max; if (random_timeout <= 0) return (0); @@ -669,20 +649,10 @@ static int64_t rrd_get_random_variation (void) random_timeout = cache_timeout; } - /* This seems a bit complicated, but "random_timeout" is likely larger than - * RAND_MAX, so we can't simply use modulo here. */ - dbl_timeout = CDTIME_T_TO_DOUBLE (random_timeout); - rand_fact = ((double) random ()) - / ((double) RAND_MAX); - negative = (_Bool) (random () % 2); - - ctm_timeout = DOUBLE_TO_CDTIME_T (dbl_timeout * rand_fact); + max = (long) (random_timeout / 2); + min = max - ((long) random_timeout); - ret = (int64_t) ctm_timeout; - if (negative) - ret *= -1; - - return (ret); + return ((int64_t) cdrand_range (min, max)); } /* int64_t rrd_get_random_variation */ static int rrd_cache_insert (const char *filename, @@ -896,7 +866,7 @@ static int rrd_write (const data_set_t *ds, const value_list_t *vl, return -1; } - if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0) + if (value_list_to_filename (filename, sizeof (filename), vl) != 0) return (-1); if (value_list_to_string (values, sizeof (values), ds, vl) != 0) @@ -910,6 +880,8 @@ static int rrd_write (const data_set_t *ds, const value_list_t *vl, ds, vl, &rrdcreate_config); if (status != 0) return (-1); + else if (rrdcreate_config.async) + return (0); } else { @@ -1008,6 +980,13 @@ static int rrd_config (const char *key, const char *value) if (temp > 0) rrdcreate_config.heartbeat = temp; } + else if (strcasecmp ("CreateFilesAsync", key) == 0) + { + if (IS_TRUE (value)) + rrdcreate_config.async = 1; + else + rrdcreate_config.async = 0; + } else if (strcasecmp ("RRARows", key) == 0) { int tmp = atoi (value);