X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrdtool.c;h=56a82d0321b8a875fdc1a8b5c93e312550388b77;hb=a7afd4e00c2fe8f070a640a8dccdd3af673c8a2c;hp=1e9e52a93cbd8e52b774f48c42c2902bb01b3b03;hpb=d91c8449c887c87cd776d06eb07b78cca73707b1;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index 1e9e52a9..56a82d03 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -109,7 +109,7 @@ static rrdcreate_config_t rrdcreate_config = * ALWAYS lock `cache_lock' first! */ static cdtime_t cache_timeout = 0; static cdtime_t cache_flush_timeout = 0; -static cdtime_t random_timeout = 1; +static cdtime_t random_timeout = TIME_T_TO_CDTIME_T (1); static cdtime_t cache_flush_last; static c_avl_tree_t *cache = NULL; static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER; @@ -305,7 +305,7 @@ static void *rrd_queue_thread (void __attribute__((unused)) *data) pthread_mutex_lock (&queue_lock); /* Wait for values to arrive */ - while (true) + while (42) { struct timespec ts_wait; @@ -344,7 +344,7 @@ static void *rrd_queue_thread (void __attribute__((unused)) *data) &ts_wait); if (status == ETIMEDOUT) break; - } /* while (true) */ + } /* while (42) */ /* XXX: If you need to lock both, cache_lock and queue_lock, at * the same time, ALWAYS lock `cache_lock' first! */ @@ -661,6 +661,14 @@ static int64_t rrd_get_random_variation (void) if (random_timeout <= 0) return (0); + /* Assure that "cache_timeout + random_variation" is never negative. */ + if (random_timeout > cache_timeout) + { + INFO ("rrdtool plugin: Adjusting \"RandomTimeout\" to %.3f seconds.", + CDTIME_T_TO_DOUBLE (cache_timeout)); + 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); @@ -674,9 +682,6 @@ static int64_t rrd_get_random_variation (void) if (negative) ret *= -1; - DEBUG ("rrdtool plugin: random_variation = %.3f s", - (negative ? -1.0 : 1.0) * dbl_timeout * rand_fact); - return (ret); } /* int64_t rrd_get_random_variation */ @@ -709,7 +714,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->random_variation = rrd_get_random_variation (); rc->flags = FLAG_NONE; new_rc = 1; } @@ -780,7 +785,7 @@ static int rrd_cache_insert (const char *filename, filename, rc->values_num, CDTIME_T_TO_DOUBLE (rc->last_value - rc->first_value)); - if ((rc->last_value + rc->random_variation - rc->first_value) >= cache_timeout) + if ((rc->last_value - rc->first_value) >= (cache_timeout + rc->random_variation)) { /* XXX: If you need to lock both, cache_lock and queue_lock, at * the same time, ALWAYS lock `cache_lock' first! */ @@ -993,7 +998,7 @@ static int rrd_config (const char *key, const char *value) } else if (strcasecmp ("StepSize", key) == 0) { - int temp = atoi (value); + unsigned long temp = strtoul (value, NULL, 0); if (temp > 0) rrdcreate_config.stepsize = temp; } @@ -1101,7 +1106,7 @@ static int rrd_config (const char *key, const char *value) } else { - cache_timeout = DOUBLE_TO_CDTIME_T (tmp); + random_timeout = DOUBLE_TO_CDTIME_T (tmp); } } else @@ -1156,18 +1161,16 @@ static int rrd_init (void) return (0); init_once = 1; - if (rrdcreate_config.stepsize < 0) - rrdcreate_config.stepsize = 0; if (rrdcreate_config.heartbeat <= 0) rrdcreate_config.heartbeat = 2 * rrdcreate_config.stepsize; if ((rrdcreate_config.heartbeat > 0) - && (rrdcreate_config.heartbeat < interval_g)) + && (rrdcreate_config.heartbeat < CDTIME_T_TO_TIME_T (interval_g))) WARNING ("rrdtool plugin: Your `heartbeat' is " "smaller than your `interval'. This will " "likely cause problems."); else if ((rrdcreate_config.stepsize > 0) - && (rrdcreate_config.stepsize < interval_g)) + && (rrdcreate_config.stepsize < CDTIME_T_TO_TIME_T (interval_g))) WARNING ("rrdtool plugin: Your `stepsize' is " "smaller than your `interval'. This will " "create needlessly big RRD-files."); @@ -1201,7 +1204,7 @@ static int rrd_init (void) } queue_thread_running = 1; - DEBUG ("rrdtool plugin: rrd_init: datadir = %s; stepsize = %i;" + DEBUG ("rrdtool plugin: rrd_init: datadir = %s; stepsize = %lu;" " heartbeat = %i; rrarows = %i; xff = %lf;", (datadir == NULL) ? "(null)" : datadir, rrdcreate_config.stepsize,