Code

Generate a random cur_row for each RRA during
[rrdtool-all.git] / program / src / rrd_restore.c
index 4fb1dab4a49c8ed14e0ed4ccd15cb706f5e69ba3..42c316c0f056d7b9d32e19b508dbec7c0d9e71b6 100644 (file)
@@ -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 <BlaBlaBla> to <blablabla> */
 
@@ -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)){