Code

Merge branch 'collectd-5.2' into collectd-5.3
authorFlorian Forster <octo@collectd.org>
Fri, 12 Jul 2013 16:21:31 +0000 (18:21 +0200)
committerFlorian Forster <octo@collectd.org>
Fri, 12 Jul 2013 16:21:31 +0000 (18:21 +0200)
1  2 
src/common.c
src/rrdcached.c
src/rrdtool.c

diff --combined src/common.c
index d617832ca48d6a29680ea7482df8b67e13255b5f,5de7d97b9ef3e9dfb090816aa2c1418567e4f43a..c41c4fe629dd14685e543964d9a7c05b7d8f399b
@@@ -361,22 -361,6 +361,22 @@@ int strunescape (char *buf, size_t buf_
        return (0);
  } /* int strunescape */
  
 +size_t strstripnewline (char *buffer)
 +{
 +      size_t buffer_len = strlen (buffer);
 +
 +      while (buffer_len > 0)
 +      {
 +              if ((buffer[buffer_len - 1] != '\n')
 +                              && (buffer[buffer_len - 1] != '\r'))
 +                      break;
 +              buffer[buffer_len] = 0;
 +              buffer_len--;
 +      }
 +
 +      return (buffer_len);
 +} /* size_t strstripnewline */
 +
  int escape_slashes (char *buf, int buf_len)
  {
        int i;
@@@ -680,7 -664,7 +680,7 @@@ long long get_kstat_value (kstat_t *ksp
                retval = (long long) kn->value.ui64; /* XXX: Might overflow! */
        else
                WARNING ("get_kstat_value: Not a numeric value: %s", name);
-                
        return (retval);
  }
  #endif /* HAVE_LIBKSTAT */
@@@ -787,36 -771,43 +787,43 @@@ int format_name (char *ret, int ret_len
                const char *plugin, const char *plugin_instance,
                const char *type, const char *type_instance)
  {
-       int  status;
-       assert (plugin != NULL);
-       assert (type != NULL);
-       if ((plugin_instance == NULL) || (strlen (plugin_instance) == 0))
-       {
-               if ((type_instance == NULL) || (strlen (type_instance) == 0))
-                       status = ssnprintf (ret, ret_len, "%s/%s/%s",
-                                       hostname, plugin, type);
-               else
-                       status = ssnprintf (ret, ret_len, "%s/%s/%s-%s",
-                                       hostname, plugin, type,
-                                       type_instance);
-       }
-       else
-       {
-               if ((type_instance == NULL) || (strlen (type_instance) == 0))
-                       status = ssnprintf (ret, ret_len, "%s/%s-%s/%s",
-                                       hostname, plugin, plugin_instance,
-                                       type);
-               else
-                       status = ssnprintf (ret, ret_len, "%s/%s-%s/%s-%s",
-                                       hostname, plugin, plugin_instance,
-                                       type, type_instance);
-       }
-       if ((status < 1) || (status >= ret_len))
-               return (-1);
-       return (0);
+   char *buffer;
+   size_t buffer_size;
+   buffer = ret;
+   buffer_size = (size_t) ret_len;
+ #define APPEND(str) do {                                               \
+   size_t l = strlen (str);                                             \
+   if (l >= buffer_size)                                                \
+     return (ENOBUFS);                                                  \
+   memcpy (buffer, (str), l);                                           \
+   buffer += l; buffer_size -= l;                                       \
+ } while (0)
+   assert (plugin != NULL);
+   assert (type != NULL);
+   APPEND (hostname);
+   APPEND ("/");
+   APPEND (plugin);
+   if ((plugin_instance != NULL) && (plugin_instance[0] != 0))
+   {
+     APPEND ("-");
+     APPEND (plugin_instance);
+   }
+   APPEND ("/");
+   APPEND (type);
+   if ((type_instance != NULL) && (type_instance[0] != 0))
+   {
+     APPEND ("-");
+     APPEND (type_instance);
+   }
+   assert (buffer_size > 0);
+   buffer[0] = 0;
+ #undef APPEND
+   return (0);
  } /* int format_name */
  
  int format_values (char *ret, size_t ret_len, /* {{{ */
@@@ -1412,35 -1403,3 +1419,35 @@@ int strtoderive (const char *string, de
        *ret_value = tmp;
        return (0);
  } /* }}} int strtoderive */
 +
 +int strarray_add (char ***ret_array, size_t *ret_array_len, char const *str) /* {{{ */
 +{
 +      char **array;
 +      size_t array_len = *ret_array_len;
 +
 +      if (str == NULL)
 +              return (EINVAL);
 +
 +      array = realloc (*ret_array,
 +            (array_len + 1) * sizeof (*array));
 +      if (array == NULL)
 +              return (ENOMEM);
 +      *ret_array = array;
 +
 +      array[array_len] = strdup (str);
 +      if (array[array_len] == NULL)
 +              return (ENOMEM);
 +
 +      array_len++;
 +        *ret_array_len = array_len;
 +      return (0);
 +} /* }}} int strarray_add */
 +
 +void strarray_free (char **array, size_t array_len) /* {{{ */
 +{
 +      size_t i;
 +
 +      for (i = 0; i < array_len; i++)
 +              sfree (array[i]);
 +      sfree (array);
 +} /* }}} void strarray_free */
diff --combined src/rrdcached.c
index 7e0b1e77ef3b523f45eb3a188598a0ee3b8bae2a,cf23803138dec2bb8ee59cc8a6819785a72c5fb8..e5e11d4317b045fbb8587a3de3cc3f332653e858
@@@ -46,9 -46,7 +46,9 @@@ static rrdcreate_config_t rrdcreate_con
        /* timespans_num = */ 0,
  
        /* consolidation_functions = */ NULL,
 -      /* consolidation_functions_num = */ 0
 +      /* consolidation_functions_num = */ 0,
 +
 +      /* async = */ 0
  };
  
  /*
@@@ -114,52 -112,26 +114,26 @@@ static int value_list_to_string (char *
    return (0);
  } /* 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)
+ static int value_list_to_filename (char *buffer, size_t buffer_size,
+     value_list_t const *vl)
  {
-   int offset = 0;
+   char const suffix[] = ".rrd";
    int status;
+   size_t len;
  
-   assert (0 == strcmp (ds->type, vl->type));
-   if (datadir != NULL)
-   {
-     status = ssnprintf (buffer + offset, buffer_len - offset,
-         "%s/", datadir);
-     if ((status < 1) || (status >= buffer_len - offset))
-       return (-1);
-     offset += status;
-   }
-   status = ssnprintf (buffer + offset, buffer_len - offset,
-       "%s/", vl->host);
-   if ((status < 1) || (status >= buffer_len - offset))
-     return (-1);
-   offset += status;
-   if (strlen (vl->plugin_instance) > 0)
-     status = ssnprintf (buffer + offset, buffer_len - offset,
-         "%s-%s/", vl->plugin, vl->plugin_instance);
-   else
-     status = ssnprintf (buffer + offset, buffer_len - offset,
-         "%s/", vl->plugin);
-   if ((status < 1) || (status >= buffer_len - offset))
-     return (-1);
-   offset += status;
+   status = FORMAT_VL (buffer, buffer_size, vl);
+   if (status != 0)
+     return (status);
  
-   if (strlen (vl->type_instance) > 0)
-     status = ssnprintf (buffer + offset, buffer_len - offset,
-         "%s-%s", vl->type, vl->type_instance);
-   else
-     status = ssnprintf (buffer + offset, buffer_len - offset,
-         "%s", vl->type);
-   if ((status < 1) || (status >= buffer_len - offset))
-     return (-1);
-   offset += status;
+   len = strlen (buffer);
+   assert (len < buffer_size);
+   buffer += len;
+   buffer_size -= len;
  
-   strncpy (buffer + offset, ".rrd", buffer_len - offset);
-   buffer[buffer_len - 1] = 0;
+   if (buffer_size <= sizeof (suffix))
+     return (ENOMEM);
  
+   memcpy (buffer, suffix, sizeof (suffix));
    return (0);
  } /* int value_list_to_filename */
  
