bindings/erlang: Added README.
[collectd.git] / src / rrdtool.c
index 2787944..ee5d70c 100644 (file)
@@ -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 <octo at verplant.org>
+ *   Sebastian Harl <sh at tokkee.org>
+ *   Mariusz Gronczewski <xani666 at gmail.com>
  **/
 
 #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;
@@ -742,8 +746,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 +757,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 +1009,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
        {