/**
* collectd - src/rrdtool.c
- * Copyright (C) 2006 Florian octo Forster
+ * Copyright (C) 2006,2007 Florian octo Forster
*
* 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
int values_num;
char **values;
time_t first_value;
+ time_t last_value;
};
typedef struct rrd_cache_s rrd_cache_t;
return (ds_num);
}
-static int rrd_create_file (char *filename, const data_set_t *ds)
+static int rrd_create_file (char *filename, const data_set_t *ds, const value_list_t *vl)
{
char **argv;
int argc;
int ds_num;
int i, j;
char stepsize_str[16];
+ char begin_str[16];
int status = 0;
if (check_create_dir (filename))
return (-1);
}
- argc = ds_num + rra_num + 4;
+ argc = ds_num + rra_num + 6;
if ((argv = (char **) malloc (sizeof (char *) * (argc + 1))) == NULL)
{
return (-1);
}
+ assert (vl->time > 10);
+ status = snprintf (begin_str, sizeof (begin_str),
+ "%llu", (unsigned long long) (vl->time - 10));
+ if ((status < 1) || (status >= sizeof (begin_str)))
+ {
+ ERROR ("rrdtool plugin: snprintf failed.");
+ return (-1);
+ }
+
argv[0] = "create";
argv[1] = filename;
- argv[2] = "-s";
- argv[3] = stepsize_str;
+ argv[2] = "-b";
+ argv[3] = begin_str;
+ argv[4] = "-s";
+ argv[5] = stepsize_str;
- j = 4;
+ j = 6;
for (i = 0; i < ds_num; i++)
argv[j++] = ds_def[i];
for (i = 0; i < rra_num; i++)
int status;
int i;
- memset (buffer, '\0', sizeof (buffer_len));
+ memset (buffer, '\0', buffer_len);
status = snprintf (buffer, buffer_len, "%u", (unsigned int) vl->time);
if ((status < 1) || (status >= buffer_len))
} /* int value_list_to_filename */
static rrd_cache_t *rrd_cache_insert (const char *filename,
- const char *value)
+ const char *value, time_t value_time)
{
rrd_cache_t *rc = NULL;
int new_rc = 0;
rc->values_num = 0;
rc->values = NULL;
rc->first_value = 0;
+ rc->last_value = 0;
new_rc = 1;
}
+ if (rc->last_value >= value_time)
+ {
+ WARNING ("rrdtool plugin: (rc->last_value = %u) >= (value_time = %u)",
+ (unsigned int) rc->last_value,
+ (unsigned int) value_time);
+ return (NULL);
+ }
+
rc->values = (char **) realloc ((void *) rc->values,
(rc->values_num + 1) * sizeof (char *));
if (rc->values == NULL)
rc->values_num++;
if (rc->values_num == 1)
- rc->first_value = time (NULL);
+ rc->first_value = value_time;
+ rc->last_value = value_time;
/* Insert if this is the first value */
if ((cache != NULL) && (new_rc == 1))
avl_insert (cache, cache_key, rc);
}
- DEBUG ("rrd_cache_insert (%s, %s) = %p", filename, value, (void *) rc);
+ DEBUG ("rrd_cache_insert (%s, %s, %u) = %p", filename, value,
+ (unsigned int) value_time, (void *) rc);
return (rc);
} /* rrd_cache_t *rrd_cache_insert */
if (cache == NULL)
return;
- DEBUG ("Flushing cache, timeout = %i", timeout);
+ DEBUG ("rrdtool plugin: Flushing cache, timeout = %i", timeout);
now = time (NULL);
{
if (avl_remove (cache, keys[i], (void *) &key, (void *) &rc) != 0)
{
- DEBUG ("avl_remove (%s) failed.", keys[i]);
+ DEBUG ("rrdtool plugin: avl_remove (%s) failed.", keys[i]);
continue;
}
} /* for (i = 0..keys_num) */
free (keys);
- DEBUG ("Flushed %i value(s)", keys_num);
cache_flush_last = now;
} /* void rrd_cache_flush */
{
if (errno == ENOENT)
{
- if (rrd_create_file (filename, ds))
+ if (rrd_create_file (filename, ds, vl))
return (-1);
}
else
}
pthread_mutex_lock (&cache_lock);
- rc = rrd_cache_insert (filename, values);
+ rc = rrd_cache_insert (filename, values, vl->time);
if (rc == NULL)
{
pthread_mutex_unlock (&cache_lock);
return (0);
} /* int rrd_init */
-void module_register (modreg_e load)
+void module_register (void)
{
plugin_register_config ("rrdtool", rrd_config,
config_keys, config_keys_num);