X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdtool.c;h=ed1ced1f6547ce87ec698f39b9a986545baa5de4;hb=74525016b183d71f0a5685fa54507078f3f82640;hp=2787944330b28959ec81d8c25a9e9d90d9fe6f23;hpb=fd48357ddeb1b58d5795015e845f3105a7ba3103;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index 27879443..ed1ced1f 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -1,6 +1,8 @@ /** * collectd - src/rrdtool.c * Copyright (C) 2006-2008 Florian octo Forster + * Copyright (C) 2008-2008 Sebastian Harl + * Copyright (C) 2009 Mariusz Gronczewski * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,6 +19,8 @@ * * Authors: * Florian octo Forster + * Sebastian Harl + * Mariusz Gronczewski **/ #include "collectd.h" @@ -40,6 +44,7 @@ struct rrd_cache_s char **values; time_t first_value; time_t last_value; + int random_variation; enum { FLAG_NONE = 0x00, @@ -105,7 +110,6 @@ static rrdcreate_config_t rrdcreate_config = static int cache_timeout = 0; static int cache_flush_timeout = 0; static int random_timeout = 1; -static int random_timeout_mod = 1; static time_t cache_flush_last; static c_avl_tree_t *cache = NULL; static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER; @@ -672,6 +676,7 @@ static int rrd_cache_insert (const char *filename, rc->values = NULL; rc->first_value = 0; rc->last_value = 0; + rc->random_variation = 0; rc->flags = FLAG_NONE; new_rc = 1; } @@ -742,8 +747,7 @@ static int rrd_cache_insert (const char *filename, filename, rc->values_num, (unsigned long)(rc->last_value - rc->first_value)); - - if ((rc->last_value - rc->first_value) >= (cache_timeout + (random_timeout - (rand() % random_timeout_mod) ) ) ) + if ((rc->last_value + rc->random_variation - rc->first_value) >= cache_timeout) { /* XXX: If you need to lock both, cache_lock and queue_lock, at * the same time, ALWAYS lock `cache_lock' first! */ @@ -754,6 +758,18 @@ static int rrd_cache_insert (const char *filename, status = rrd_queue_enqueue (filename, &queue_head, &queue_tail); if (status == 0) rc->flags = FLAG_QUEUED; + + /* Update the jitter value. Negative values are + * slightly preferred. */ + if (random_timeout > 0) + { + rc->random_variation = (rand () % (2 * random_timeout)) + - random_timeout; + } + else + { + rc->random_variation = 0; + } } else { @@ -994,16 +1010,20 @@ static int rrd_config (const char *key, const char *value) } else if (strcasecmp ("RandomTimeout", key) == 0) { - random_timeout = atoi (value); - if( random_timeout < 0 ) + int tmp; + + tmp = atoi (value); + if (tmp < 0) + { + fprintf (stderr, "rrdtool: `RandomTimeout' must " + "be greater than or equal to zero.\n"); + ERROR ("rrdtool: `RandomTimeout' must " + "be greater then or equal to zero."); + } + else { - fprintf (stderr, "rrdtool: `RandomTimeout' must " - "be greater than or equal to zero.\n"); - ERROR ("rrdtool: `RandomTimeout' must " - "be greater then or equal to zero.\n"); + random_timeout = tmp; } - else if (random_timeout==0) {random_timeout=1;} - else {random_timeout_mod = random_timeout * 2;} } else {