summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 8fafd09)
raw | patch | inline | side by side (parent: 8fafd09)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Tue, 19 Feb 2008 12:56:44 +0000 (12:56 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Tue, 19 Feb 2008 12:56:44 +0000 (12:56 +0000) |
create/restore operations. This effectively randomizes the block crossings
among RRDs created around the same time. Previously, RRDs that were
created/restored en masse would cross block boundaries simultaneously, which
is sub-optimal.
Also, this patch enables the user to see the RRA's cur_row pointer via
rrdinfo. This was useful during debugging.
-- kevin brintnall kbrint qwest.net
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1290 a5681a0c-68f1-0310-ab6d-d61299d08faa
among RRDs created around the same time. Previously, RRDs that were
created/restored en masse would cross block boundaries simultaneously, which
is sub-optimal.
Also, this patch enables the user to see the RRA's cur_row pointer via
rrdinfo. This was useful during debugging.
-- kevin brintnall kbrint qwest.net
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1290 a5681a0c-68f1-0310-ab6d-d61299d08faa
src/rrd_create.c | patch | blob | history | |
src/rrd_info.c | patch | blob | history | |
src/rrd_restore.c | patch | blob | history |
diff --git a/src/rrd_create.c b/src/rrd_create.c
index a8f6a2967fb1abaf8740e1559008b7a191f3b739..027c6abd1bc10c5fd40d015686e0bea3b6d461fa 100644 (file)
--- a/src/rrd_create.c
+++ b/src/rrd_create.c
* rrd_create.c creates new rrds
*****************************************************************************/
+#include <stdlib.h>
+#include <time.h>
#include <locale.h>
#include "rrd_tool.h"
const char *def,
rrd_t *rrd,
int ds_idx);
+long int rra_random_row(
+ rra_def_t *);
int rrd_create(
int argc,
* would occur for cur_row = 1 because rrd_update increments
* the pointer a priori. */
for (i = 0; i < rrd->stat_head->rra_cnt; i++) {
- rrd->rra_ptr->cur_row = rrd->rra_def[i].row_cnt - 1;
+ rrd->rra_ptr->cur_row = rra_random_row(&rrd->rra_def[i]);
write(rrd_file, rrd->rra_ptr, sizeof(rra_ptr_t));
}
rrd_close(rrd_file_dn);
return (0);
}
+
+static int rand_init = 0;
+
+long int
+rra_random_row(rra_def_t *rra)
+{
+ if (!rand_init)
+ {
+ srandom((unsigned int)time(NULL) + (unsigned int)getpid());
+ rand_init++;
+ }
+
+ return random() % rra->row_cnt;
+}
diff --git a/src/rrd_info.c b/src/rrd_info.c
index 239a7ab76e977fcb6e2c4327eb7d1492fb681efe..3c0ee0e832e9a0410986b58e1190776169eb2f13 100644 (file)
--- a/src/rrd_info.c
+++ b/src/rrd_info.c
info.u_cnt = rrd.rra_def[i].row_cnt;
cd = info_push(cd, sprintf_alloc("rra[%d].rows", i), RD_I_CNT, info);
+ info.u_cnt=rrd.rra_ptr[i].cur_row;
+ cd=info_push(cd,sprintf_alloc("rra[%d].cur_row",i), RD_I_CNT, info);
+
info.u_cnt = rrd.rra_def[i].pdp_cnt;
cd = info_push(cd, sprintf_alloc("rra[%d].pdp_per_row", i), RD_I_CNT,
info);
diff --git a/src/rrd_restore.c b/src/rrd_restore.c
index d3a2c8a91c3066d45c046c1b845e1d608a848b2c..6997cab9501230edde74d966434b45029913de88 100644 (file)
--- a/src/rrd_restore.c
+++ b/src/rrd_restore.c
rrd_t *rrd,
int rra_index,
int ds_index);
+long int rra_random_row(
+ rra_def_t *);
/* convert all occurrences of <BlaBlaBla> to <blablabla> */
return (-1);
}
- for (i = 0; i < (int) rrd->stat_head->rra_cnt; i++) {
- /* last row in the xml file is the most recent; as
- * rrd_update increments the current row pointer, set cur_row
- * here to the last row. */
- rrd->rra_ptr[i].cur_row = rrd->rra_def[i].row_cnt - 1;
- }
if (ptr == NULL)
return -1;
return 1;
rrd_t *rrd,
char force_overwrite)
{
- unsigned long i, ii, val_cnt;
+ unsigned long i, ii, rra_offset;
FILE *rrd_file = NULL;
int fdflags;
int fd;
fwrite(rrd->cdp_prep, sizeof(cdp_prep_t), rrd->stat_head->rra_cnt *
rrd->stat_head->ds_cnt, rrd_file);
+
+ for(i=0; i < rrd->stat_head->rra_cnt; i++)
+ rrd->rra_ptr[i].cur_row = rra_random_row(&rrd->rra_def[i]);
+
fwrite(rrd->rra_ptr, sizeof(rra_ptr_t), rrd->stat_head->rra_cnt,
rrd_file);
+ /* Dump RRD values */
+ rra_offset=0;
+ for(i=0; i < rrd->stat_head->rra_cnt; i++)
+ {
+ unsigned long num_rows = rrd->rra_def[i].row_cnt;
+ unsigned long cur_row = rrd->rra_ptr[i].cur_row;
+ unsigned long ds_cnt = rrd->stat_head->ds_cnt;
- /* calculate the number of rrd_values to dump */
- val_cnt = 0;
- for (i = 0; i < rrd->stat_head->rra_cnt; i++)
- for (ii = 0; ii < rrd->rra_def[i].row_cnt * rrd->stat_head->ds_cnt;
- ii++)
- val_cnt++;
- fwrite(rrd->rrd_value, sizeof(rrd_value_t), val_cnt, rrd_file);
+ fwrite(rrd->rrd_value + (rra_offset + num_rows-1 - cur_row) * ds_cnt,
+ sizeof(rrd_value_t), (cur_row+1)*ds_cnt, rrd_file);
+
+ fwrite(rrd->rrd_value + rra_offset * ds_cnt,
+ sizeof(rrd_value_t), (num_rows-1 - cur_row)*ds_cnt, rrd_file);
+
+ rra_offset += num_rows;
+ }
/* lets see if we had an error */
if (ferror(rrd_file)) {