X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_create.c;h=9ee68961b4ad6e3755fb1bf56f7d9ab85554bc1d;hp=3b57c9f4d270f71ff37a3547d7fe99ea749781f9;hb=428c0dfd6c70a0e70039d15c2de3a729e01f8fef;hpb=9e6dd6a7c7768d90a8f62d7379d3dfa361e3ad7f diff --git a/src/rrd_create.c b/src/rrd_create.c index 3b57c9f..9ee6896 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -24,6 +24,8 @@ void parseGENERIC_DS( const char *def, rrd_t *rrd, int ds_idx); +long int rra_random_row( + rra_def_t *); static void rrd_free2( rrd_t *rrd); /* our onwn copy, immmune to mmap */ @@ -669,31 +671,36 @@ int rrd_create_fn( rrd_t *rrd) { unsigned long i, ii; + int rrd_file; rrd_value_t *unknown; int unkn_cnt; rrd_file_t *rrd_file_dn; rrd_t rrd_dn; - unsigned rrd_flags = RRD_READWRITE | RRD_CREAT; + unsigned flags = O_WRONLY | O_CREAT | O_TRUNC; - if ((rrd_file_dn = rrd_open(file_name, rrd, rrd_flags)) == NULL) { +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) + flags |= O_BINARY; +#endif + + if ((rrd_file = open(file_name, flags, 0666)) < 0) { rrd_set_error("creating '%s': %s", file_name, rrd_strerror(errno)); rrd_free2(rrd); return (-1); } - rrd_write(rrd_file_dn, rrd->stat_head, sizeof(stat_head_t)); + write(rrd_file, rrd->stat_head, sizeof(stat_head_t)); - rrd_write(rrd_file_dn, rrd->ds_def, sizeof(ds_def_t) * rrd->stat_head->ds_cnt); + write(rrd_file, rrd->ds_def, sizeof(ds_def_t) * rrd->stat_head->ds_cnt); - rrd_write(rrd_file_dn, rrd->rra_def, + write(rrd_file, rrd->rra_def, sizeof(rra_def_t) * rrd->stat_head->rra_cnt); - rrd_write(rrd_file_dn, rrd->live_head, sizeof(live_head_t)); + write(rrd_file, rrd->live_head, sizeof(live_head_t)); if ((rrd->pdp_prep = calloc(1, sizeof(pdp_prep_t))) == NULL) { rrd_set_error("allocating pdp_prep"); rrd_free2(rrd); - rrd_close(rrd_file_dn); + close(rrd_file); return (-1); } @@ -704,12 +711,12 @@ int rrd_create_fn( rrd->live_head->last_up % rrd->stat_head->pdp_step; for (i = 0; i < rrd->stat_head->ds_cnt; i++) - rrd_write(rrd_file_dn, rrd->pdp_prep, sizeof(pdp_prep_t)); + write(rrd_file, rrd->pdp_prep, sizeof(pdp_prep_t)); if ((rrd->cdp_prep = calloc(1, sizeof(cdp_prep_t))) == NULL) { rrd_set_error("allocating cdp_prep"); rrd_free2(rrd); - rrd_close(rrd_file_dn); + close(rrd_file); return (-1); } @@ -746,7 +753,7 @@ int rrd_create_fn( } for (ii = 0; ii < rrd->stat_head->ds_cnt; ii++) { - rrd_write(rrd_file_dn, rrd->cdp_prep, sizeof(cdp_prep_t)); + write(rrd_file, rrd->cdp_prep, sizeof(cdp_prep_t)); } } @@ -756,7 +763,7 @@ int rrd_create_fn( if ((rrd->rra_ptr = calloc(1, sizeof(rra_ptr_t))) == NULL) { rrd_set_error("allocating rra_ptr"); rrd_free2(rrd); - rrd_close(rrd_file_dn); + close(rrd_file); return (-1); } @@ -765,15 +772,15 @@ 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_select_initial_row(rrd_file_dn, i, &rrd->rra_def[i]); - rrd_write(rrd_file_dn, rrd->rra_ptr, sizeof(rra_ptr_t)); + rrd->rra_ptr->cur_row = rra_random_row(&rrd->rra_def[i]); + write(rrd_file, rrd->rra_ptr, sizeof(rra_ptr_t)); } /* write the empty data area */ if ((unknown = (rrd_value_t *) malloc(512 * sizeof(rrd_value_t))) == NULL) { rrd_set_error("allocating unknown"); rrd_free2(rrd); - rrd_close(rrd_file_dn); + close(rrd_file); return (-1); } for (i = 0; i < 512; ++i) @@ -784,27 +791,22 @@ int rrd_create_fn( unkn_cnt += rrd->stat_head->ds_cnt * rrd->rra_def[i].row_cnt; while (unkn_cnt > 0) { - if(rrd_write(rrd_file_dn, unknown, sizeof(rrd_value_t) * min(unkn_cnt, 512)) < 0) - { - rrd_set_error("creating rrd: %s", rrd_strerror(errno)); - return -1; - } + write(rrd_file, unknown, sizeof(rrd_value_t) * min(unkn_cnt, 512)); unkn_cnt -= 512; } free(unknown); + fdatasync(rrd_file); rrd_free2(rrd); - if (rrd_close(rrd_file_dn) == -1) { + if (close(rrd_file) == -1) { rrd_set_error("creating rrd: %s", rrd_strerror(errno)); return -1; } /* flush all we don't need out of the cache */ - if((rrd_file_dn = rrd_open(file_name, &rrd_dn, RRD_READONLY)) != NULL) - { - rrd_dontneed(rrd_file_dn, &rrd_dn); - /* rrd_free(&rrd_dn); */ - rrd_close(rrd_file_dn); - } + rrd_file_dn = rrd_open(file_name, &rrd_dn, RRD_READONLY); + rrd_dontneed(rrd_file_dn, &rrd_dn); + rrd_free(&rrd_dn); + rrd_close(rrd_file_dn); return (0); } @@ -822,3 +824,15 @@ static void rrd_free2( free(rrd->rrd_value); } +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; +}