X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_open.c;h=5f3723f30cef086d44c6bab4a3c434b1d74e6507;hp=5a908daafc49a01eb285f0d205e246c4af8829ef;hb=9d7aa8ddae065b774fe4eb1df76a3242b9db2d53;hpb=dc2409c0e92ace2dfdf73c0c5d7f57baf48b490b diff --git a/src/rrd_open.c b/src/rrd_open.c index 5a908da..5f3723f 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -1,25 +1,29 @@ /***************************************************************************** - * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010 ***************************************************************************** * rrd_open.c Open an RRD File ***************************************************************************** * $Id$ *****************************************************************************/ +#include "rrd_tool.h" +#include "unused.h" + +#ifdef WIN32 #include #include #include +#endif + + +#ifdef HAVE_BROKEN_MS_ASYNC +#include #include +#endif -#include "rrd_tool.h" -#include "unused.h" #define MEMBLK 8192 #ifdef WIN32 -# define random() rand() -# define srandom(x) srand(x) -# define getpid() 0 - #define _LK_UNLCK 0 /* Unlock */ #define _LK_LOCK 1 /* Lock */ #define _LK_NBLCK 2 /* Non-blocking lock */ @@ -78,10 +82,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 @@ -115,15 +115,7 @@ rrd_file_t *rrd_open( /* Are we creating a new file? */ if((rdwr & RRD_CREAT) && (rrd->stat_head != NULL)) { - header_len = \ - sizeof(stat_head_t) + \ - sizeof(ds_def_t) * rrd->stat_head->ds_cnt + \ - sizeof(rra_def_t) * rrd->stat_head->rra_cnt + \ - sizeof(time_t) + \ - sizeof(live_head_t) + \ - sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt + \ - sizeof(cdp_prep_t) * rrd->stat_head->ds_cnt * rrd->stat_head->rra_cnt + \ - sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt; + header_len = rrd_get_header_size(rrd); value_cnt = 0; for (ui = 0; ui < rrd->stat_head->rra_cnt; ui++) @@ -166,7 +158,9 @@ rrd_file_t *rrd_open( if (rdwr & RRD_READONLY) { flags |= O_RDONLY; #ifdef HAVE_MMAP +# if !defined(AIX) rrd_simple_file->mm_flags = MAP_PRIVATE; +# endif # ifdef MAP_NORESERVE rrd_simple_file->mm_flags |= MAP_NORESERVE; /* readonly, so no swap backing needed */ # endif @@ -174,10 +168,17 @@ rrd_file_t *rrd_open( } else { if (rdwr & RRD_READWRITE) { flags |= O_RDWR; +#ifdef HAVE_MMAP + rrd_simple_file->mm_flags = MAP_SHARED; + rrd_simple_file->mm_prot |= PROT_WRITE; +#endif } if (rdwr & RRD_CREAT) { flags |= (O_CREAT | O_TRUNC); } + if (rdwr & RRD_EXCL) { + flags |= O_EXCL; + } } if (rdwr & RRD_READAHEAD) { #ifdef MAP_POPULATE @@ -222,7 +223,10 @@ rrd_file_t *rrd_open( } else { rrd_file->file_len = newfile_size; lseek(rrd_simple_file->fd, newfile_size - 1, SEEK_SET); - write(rrd_simple_file->fd, "\0", 1); /* poke */ + if ( write(rrd_simple_file->fd, "\0", 1) == -1){ /* poke */ + rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno)); + goto out_close; + } lseek(rrd_simple_file->fd, 0, SEEK_SET); } #ifdef HAVE_POSIX_FADVISE @@ -265,12 +269,14 @@ rrd_file_t *rrd_open( #ifdef USE_MADVISE if (rdwr & RRD_COPY) { /* We will read everything in a moment (copying) */ - madvise(data, rrd_file->file_len, MADV_WILLNEED | MADV_SEQUENTIAL); + madvise(data, rrd_file->file_len, MADV_WILLNEED ); + madvise(data, rrd_file->file_len, MADV_SEQUENTIAL ); } else { /* We do not need to read anything in for the moment */ madvise(data, rrd_file->file_len, MADV_RANDOM); /* the stat_head will be needed soonish, so hint accordingly */ - madvise(data, sizeof(stat_head_t), MADV_WILLNEED | MADV_RANDOM); + madvise(data, sizeof(stat_head_t), MADV_WILLNEED); + madvise(data, sizeof(stat_head_t), MADV_RANDOM); } #endif @@ -476,7 +482,7 @@ void rrd_dontneed( size_t dontneed_start; size_t rra_start; size_t active_block; - unsigned long i; + size_t i; ssize_t _page_size = sysconf(_SC_PAGESIZE); if (rrd_file == NULL) { @@ -538,7 +544,7 @@ void rrd_dontneed( #if defined DEBUG && DEBUG > 1 mincore_print(rrd_file, "after"); #endif -#endif /* without madvise and posix_fadvise ist does not make much sense todo anything */ +#endif /* without madvise and posix_fadvise it does not make much sense todo anything */ } @@ -681,22 +687,13 @@ ssize_t rrd_write( } -/* flush all data pending to be written to FD. */ - +/* this is a leftover from the old days, it serves no purpose + and is therefore turned into a no-op */ void rrd_flush( - rrd_file_t *rrd_file) + rrd_file_t UNUSED(*rrd_file)) { -#ifndef WIN32 - rrd_simple_file_t *rrd_simple_file; - rrd_simple_file = (rrd_simple_file_t *)rrd_file->pvt; - if (fdatasync(rrd_simple_file->fd) != 0) { - rrd_set_error("flushing fd %d: %s", rrd_simple_file->fd, - rrd_strerror(errno)); - } -#endif } - /* Initialize RRD header. */ void rrd_init( @@ -755,10 +752,10 @@ void rrd_freemem( * aligning RRAs within stripes, or other performance enhancements */ void rrd_notify_row( - rrd_file_t *rrd_file __attribute__((unused)), - int rra_idx __attribute__((unused)), - unsigned long rra_row __attribute__((unused)), - time_t rra_time __attribute__((unused))) + rrd_file_t UNUSED(*rrd_file), + int UNUSED(rra_idx), + unsigned long UNUSED(rra_row), + time_t UNUSED(rra_time)) { } @@ -770,24 +767,10 @@ void rrd_notify_row( * don't change to a new disk block at the same time */ unsigned long rrd_select_initial_row( - rrd_file_t *rrd_file __attribute__((unused)), - int rra_idx __attribute__((unused)), + rrd_file_t UNUSED(*rrd_file), + int UNUSED(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; + return rrd_random() % rra->row_cnt; } -