@@@ -252,8 -224,6 +226,8 @@@ static int rc_config (oconfig_item_t *c
        status = cf_util_get_string (child, &daemon_address);
      else if (strcasecmp ("CreateFiles", key) == 0)
        status = cf_util_get_boolean (child, &config_create_files);
 +    else if (strcasecmp ("CreateFilesAsync", key) == 0)
 +      status = cf_util_get_boolean (child, &rrdcreate_config.async);
      else if (strcasecmp ("CollectStatistics", key) == 0)
        status = cf_util_get_boolean (child, &config_collect_stats);
      else if (strcasecmp ("StepSize", key) == 0)
@@@ -434,7 -404,7 +408,7 @@@ static int rc_write (const data_set_t *
      return (-1);
    }
  
-   if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0)
+   if (value_list_to_filename (filename, sizeof (filename), vl) != 0)
    {
      ERROR ("rrdcached plugin: value_list_to_filename failed.");
      return (-1);
              filename);
          return (-1);
        }
 +      else if (rrdcreate_config.async)
 +        return (0);
      }
    }
  
diff --combined src/rrdtool.c
index 2c80762ecb905454f843620fd86cf3cd449ba8f7,916ce01d65f03585341eab2fd0ab3cae70669dd4..80833902a21e7b05656c3d6baa4fb91ffd5d170d
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/rrdtool.c
 - * Copyright (C) 2006-2008  Florian octo Forster
 + * Copyright (C) 2006-2013  Florian octo Forster
   * Copyright (C) 2008-2008  Sebastian Harl
   * Copyright (C) 2009       Mariusz Gronczewski
   *
