From 428c0dfd6c70a0e70039d15c2de3a729e01f8fef Mon Sep 17 00:00:00 2001 From: oetiker Date: Wed, 15 Oct 2008 05:29:41 +0000 Subject: [PATCH] reverted r1601 and r1606 since r1601 introduced a non portable mremap and r1606 has a dependency on r1601. git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1607 a5681a0c-68f1-0310-ab6d-d61299d08faa --- src/rrd.h | 12 -------- src/rrd_create.c | 66 ++++++++++++++++++++++++++------------------ src/rrd_open.c | 84 ++------------------------------------------------------ src/rrd_resize.c | 2 +- src/rrd_tool.h | 1 - src/rrd_update.c | 2 -- 6 files changed, 43 insertions(+), 124 deletions(-) diff --git a/src/rrd.h b/src/rrd.h index 5542a42..d87275e 100644 --- a/src/rrd.h +++ b/src/rrd.h @@ -369,18 +369,6 @@ extern "C" { int rrd_lock( rrd_file_t *file) RRD_DEPRECATED; - void rrd_notify_row( - rrd_file_t *rrd_file, - int rra_idx, - unsigned long rra_row, - time_t rra_time) - RRD_DEPRECATED; - unsigned long rrd_select_initial_row( - rrd_file_t *rrd_file, - int rra_idx, - rra_def_t *rra - ) - RRD_DEPRECATED; #endif /* defined(_RRD_TOOL_H) || defined(RRD_EXPORT_DEPRECATED) */ #endif /* _RRDLIB_H */ 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; +} diff --git a/src/rrd_open.c b/src/rrd_open.c index 6b2d6ac..f262413 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -54,10 +54,6 @@ #endif #endif -long int rra_random_row( - rra_def_t *); - - /* Open a database file, return its header and an open filehandle, * positioned to the first cdp in the first rra. * In the error path of rrd_open, only rrd_free(&rrd) has to be called @@ -83,14 +79,13 @@ rrd_file_t *rrd_open( rrd_file_t *rrd_file = NULL; off_t newfile_size = 0; - if ((rdwr & RRD_CREAT) && (rdwr & RRD_CREAT_SETSIZE)) { + if (rdwr & RRD_CREAT) { /* yes bad inline signaling alert, we are using the floatcookie to pass the size in ... only used in resize */ newfile_size = (off_t) rrd->stat_head->float_cookie; free(rrd->stat_head); } - if(!(rdwr & RRD_CREAT)) - rrd_init(rrd); + rrd_init(rrd); rrd_file = malloc(sizeof(rrd_file_t)); if (rrd_file == NULL) { rrd_set_error("allocating rrd_file descriptor for '%s'", file_name); @@ -175,13 +170,7 @@ rrd_file_t *rrd_open( } } */ - #ifdef HAVE_MMAP - if(rrd_file->file_len == 0 && (rdwr & RRD_CREAT)) - { - rrd_file->file_start = NULL; - goto out_done; - } data = mmap(0, rrd_file->file_len, mm_prot, mm_flags, rrd_file->fd, offset); @@ -546,36 +535,10 @@ ssize_t rrd_write( size_t count) { #ifdef HAVE_MMAP - /* These flags are used if creating a new RRD */ - int mm_prot = PROT_READ | PROT_WRITE, mm_flags = MAP_SHARED; - int old_size = rrd_file->file_len; - int new_size = rrd_file->file_len; if (count == 0) return 0; if (buf == NULL) return -1; /* EINVAL */ - - if((rrd_file->pos + count) > old_size) - { - new_size = rrd_file->pos + count; - rrd_file->file_len = new_size; - lseek(rrd_file->fd, new_size - 1, SEEK_SET); - write(rrd_file->fd, "\0", 1); /* poke */ - lseek(rrd_file->fd, 0, SEEK_SET); - if(rrd_file->file_start == NULL) - { - rrd_file->file_start = mmap(0, new_size, mm_prot, mm_flags, - rrd_file->fd, 0); - } - else - rrd_file->file_start = mremap(rrd_file->file_start, old_size, new_size, MREMAP_MAYMOVE); - - if (rrd_file->file_start == MAP_FAILED) { - rrd_set_error("m(re)maping file : %s", - rrd_strerror(errno)); - return -1; - } - } memcpy(rrd_file->file_start + rrd_file->pos, buf, count); rrd_file->pos += count; return count; /* mimmic write() semantics */ @@ -652,46 +615,3 @@ void rrd_freemem( { free(mem); } - -/* - * rra_update informs us about the RRAs being updated - * The low level storage API may use this information for - * aligning RRAs within stripes, or other performance enhancements - */ -void rrd_notify_row( - rrd_file_t *rrd_file, - int rra_idx, - unsigned long rra_row, - time_t rra_time) -{ -} - -/* - * This function is called when creating a new RRD - * The storage implementation can use this opportunity to select - * a sensible starting row within the file. - * The default implementation is random, to ensure that all RRAs - * don't change to a new disk block at the same time - */ -unsigned long rrd_select_initial_row( - rrd_file_t *rrd_file, - int rra_idx, - rra_def_t *rra - ) -{ - return rra_random_row(rra); -} - -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_resize.c b/src/rrd_resize.c index 66d02af..57adbf0 100644 --- a/src/rrd_resize.c +++ b/src/rrd_resize.c @@ -93,7 +93,7 @@ int rrd_resize( } rrdnew.stat_head->float_cookie = rrd_file->file_len + (rrdold.stat_head->ds_cnt * sizeof(rrd_value_t) * modify); - rrd_out_file = rrd_open(outfilename, &rrdnew, RRD_READWRITE | RRD_CREAT | RRD_CREAT_SETSIZE); + rrd_out_file = rrd_open(outfilename, &rrdnew, RRD_READWRITE | RRD_CREAT); if (rrd_out_file == NULL) { rrd_set_error("Can't create '%s': %s", outfilename, rrd_strerror(errno)); diff --git a/src/rrd_tool.h b/src/rrd_tool.h index c281979..43781da 100644 --- a/src/rrd_tool.h +++ b/src/rrd_tool.h @@ -97,7 +97,6 @@ extern "C" { #define RRD_CREAT (1<<2) #define RRD_READAHEAD (1<<3) #define RRD_COPY (1<<4) -#define RRD_CREAT_SETSIZE (1<<5) enum cf_en cf_conv( const char *string); diff --git a/src/rrd_update.c b/src/rrd_update.c index d43740e..5e26055 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -1962,8 +1962,6 @@ static int write_to_rras( (rrd_file, rrd, rra_idx, scratch_idx, pcdp_summary, rra_time) == -1) return -1; - - rrd_notify_row(rrd_file, rra_idx, rra_pos_new, rra_time); } rra_start += rra_def->row_cnt * ds_cnt * sizeof(rrd_value_t); -- 2.11.0