From 0595044bb29c5babe84f2bb41f282e69ff6303d1 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/branches/1.2/program@1290 a5681a0c-68f1-0310-ab6d-d61299d08faa --- src/rrd_create.c | 20 +++++++++++++++++++- src/rrd_info.c | 3 +++ src/rrd_restore.c | 33 +++++++++++++++++++++------------ 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/rrd_create.c b/src/rrd_create.c index 9e5b055..d9ab8f4 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -4,6 +4,9 @@ * rrd_create.c creates new rrds *****************************************************************************/ +#include +#include + #include "rrd_tool.h" #include "rrd_rpncalc.h" #include "rrd_hw.h" @@ -13,6 +16,7 @@ unsigned long FnvHash(const char *str); int create_hw_contingent_rras(rrd_t *rrd, unsigned short period, unsigned long hashed_name); 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, char **argv) @@ -650,7 +654,7 @@ rrd_create_fn(const char *file_name, rrd_t *rrd) * 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]); fwrite( rrd->rra_ptr, sizeof(rra_ptr_t),1,rrd_file); } @@ -686,3 +690,17 @@ rrd_create_fn(const char *file_name, rrd_t *rrd) rrd_free(rrd); 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 b2a55d9..ebb1b8d 100644 --- a/src/rrd_info.c +++ b/src/rrd_info.c @@ -155,6 +155,9 @@ rrd_info_r(char *filename) { 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 4fb1dab..42c316c 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -26,6 +26,7 @@ int rrd_write(char *, rrd_t *, char); void parse_patch1028_RRA_params(char **buf, rrd_t *rrd, int rra_index); void parse_patch1028_CDP_params(char **buf, rrd_t *rrd, int rra_index, int ds_index); void parse_FAILURES_history(char **buf, rrd_t *rrd, int rra_index, int ds_index); +long int rra_random_row(rra_def_t *); /* convert all occurrences of to */ @@ -443,12 +444,6 @@ int xml2rrd(char* buf, rrd_t* rrd, char rc){ 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; @@ -463,7 +458,7 @@ int xml2rrd(char* buf, rrd_t* rrd, char rc){ int rrd_write(char *file_name, 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; @@ -502,16 +497,30 @@ rrd_write(char *file_name, rrd_t *rrd, char force_overwrite) 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); - /* calculate the number of rrd_values to dump */ - val_cnt=0; + /* Dump RRD values */ + rra_offset=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); + { + 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; + + 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.30.2