X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdtool.c;h=fad1e4b4455d5c6403df9ecc3a09522edade8981;hb=2354eda94fa44c8bcb8e39b24b117e7937110224;hp=77d8716619dfd32df737853dd9f1865ee55c76ad;hpb=09c6d16ffba1b1b15e50579bbcf663f05f630932;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index 77d87166..fad1e4b4 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -24,6 +24,8 @@ #include "common.h" #include "utils_avltree.h" +#include + #if HAVE_PTHREAD_H # include #endif @@ -103,7 +105,7 @@ static double xff = 0.1; static int cache_timeout = 0; static int cache_flush_timeout = 0; static time_t cache_flush_last; -static avl_tree_t *cache = NULL; +static c_avl_tree_t *cache = NULL; static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER; static rrd_queue_t *queue_head = NULL; @@ -193,7 +195,7 @@ static int rra_get (char ***ret, const value_list_t *vl) span = rts[i]; if ((span / ss) < rrarows) - continue; + span = ss * rrarows; if (cdp_len == 0) cdp_len = 1; @@ -589,10 +591,10 @@ static int value_list_to_filename (char *buffer, int buffer_len, if (strlen (vl->type_instance) > 0) status = snprintf (buffer + offset, buffer_len - offset, - "%s-%s.rrd", ds->type, vl->type_instance); + "%s-%s.rrd", vl->type, vl->type_instance); else status = snprintf (buffer + offset, buffer_len - offset, - "%s.rrd", ds->type); + "%s.rrd", vl->type); if ((status < 1) || (status >= buffer_len - offset)) return (-1); offset += status; @@ -639,7 +641,7 @@ static void *rrd_queue_thread (void *data) * we make a copy of it's values */ pthread_mutex_lock (&cache_lock); - avl_get (cache, queue_entry->filename, (void *) &cache_entry); + c_avl_get (cache, queue_entry->filename, (void *) &cache_entry); values = cache_entry->values; values_num = cache_entry->values_num; @@ -652,6 +654,8 @@ static void *rrd_queue_thread (void *data) /* Write the values to the RRD-file */ srrd_update (queue_entry->filename, NULL, values_num, values); + DEBUG ("rrdtool plugin: queue thread: Wrote %i values to %s", + values_num, queue_entry->filename); for (i = 0; i < values_num; i++) { @@ -663,7 +667,7 @@ static void *rrd_queue_thread (void *data) } /* while (42) */ pthread_mutex_lock (&cache_lock); - avl_destroy (cache); + c_avl_destroy (cache); cache = NULL; pthread_mutex_unlock (&cache_lock); @@ -711,7 +715,7 @@ static void rrd_cache_flush (int timeout) int keys_num = 0; char *key; - avl_iterator_t *iter; + c_avl_iterator_t *iter; int i; DEBUG ("rrdtool plugin: Flushing cache, timeout = %i", timeout); @@ -719,11 +723,9 @@ static void rrd_cache_flush (int timeout) now = time (NULL); /* Build a list of entries to be flushed */ - iter = avl_get_iterator (cache); - while (avl_iterator_next (iter, (void *) &key, (void *) &rc) == 0) + iter = c_avl_get_iterator (cache); + while (c_avl_iterator_next (iter, (void *) &key, (void *) &rc) == 0) { - DEBUG ("key = %s; age = %i;", key, now - rc->first_value); - if (rc->flags == FLAG_QUEUED) continue; else if ((now - rc->first_value) < timeout) @@ -735,29 +737,31 @@ static void rrd_cache_flush (int timeout) } else /* ancient and no values -> waste of memory */ { - keys = (char **) realloc ((void *) keys, + char **tmp = (char **) realloc ((void *) keys, (keys_num + 1) * sizeof (char *)); - if (keys == NULL) + if (tmp == NULL) { char errbuf[1024]; ERROR ("rrdtool plugin: " "realloc failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); - avl_iterator_destroy (iter); + c_avl_iterator_destroy (iter); + sfree (keys); return; } + keys = tmp; keys[keys_num] = key; keys_num++; } - } /* while (avl_iterator_next) */ - avl_iterator_destroy (iter); + } /* while (c_avl_iterator_next) */ + c_avl_iterator_destroy (iter); for (i = 0; i < keys_num; i++) { - if (avl_remove (cache, keys[i], (void *) &key, (void *) &rc) != 0) + if (c_avl_remove (cache, keys[i], (void *) &key, (void *) &rc) != 0) { - DEBUG ("rrdtool plugin: avl_remove (%s) failed.", keys[i]); + DEBUG ("rrdtool plugin: c_avl_remove (%s) failed.", keys[i]); continue; } @@ -769,7 +773,7 @@ static void rrd_cache_flush (int timeout) keys[i] = NULL; } /* for (i = 0..keys_num) */ - free (keys); + sfree (keys); cache_flush_last = now; } /* void rrd_cache_flush */ @@ -783,7 +787,7 @@ static int rrd_cache_insert (const char *filename, pthread_mutex_lock (&cache_lock); - avl_get (cache, filename, (void *) &rc); + c_avl_get (cache, filename, (void *) &rc); if (rc == NULL) { @@ -816,7 +820,7 @@ static int rrd_cache_insert (const char *filename, sstrerror (errno, errbuf, sizeof (errbuf)); - avl_remove (cache, filename, &cache_key, NULL); + c_avl_remove (cache, filename, &cache_key, NULL); pthread_mutex_unlock (&cache_lock); ERROR ("rrdtool plugin: realloc failed: %s", errbuf); @@ -856,11 +860,13 @@ static int rrd_cache_insert (const char *filename, return (-1); } - avl_insert (cache, cache_key, rc); + c_avl_insert (cache, cache_key, rc); } - DEBUG ("rrd_cache_insert (%s, %s, %u) = %p", filename, value, - (unsigned int) value_time, (void *) rc); + DEBUG ("rrdtool plugin: rrd_cache_insert: file = %s; " + "values_num = %i; age = %u;", + filename, rc->values_num, + rc->last_value - rc->first_value); if ((rc->last_value - rc->first_value) >= cache_timeout) { @@ -887,6 +893,19 @@ static int rrd_cache_insert (const char *filename, return (0); } /* int rrd_cache_insert */ +static int rrd_compare_numeric (const void *a_ptr, const void *b_ptr) +{ + int a = *((int *) a_ptr); + int b = *((int *) b_ptr); + + if (a < b) + return (-1); + else if (a > b) + return (1); + else + return (0); +} /* int rrd_compare_numeric */ + static int rrd_write (const data_set_t *ds, const value_list_t *vl) { struct stat statbuf; @@ -894,6 +913,11 @@ static int rrd_write (const data_set_t *ds, const value_list_t *vl) char values[512]; int status; + if (0 != strcmp (ds->type, vl->type)) { + ERROR ("rrdtool plugin: DS type does not match value list type"); + return -1; + } + if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0) return (-1); @@ -928,6 +952,20 @@ static int rrd_write (const data_set_t *ds, const value_list_t *vl) return (status); } /* int rrd_write */ +static int rrd_flush (const int timeout) +{ + pthread_mutex_lock (&cache_lock); + + if (cache == NULL) { + pthread_mutex_unlock (&cache_lock); + return (0); + } + + rrd_cache_flush (timeout); + pthread_mutex_unlock (&cache_lock); + return (0); +} /* int rrd_flush */ + static int rrd_config (const char *key, const char *value) { if (strcasecmp ("CacheTimeout", key) == 0) @@ -1025,6 +1063,12 @@ static int rrd_config (const char *key, const char *value) if (rra_timespans_custom[rra_timespans_custom_num] != 0) rra_timespans_custom_num++; } /* while (strtok_r) */ + + qsort (/* base = */ rra_timespans_custom, + /* nmemb = */ rra_timespans_custom_num, + /* size = */ sizeof (rra_timespans_custom[0]), + /* compar = */ rrd_compare_numeric); + free (value_copy); } else if (strcasecmp ("XFF", key) == 0) @@ -1051,6 +1095,11 @@ static int rrd_shutdown (void) rrd_cache_flush (-1); pthread_mutex_unlock (&cache_lock); + pthread_mutex_lock (&queue_lock); + do_shutdown = 1; + pthread_cond_signal (&queue_cond); + pthread_mutex_unlock (&queue_lock); + /* Wait for all the values to be written to disk before returning. */ if (queue_thread != 0) { @@ -1059,11 +1108,6 @@ static int rrd_shutdown (void) DEBUG ("rrdtool plugin: queue_thread exited."); } - pthread_mutex_lock (&queue_lock); - do_shutdown = 1; - pthread_cond_signal (&queue_cond); - pthread_mutex_unlock (&queue_lock); - return (0); } /* int rrd_shutdown */ @@ -1074,12 +1118,7 @@ static int rrd_init (void) if (stepsize < 0) stepsize = 0; if (heartbeat <= 0) - { - if (stepsize > 0) - heartbeat = 2 * stepsize; - else - heartbeat = 0; - } + heartbeat = 2 * stepsize; if ((heartbeat > 0) && (heartbeat < interval_g)) WARNING ("rrdtool plugin: Your `heartbeat' is " @@ -1093,10 +1132,10 @@ static int rrd_init (void) /* Set the cache up */ pthread_mutex_lock (&cache_lock); - cache = avl_create ((int (*) (const void *, const void *)) strcmp); + cache = c_avl_create ((int (*) (const void *, const void *)) strcmp); if (cache == NULL) { - ERROR ("rrdtool plugin: avl_create failed."); + ERROR ("rrdtool plugin: c_avl_create failed."); return (-1); } @@ -1132,5 +1171,6 @@ void module_register (void) config_keys, config_keys_num); plugin_register_init ("rrdtool", rrd_init); plugin_register_write ("rrdtool", rrd_write); + plugin_register_flush ("rrdtool", rrd_flush); plugin_register_shutdown ("rrdtool", rrd_shutdown); }