X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdtool.c;h=71da54749fe1d1a6377bbe450551e04658e433bb;hb=9f6f901889d4c9f594b5ae1fd0f449fcdd2d8fe3;hp=0ffbd122aa30b03f31cf19900d9627875f121ac1;hpb=dc61df5bf2ec9fe2c2aea6142505a73b3406d8e3;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index 0ffbd122..71da5474 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -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, @@ -646,11 +650,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); @@ -663,20 +664,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); - - ret = (int64_t) ctm_timeout; - if (negative) - ret *= -1; + max = (long) (random_timeout / 2); + min = max - ((long) random_timeout); - return (ret); + return ((int64_t) cdrand_range (min, max)); } /* int64_t rrd_get_random_variation */ static int rrd_cache_insert (const char *filename, @@ -904,6 +895,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 { @@ -1002,6 +995,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);