Merge branch 'collectd-4.5' into collectd-4.6
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Mon, 4 May 2009 15:12:54 +0000 (17:12 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Mon, 4 May 2009 15:12:54 +0000 (17:12 +0200)
1  2 
src/ntpd.c
src/rrdtool.c

diff --combined src/ntpd.c
@@@ -300,6 -300,7 +300,6 @@@ static void ntpd_submit (char *type, ch
  
        vl.values = values;
        vl.values_len = 1;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "ntpd", sizeof (vl.plugin));
        sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance));
        plugin_dispatch_values (&vl);
  }
  
 -/* returns `tv0 - tv1' in milliseconds or 0 if `tv1 > tv0' */
 -static int timeval_sub (const struct timeval *tv0, const struct timeval *tv1)
 -{
 -      int sec;
 -      int usec;
 -
 -      if ((tv0->tv_sec < tv1->tv_sec)
 -                      || ((tv0->tv_sec == tv1->tv_sec) && (tv0->tv_usec < tv1->tv_usec)))
 -              return (0);
 -
 -      sec  = tv0->tv_sec  - tv1->tv_sec;
 -      usec = tv0->tv_usec - tv1->tv_usec;
 -
 -      while (usec < 0)
 -      {
 -              usec += 1000000;
 -              sec  -= 1;
 -      }
 -
 -      if (sec < 0)
 -              return (0);
 -
 -      return ((sec * 1000) + ((usec + 500) / 1000));
 -}
 -
  static int ntpd_connect (void)
  {
        char *host;
@@@ -433,8 -459,6 +433,8 @@@ static int ntpd_receive_response (int *
        done = 0;
        while (done == 0)
        {
 +              struct timeval time_left;
 +
                if (gettimeofday (&time_now, NULL) < 0)
                {
                        char errbuf[1024];
                        return (-1);
                }
  
 +              if (timeval_cmp (time_end, time_now, &time_left) <= 0)
 +                      timeout = 0;
 +              else
 +                      timeout = 1000 * time_left.tv_sec
 +                              + ((time_left.tv_usec + 500) / 1000);
 +
                /* timeout reached */
 -              if ((timeout = timeval_sub (&time_end, &time_now)) == 0)
 +              if (timeout <= 0)
                        break;
  
                poll_s.fd      = sd;
@@@ -878,25 -896,33 +878,33 @@@ static int ntpd_read (void
  
                        if (ptr->v6_flag)
                        {
-                               struct sockaddr_in6 *sa_ptr;
-                               sa_ptr = (struct sockaddr_in6 *) &sa;
+                               struct sockaddr_in6 sa6;
  
-                               sa_ptr->sin6_family = AF_INET6;
-                               sa_ptr->sin6_port = htons (123);
-                               memcpy (&sa_ptr->sin6_addr, &ptr->srcadr6,
+                               assert (sizeof (sa) >= sizeof (sa6));
+                               memset (&sa6, 0, sizeof (sa6));
+                               sa6.sin6_family = AF_INET6;
+                               sa6.sin6_port = htons (123);
+                               memcpy (&sa6.sin6_addr, &ptr->srcadr6,
                                                sizeof (struct in6_addr));
-                               sa_len = sizeof (struct sockaddr_in6);
+                               sa_len = sizeof (sa6);
+                               memcpy (&sa, &sa6, sizeof (sa6));
                        }
                        else
                        {
-                               struct sockaddr_in *sa_ptr;
-                               sa_ptr = (struct sockaddr_in *) &sa;
+                               struct sockaddr_in sa4;
  
-                               sa_ptr->sin_family = AF_INET;
-                               sa_ptr->sin_port = htons (123);
-                               memcpy (&sa_ptr->sin_addr, &ptr->srcadr,
+                               assert (sizeof (sa) >= sizeof (sa4));
+                               memset (&sa4, 0, sizeof (sa4));
+                               sa4.sin_family = AF_INET;
+                               sa4.sin_port = htons (123);
+                               memcpy (&sa4.sin_addr, &ptr->srcadr,
                                                sizeof (struct in_addr));
-                               sa_len = sizeof (struct sockaddr_in);
+                               sa_len = sizeof (sa4);
+                               memcpy (&sa, &sa4, sizeof (sa4));
                        }
  
                        if (do_reverse_lookups == 0)
diff --combined src/rrdtool.c
@@@ -23,7 -23,6 +23,7 @@@
  #include "plugin.h"
  #include "common.h"
  #include "utils_avltree.h"
 +#include "utils_rrdcreate.h"
  
  #include <rrd.h>
  
@@@ -66,6 -65,27 +66,6 @@@ typedef struct rrd_queue_s rrd_queue_t
  /*
   * Private variables
   */
 -static int rra_timespans[] =
 -{
 -      3600,
 -      86400,
 -      604800,
 -      2678400,
 -      31622400
 -};
 -static int rra_timespans_num = STATIC_ARRAY_SIZE (rra_timespans);
 -
 -static int *rra_timespans_custom = NULL;
 -static int rra_timespans_custom_num = 0;
 -
 -static char *rra_types[] =
 -{
 -      "AVERAGE",
 -      "MIN",
 -      "MAX"
 -};
 -static int rra_types_num = STATIC_ARRAY_SIZE (rra_types);
 -
  static const char *config_keys[] =
  {
        "CacheTimeout",
@@@ -83,21 -103,12 +83,21 @@@ static int config_keys_num = STATIC_ARR
  /* If datadir is zero, the daemon's basedir is used. If stepsize or heartbeat
   * is zero a default, depending on the `interval' member of the value list is
   * being used. */
 -static char   *datadir   = NULL;
 -static int     stepsize  = 0;
 -static int     heartbeat = 0;
 -static int     rrarows   = 1200;
 -static double  xff       = 0.1;
 -static double  write_rate = 0.0;
 +static char *datadir   = NULL;
 +static double write_rate = 0.0;
 +static rrdcreate_config_t rrdcreate_config =
 +{
 +      /* stepsize = */ 0,
 +      /* heartbeat = */ 0,
 +      /* rrarows = */ 1200,
 +      /* xff = */ 0.1,
 +
 +      /* timespans = */ NULL,
 +      /* timespans_num = */ 0,
 +
 +      /* consolidation_functions = */ NULL,
 +      /* consolidation_functions_num = */ 0
 +};
  
  /* XXX: If you need to lock both, cache_lock and queue_lock, at the same time,
   * ALWAYS lock `cache_lock' first! */
@@@ -121,7 -132,233 +121,7 @@@ static pthread_mutex_t librrd_lock = PT
  
  static int do_shutdown = 0;
  
 -/* * * * * * * * * *
 - * WARNING:  Magic *
 - * * * * * * * * * */
 -
 -static void rra_free (int rra_num, char **rra_def)
 -{
 -      int i;
 -
 -      for (i = 0; i < rra_num; i++)
 -      {
 -              sfree (rra_def[i]);
 -      }
 -      sfree (rra_def);
 -} /* void rra_free */
 -
 -static int rra_get (char ***ret, const value_list_t *vl)
 -{
 -      char **rra_def;
 -      int rra_num;
 -
 -      int *rts;
 -      int  rts_num;
 -
 -      int rra_max;
 -
 -      int span;
 -
 -      int cdp_num;
 -      int cdp_len;
 -      int i, j;
 -
 -      char buffer[64];
 -
 -      /* The stepsize we use here: If it is user-set, use it. If not, use the
 -       * interval of the value-list. */
 -      int ss;
 -
 -      if (rrarows <= 0)
 -      {
 -              *ret = NULL;
 -              return (-1);
 -      }
 -
 -      ss = (stepsize > 0) ? stepsize : vl->interval;
 -      if (ss <= 0)
 -      {
 -              *ret = NULL;
 -              return (-1);
 -      }
 -
 -      /* Use the configured timespans or fall back to the built-in defaults */
 -      if (rra_timespans_custom_num != 0)
 -      {
 -              rts = rra_timespans_custom;
 -              rts_num = rra_timespans_custom_num;
 -      }
 -      else
 -      {
 -              rts = rra_timespans;
 -              rts_num = rra_timespans_num;
 -      }
 -
 -      rra_max = rts_num * rra_types_num;
 -
 -      if ((rra_def = (char **) malloc ((rra_max + 1) * sizeof (char *))) == NULL)
 -              return (-1);
 -      memset (rra_def, '\0', (rra_max + 1) * sizeof (char *));
 -      rra_num = 0;
 -
 -      cdp_len = 0;
 -      for (i = 0; i < rts_num; i++)
 -      {
 -              span = rts[i];
 -
 -              if ((span / ss) < rrarows)
 -                      span = ss * rrarows;
 -
 -              if (cdp_len == 0)
 -                      cdp_len = 1;
 -              else
 -                      cdp_len = (int) floor (((double) span)
 -                                      / ((double) (rrarows * ss)));
 -
 -              cdp_num = (int) ceil (((double) span)
 -                              / ((double) (cdp_len * ss)));
 -
 -              for (j = 0; j < rra_types_num; j++)
 -              {
 -                      if (rra_num >= rra_max)
 -                              break;
 -
 -                      if (ssnprintf (buffer, sizeof (buffer), "RRA:%s:%3.1f:%u:%u",
 -                                              rra_types[j], xff,
 -                                              cdp_len, cdp_num) >= sizeof (buffer))
 -                      {
 -                              ERROR ("rra_get: Buffer would have been truncated.");
 -                              continue;
 -                      }
 -
 -                      rra_def[rra_num++] = sstrdup (buffer);
 -              }
 -      }
 -
 -#if COLLECT_DEBUG
 -      DEBUG ("rra_num = %i", rra_num);
 -      for (i = 0; i < rra_num; i++)
 -              DEBUG ("  %s", rra_def[i]);
 -#endif
 -
 -      *ret = rra_def;
 -      return (rra_num);
 -} /* int rra_get */
 -
 -static void ds_free (int ds_num, char **ds_def)
 -{
 -      int i;
 -
 -      for (i = 0; i < ds_num; i++)
 -              if (ds_def[i] != NULL)
 -                      free (ds_def[i]);
 -      free (ds_def);
 -}
 -
 -static int ds_get (char ***ret, const data_set_t *ds, const value_list_t *vl)
 -{
 -      char **ds_def;
 -      int ds_num;
 -
 -      char min[32];
 -      char max[32];
 -      char buffer[128];
 -
 -      DEBUG ("ds->ds_num = %i", ds->ds_num);
 -
 -      ds_def = (char **) malloc (ds->ds_num * sizeof (char *));
 -      if (ds_def == NULL)
 -      {
 -              char errbuf[1024];
 -              ERROR ("rrdtool plugin: malloc failed: %s",
 -                              sstrerror (errno, errbuf, sizeof (errbuf)));
 -              return (-1);
 -      }
 -      memset (ds_def, '\0', ds->ds_num * sizeof (char *));
 -
 -      for (ds_num = 0; ds_num < ds->ds_num; ds_num++)
 -      {
 -              data_source_t *d = ds->ds + ds_num;
 -              char *type;
 -              int status;
 -
 -              ds_def[ds_num] = NULL;
 -
 -              if (d->type == DS_TYPE_COUNTER)
 -                      type = "COUNTER";
 -              else if (d->type == DS_TYPE_GAUGE)
 -                      type = "GAUGE";
 -              else
 -              {
 -                      ERROR ("rrdtool plugin: Unknown DS type: %i",
 -                                      d->type);
 -                      break;
 -              }
 -
 -              if (isnan (d->min))
 -              {
 -                      sstrncpy (min, "U", sizeof (min));
 -              }
 -              else
 -                      ssnprintf (min, sizeof (min), "%lf", d->min);
 -
 -              if (isnan (d->max))
 -              {
 -                      sstrncpy (max, "U", sizeof (max));
 -              }
 -              else
 -                      ssnprintf (max, sizeof (max), "%lf", d->max);
 -
 -              status = ssnprintf (buffer, sizeof (buffer),
 -                              "DS:%s:%s:%i:%s:%s",
 -                              d->name, type,
 -                              (heartbeat > 0) ? heartbeat : (2 * vl->interval),
 -                              min, max);
 -              if ((status < 1) || (status >= sizeof (buffer)))
 -                      break;
 -
 -              ds_def[ds_num] = sstrdup (buffer);
 -      } /* for ds_num = 0 .. ds->ds_num */
 -
 -#if COLLECT_DEBUG
 -{
 -      int i;
 -      DEBUG ("ds_num = %i", ds_num);
 -      for (i = 0; i < ds_num; i++)
 -              DEBUG ("  %s", ds_def[i]);
 -}
 -#endif
 -
 -      if (ds_num != ds->ds_num)
 -      {
 -              ds_free (ds_num, ds_def);
 -              return (-1);
 -      }
 -
 -      *ret = ds_def;
 -      return (ds_num);
 -}
 -
  #if HAVE_THREADSAFE_LIBRRD
 -static int srrd_create (char *filename, unsigned long pdp_step, time_t last_up,
 -              int argc, const char **argv)
 -{
 -      int status;
 -
 -      optind = 0; /* bug in librrd? */
 -      rrd_clear_error ();
 -
 -      status = rrd_create_r (filename, pdp_step, last_up, argc, (void *) argv);
 -
 -      if (status != 0)
 -      {
 -              WARNING ("rrdtool plugin: rrd_create_r (%s) failed: %s",
 -                              filename, rrd_get_error ());
 -      }
 -
 -      return (status);
 -} /* int srrd_create */
 -
  static int srrd_update (char *filename, char *template,
                int argc, const char **argv)
  {
  /* #endif HAVE_THREADSAFE_LIBRRD */
  
  #else /* !HAVE_THREADSAFE_LIBRRD */
 -static int srrd_create (char *filename, unsigned long pdp_step, time_t last_up,
 -              int argc, const char **argv)
 -{
 -      int status;
 -
 -      int new_argc;
 -      char **new_argv;
 -
 -      char pdp_step_str[16];
 -      char last_up_str[16];
 -
 -      new_argc = 6 + argc;
 -      new_argv = (char **) malloc ((new_argc + 1) * sizeof (char *));
 -      if (new_argv == NULL)
 -      {
 -              ERROR ("rrdtool plugin: malloc failed.");
 -              return (-1);
 -      }
 -
 -      if (last_up == 0)
 -              last_up = time (NULL) - 10;
 -
 -      ssnprintf (pdp_step_str, sizeof (pdp_step_str), "%lu", pdp_step);
 -      ssnprintf (last_up_str, sizeof (last_up_str), "%u", (unsigned int) last_up);
 -
 -      new_argv[0] = "create";
 -      new_argv[1] = filename;
 -      new_argv[2] = "-s";
 -      new_argv[3] = pdp_step_str;
 -      new_argv[4] = "-b";
 -      new_argv[5] = last_up_str;
 -
 -      memcpy (new_argv + 6, argv, argc * sizeof (char *));
 -      new_argv[new_argc] = NULL;
 -      
 -      pthread_mutex_lock (&librrd_lock);
 -      optind = 0; /* bug in librrd? */
 -      rrd_clear_error ();
 -
 -      status = rrd_create (new_argc, new_argv);
 -      pthread_mutex_unlock (&librrd_lock);
 -
 -      if (status != 0)
 -      {
 -              WARNING ("rrdtool plugin: rrd_create (%s) failed: %s",
 -                              filename, rrd_get_error ());
 -      }
 -
 -      sfree (new_argv);
 -
 -      return (status);
 -} /* int srrd_create */
 -
  static int srrd_update (char *filename, char *template,
                int argc, const char **argv)
  {
  } /* int srrd_update */
  #endif /* !HAVE_THREADSAFE_LIBRRD */
  
 -static int rrd_create_file (char *filename, const data_set_t *ds, const value_list_t *vl)
 -{
 -      char **argv;
 -      int argc;
 -      char **rra_def;
 -      int rra_num;
 -      char **ds_def;
 -      int ds_num;
 -      int status = 0;
 -
 -      if (check_create_dir (filename))
 -              return (-1);
 -
 -      if ((rra_num = rra_get (&rra_def, vl)) < 1)
 -      {
 -              ERROR ("rrd_create_file failed: Could not calculate RRAs");
 -              return (-1);
 -      }
 -
 -      if ((ds_num = ds_get (&ds_def, ds, vl)) < 1)
 -      {
 -              ERROR ("rrd_create_file failed: Could not calculate DSes");
 -              return (-1);
 -      }
 -
 -      argc = ds_num + rra_num;
 -
 -      if ((argv = (char **) malloc (sizeof (char *) * (argc + 1))) == NULL)
 -      {
 -              char errbuf[1024];
 -              ERROR ("rrd_create failed: %s",
 -                              sstrerror (errno, errbuf, sizeof (errbuf)));
 -              return (-1);
 -      }
 -
 -      memcpy (argv, ds_def, ds_num * sizeof (char *));
 -      memcpy (argv + ds_num, rra_def, rra_num * sizeof (char *));
 -      argv[ds_num + rra_num] = NULL;
 -
 -      assert (vl->time > 10);
 -      status = srrd_create (filename,
 -                      (stepsize > 0) ? stepsize : vl->interval,
 -                      vl->time - 10,
 -                      argc, (const char **)argv);
 -
 -      free (argv);
 -      ds_free (ds_num, ds_def);
 -      rra_free (rra_num, rra_def);
 -
 -      return (status);
 -}
 -
  static int value_list_to_string (char *buffer, int buffer_len,
                const data_set_t *ds, const value_list_t *vl)
  {
  } /* int value_list_to_string */
  
  static int value_list_to_filename (char *buffer, int buffer_len,
 -              const data_set_t *ds, const value_list_t *vl)
 +              const data_set_t __attribute__((unused)) *ds, const value_list_t *vl)
  {
        int offset = 0;
        int status;
        return (0);
  } /* int value_list_to_filename */
  
 -static void *rrd_queue_thread (void *data)
 +static void *rrd_queue_thread (void __attribute__((unused)) *data)
  {
          struct timeval tv_next_update;
          struct timeval tv_now;
                int    status;
                int    i;
  
+               values = NULL;
+               values_num = 0;
                  pthread_mutex_lock (&queue_lock);
                  /* Wait for values to arrive */
                  while (true)
                      break;
  
                    gettimeofday (&tv_now, /* timezone = */ NULL);
 -                  status = timeval_sub_timespec (&tv_next_update, &tv_now,
 -                      &ts_wait);
 +                  status = timeval_cmp (tv_next_update, tv_now, NULL);
                    /* We're good to go */
 -                  if (status != 0)
 +                  if (status <= 0)
                      break;
  
                    /* We're supposed to wait a bit with this update, so we'll
@@@ -788,9 -1134,7 +791,9 @@@ static int rrd_write (const data_set_t 
        {
                if (errno == ENOENT)
                {
 -                      if (rrd_create_file (filename, ds, vl))
 +                      status = cu_rrd_create_file (filename,
 +                                      ds, vl, &rrdcreate_config);
 +                      if (status != 0)
                                return (-1);
                }
                else
@@@ -879,15 -1223,15 +882,15 @@@ static int rrd_config (const char *key
        }
        else if (strcasecmp ("StepSize", key) == 0)
        {
 -              stepsize = atoi (value);
 -              if (stepsize < 0)
 -                      stepsize = 0;
 +              int temp = atoi (value);
 +              if (temp > 0)
 +                      rrdcreate_config.stepsize = temp;
        }
        else if (strcasecmp ("HeartBeat", key) == 0)
        {
 -              heartbeat = atoi (value);
 -              if (heartbeat < 0)
 -                      heartbeat = 0;
 +              int temp = atoi (value);
 +              if (temp > 0)
 +                      rrdcreate_config.heartbeat = temp;
        }
        else if (strcasecmp ("RRARows", key) == 0)
        {
                                        "be greater than 0.\n");
                        return (1);
                }
 -              rrarows = tmp;
 +              rrdcreate_config.rrarows = tmp;
        }
        else if (strcasecmp ("RRATimespan", key) == 0)
        {
                {
                        dummy = NULL;
                        
 -                      tmp_alloc = realloc (rra_timespans_custom,
 -                                      sizeof (int) * (rra_timespans_custom_num + 1));
 +                      tmp_alloc = realloc (rrdcreate_config.timespans,
 +                                      sizeof (int) * (rrdcreate_config.timespans_num + 1));
                        if (tmp_alloc == NULL)
                        {
                                fprintf (stderr, "rrdtool: realloc failed.\n");
                                free (value_copy);
                                return (1);
                        }
 -                      rra_timespans_custom = tmp_alloc;
 -                      rra_timespans_custom[rra_timespans_custom_num] = atoi (ptr);
 -                      if (rra_timespans_custom[rra_timespans_custom_num] != 0)
 -                              rra_timespans_custom_num++;
 +                      rrdcreate_config.timespans = tmp_alloc;
 +                      rrdcreate_config.timespans[rrdcreate_config.timespans_num] = atoi (ptr);
 +                      if (rrdcreate_config.timespans[rrdcreate_config.timespans_num] != 0)
 +                              rrdcreate_config.timespans_num++;
                } /* while (strtok_r) */
  
 -              qsort (/* base = */ rra_timespans_custom,
 -                              /* nmemb  = */ rra_timespans_custom_num,
 -                              /* size   = */ sizeof (rra_timespans_custom[0]),
 +              qsort (/* base = */ rrdcreate_config.timespans,
 +                              /* nmemb  = */ rrdcreate_config.timespans_num,
 +                              /* size   = */ sizeof (rrdcreate_config.timespans[0]),
                                /* compar = */ rrd_compare_numeric);
  
                free (value_copy);
                                        "be in the range 0 to 1 (exclusive).");
                        return (1);
                }
 -              xff = tmp;
 +              rrdcreate_config.xff = tmp;
        }
        else if (strcasecmp ("WritesPerSecond", key) == 0)
        {
@@@ -1006,18 -1350,16 +1009,18 @@@ static int rrd_init (void
  {
        int status;
  
 -      if (stepsize < 0)
 -              stepsize = 0;
 -      if (heartbeat <= 0)
 -              heartbeat = 2 * stepsize;
 +      if (rrdcreate_config.stepsize < 0)
 +              rrdcreate_config.stepsize = 0;
 +      if (rrdcreate_config.heartbeat <= 0)
 +              rrdcreate_config.heartbeat = 2 * rrdcreate_config.stepsize;
  
 -      if ((heartbeat > 0) && (heartbeat < interval_g))
 +      if ((rrdcreate_config.heartbeat > 0)
 +                      && (rrdcreate_config.heartbeat < interval_g))
                WARNING ("rrdtool plugin: Your `heartbeat' is "
                                "smaller than your `interval'. This will "
                                "likely cause problems.");
 -      else if ((stepsize > 0) && (stepsize < interval_g))
 +      else if ((rrdcreate_config.stepsize > 0)
 +                      && (rrdcreate_config.stepsize < interval_g))
                WARNING ("rrdtool plugin: Your `stepsize' is "
                                "smaller than your `interval'. This will "
                                "create needlessly big RRD-files.");
        DEBUG ("rrdtool plugin: rrd_init: datadir = %s; stepsize = %i;"
                        " heartbeat = %i; rrarows = %i; xff = %lf;",
                        (datadir == NULL) ? "(null)" : datadir,
 -                      stepsize, heartbeat, rrarows, xff);
 +                      rrdcreate_config.stepsize,
 +                      rrdcreate_config.heartbeat,
 +                      rrdcreate_config.rrarows,
 +                      rrdcreate_config.xff);
  
        return (0);
  } /* int rrd_init */