From: Florian Forster Date: Fri, 12 Jul 2013 16:21:31 +0000 (+0200) Subject: Merge branch 'collectd-5.2' into collectd-5.3 X-Git-Tag: collectd-5.3.1~2 X-Git-Url: https://git.tokkee.org/?p=collectd.git;a=commitdiff_plain;h=bc389fa32a48a64306f7ec008f4548f05fdb7c80;hp=-c Merge branch 'collectd-5.2' into collectd-5.3 --- bc389fa32a48a64306f7ec008f4548f05fdb7c80 diff --combined src/common.c index d617832c,5de7d97b..c41c4fe6 --- a/src/common.c +++ b/src/common.c @@@ -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 7e0b1e77,cf238031..e5e11d43 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@@ -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); @@@ -471,8 -441,6 +445,8 @@@ filename); return (-1); } + else if (rrdcreate_config.async) + return (0); } } diff --combined src/rrdtool.c index 2c80762e,916ce01d..80833902 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@@ -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 + * Florian octo Forster * Sebastian Harl * Mariusz Gronczewski **/ @@@ -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 @@@ -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); @@@ -670,10 -648,20 +649,10 @@@ 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) @@@ -901,8 -889,6 +880,8 @@@ 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);