Generate a random cur_row for each RRA during
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Tue, 19 Feb 2008 12:56:44 +0000 (12:56 +0000)
committeroetiker <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

src/rrd_create.c
src/rrd_info.c
src/rrd_restore.c

index a8f6a29..027c6ab 100644 (file)
@@ -4,6 +4,8 @@
  * rrd_create.c  creates new rrds
  *****************************************************************************/
 
+#include <stdlib.h>
+#include <time.h>
 #include <locale.h>
 
 #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;
+}
index 239a7ab..3c0ee0e 100644 (file)
@@ -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);
index d3a2c8a..6997cab 100644 (file)
@@ -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 <BlaBlaBla> to <blablabla> */
 
@@ -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)) {