From f4fd83170248b7945de8105a0ecbe13e11dbbcfe Mon Sep 17 00:00:00 2001 From: oetiker Date: Tue, 19 Feb 2008 12:56:44 +0000 Subject: [PATCH] Generate a random cur_row for each RRA during 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 --- src/rrd_create.c | 20 +++++++++++++++++++- src/rrd_info.c | 3 +++ src/rrd_restore.c | 36 ++++++++++++++++++++++-------------- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/rrd_create.c b/src/rrd_create.c index a8f6a29..027c6ab 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -4,6 +4,8 @@ * rrd_create.c creates new rrds *****************************************************************************/ +#include +#include #include #include "rrd_tool.h" @@ -22,6 +24,8 @@ void parseGENERIC_DS( const char *def, rrd_t *rrd, int ds_idx); +long int rra_random_row( + rra_def_t *); int rrd_create( int argc, @@ -766,7 +770,7 @@ int rrd_create_fn( * 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)); } @@ -805,3 +809,17 @@ int rrd_create_fn( 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 239a7ab..3c0ee0e 100644 --- a/src/rrd_info.c +++ b/src/rrd_info.c @@ -186,6 +186,9 @@ info_t *rrd_info_r( 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 d3a2c8a..6997cab 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -52,6 +52,8 @@ void parse_FAILURES_history( rrd_t *rrd, int rra_index, int ds_index); +long int rra_random_row( + rra_def_t *); /* convert all occurrences of to */ @@ -617,12 +619,6 @@ int xml2rrd( 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; @@ -639,7 +635,7 @@ int rrd_creat( 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; @@ -678,18 +674,30 @@ int rrd_creat( 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)) { -- 2.11.0