X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Frrd_restore.c;h=b2d1193db0dee61092069b585dbb821fe6e2a363;hb=c208ca2237941e0390dafb6714b2e06f1f776394;hp=c301736efaa2251dee8939e66390039f2a50e1f9;hpb=1b8f812fbf8d14bad0fcf9749ac71f640bda2868;p=rrdtool.git diff --git a/src/rrd_restore.c b/src/rrd_restore.c index c301736..b2d1193 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 */ @@ -385,8 +387,8 @@ int xml2rrd( par[RRA_seasonal_smooth_idx].u_cnt)); if (atoi(rrd->stat_head->version) >= 4) { read_tag(&ptr2, "smoothing_window", "%lf", - &(rrd->rra_def[rra_index]. - par[RRA_seasonal_smoothing_window].u_val)); + &(rrd->rra_def[rra_index]. + par[RRA_seasonal_smoothing_window].u_val)); } read_tag(&ptr2, "dependent_rra_idx", "%lu", &(rrd->rra_def[rra_index]. @@ -427,7 +429,12 @@ int xml2rrd( eat_tag(&ptr2, "cdp_prep"); for (i = 0; i < (int) rrd->stat_head->ds_cnt; i++) { - eat_tag(&ptr2, "ds"); + if (eat_tag(&ptr2, "ds") != 1) { + rrd_set_error + ("expected to find %lu entries in ", + rrd->stat_head->ds_cnt); + return -1; + } /* support to read CDP parameters */ rra_index = rrd->stat_head->rra_cnt - 1; skip(&ptr2); @@ -617,12 +624,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 +640,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 +679,31 @@ 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)) {