@@@ -18,7 -18,7 +18,7 @@@
   * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
   *
   * Authors:
 - *   Florian octo Forster <octo at verplant.org>
 + *   Florian octo Forster <octo at collectd.org>
   *   Sebastian Harl <sh at tokkee.org>
   *   Mariusz Gronczewski <xani666 at gmail.com>
   **/
@@@ -27,7 -27,6 +27,7 @@@
  #include "plugin.h"
  #include "common.h"
  #include "utils_avltree.h"
 +#include "utils_random.h"
  #include "utils_rrdcreate.h"
  
  #include <rrd.h>
@@@ -76,7 -75,6 +76,7 @@@ static const char *config_keys[] 
  {
        "CacheTimeout",
        "CacheFlush",
 +      "CreateFilesAsync",
        "DataDir",
        "StepSize",
        "HeartBeat",
@@@ -104,9 -102,7 +104,9 @@@ static rrdcreate_config_t rrdcreate_con
        /* 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,
@@@ -244,47 -240,26 +244,26 @@@ static int value_list_to_string (char *
        return (0);
  } /* int value_list_to_string */
  
- static int value_list_to_filename (char *buffer, int buffer_len,
-               const data_set_t __attribute__((unused)) *ds, const value_list_t *vl)
+ static int value_list_to_filename (char *buffer, size_t buffer_size,
+               value_list_t const *vl)
  {
-       int offset = 0;
+       char const suffix[] = ".rrd";
        int status;
+       size_t len;
  
-       if (datadir != NULL)
-       {
-               status = ssnprintf (buffer + offset, buffer_len - offset,
-                               "%s/", datadir);
-               if ((status < 1) || (status >= buffer_len - offset))
-                       return (-1);
-               offset += status;
-       }
-       status = ssnprintf (buffer + offset, buffer_len - offset,
-                       "%s/", vl->host);
-       if ((status < 1) || (status >= buffer_len - offset))
-               return (-1);
-       offset += status;
+       status = FORMAT_VL (buffer, buffer_size, vl);
+       if (status != 0)
+               return (status);
  
-       if (strlen (vl->plugin_instance) > 0)
-               status = ssnprintf (buffer + offset, buffer_len - offset,
-                               "%s-%s/", vl->plugin, vl->plugin_instance);
-       else
-               status = ssnprintf (buffer + offset, buffer_len - offset,
-                               "%s/", vl->plugin);
-       if ((status < 1) || (status >= buffer_len - offset))
-               return (-1);
-       offset += status;
+       len = strlen (buffer);
+       assert (len < buffer_size);
+       buffer += len;
+       buffer_size -= len;
  
-       if (strlen (vl->type_instance) > 0)
-               status = ssnprintf (buffer + offset, buffer_len - offset,
-                               "%s-%s.rrd", vl->type, vl->type_instance);
-       else
-               status = ssnprintf (buffer + offset, buffer_len - offset,
-                               "%s.rrd", vl->type);
-       if ((status < 1) || (status >= buffer_len - offset))
-               return (-1);
-       offset += status;
+       if (buffer_size <= sizeof (suffix))
+               return (ENOMEM);
  
+       memcpy (buffer, suffix, sizeof (suffix));
        return (0);
  } /* int value_list_to_filename */
  
@@@ -656,8 -631,11 +635,8 @@@ static int rrd_cache_flush_identifier (
  
  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);
          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,
@@@ -887,7 -875,7 +866,7 @@@ static int rrd_write (const data_set_t 
                return -1;
        }
  
-       if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0)
+       if (value_list_to_filename (filename, sizeof (filename), vl) != 0)
                return (-1);
  
        if (value_list_to_string (values, sizeof (values), ds, vl) != 0)
                                        ds, vl, &rrdcreate_config);
                        if (status != 0)
                                return (-1);
 +                      else if (rrdcreate_config.async)
 +                              return (0);
                }
                else
                {
@@@ -1001,13 -987,6 +980,13 @@@ static int rrd_config (const char *key
                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);