X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrd_open.c;h=e1685d2924aa8cb33be18ddc73dda5753692d560;hb=daf8e7ff715a59e1f9827080d1b785ffb3c5a4b1;hp=6a3cf34a8286fc6cc39b5f124f04a543a95b4399;hpb=f1a53d6f5926d43a74c190ce6e13edcadfd61635;p=rrdtool.git diff --git a/src/rrd_open.c b/src/rrd_open.c index 6a3cf34..e1685d2 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.2.99907080300 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.3rc7 Copyright by Tobi Oetiker, 1997-2008 ***************************************************************************** * rrd_open.c Open an RRD File ***************************************************************************** @@ -226,12 +226,14 @@ rrd_file_t *rrd_open( rrd_set_error("live_head_t malloc"); goto out_close; } -#ifdef HAVE_MMAP - memmove(&rrd->live_head->last_up, data + offset, sizeof(long)); - offset += sizeof(long); -#else - offset += read(rrd_file->fd, &rrd->live_head->last_up, sizeof(long)); -#endif + +#if defined USE_MADVISE + /* the live_head will be needed soonish, so hint accordingly */ + madvise(data + PAGE_START(offset), + sizeof(time_t), MADV_WILLNEED); +#endif + __rrd_read(rrd->legacy_last_up,time_t,1); + rrd->live_head->last_up = *rrd->legacy_last_up; rrd->live_head->last_up_usec = 0; } else { #if defined USE_MADVISE @@ -242,15 +244,10 @@ rrd_file_t *rrd_open( __rrd_read(rrd->live_head, live_head_t, 1); } -//XXX: This doesn't look like it needs madvise __rrd_read(rrd->pdp_prep, pdp_prep_t, rrd->stat_head->ds_cnt); - -//XXX: This could benefit from madvise()ing __rrd_read(rrd->cdp_prep, cdp_prep_t, rrd->stat_head->rra_cnt * rrd->stat_head->ds_cnt); - -//XXX: This could benefit from madvise()ing __rrd_read(rrd->rra_ptr, rra_ptr_t, rrd->stat_head->rra_cnt); @@ -268,7 +265,8 @@ rrd_file_t *rrd_open( } -/* Close a reference to an rrd_file. */ +#if defined DEBUG && DEBUG > 1 +/* Print list of in-core pages of a the current rrd_file. */ static void mincore_print( rrd_file_t *rrd_file, @@ -310,6 +308,7 @@ void mincore_print( fprintf(stderr, "sorry mincore only works with mmap"); #endif } +#endif /* defined DEBUG && DEBUG > 1 */ /* drop cache except for the header and the active pages */ @@ -348,7 +347,8 @@ void rrd_dontneed( #endif } dontneed_start = active_block; - /* do not relase 'hot' block if update for this RAA will occure within 10 minutes */ + /* do not release 'hot' block if update for this RAA will occur + * within 10 minutes */ if (rrd->stat_head->pdp_step * rrd->rra_def[i].pdp_cnt - rrd->live_head->last_up % (rrd->stat_head->pdp_step * rrd->rra_def[i].pdp_cnt) < 10 * 60) { @@ -377,7 +377,7 @@ int rrd_close( int ret; #ifdef HAVE_MMAP - ret = msync(rrd_file->file_start, rrd_file->file_len,MS_ASYNC); + ret = msync(rrd_file->file_start, rrd_file->file_len, MS_ASYNC); if (ret != 0) rrd_set_error("msync rrd_file: %s", rrd_strerror(errno)); ret = munmap(rrd_file->file_start, rrd_file->file_len); @@ -415,8 +415,8 @@ off_t rrd_seek( rrd_set_error("lseek: %s", rrd_strerror(errno)); rrd_file->pos = ret; #endif -//XXX: mimic fseek, which returns 0 upon success - return ret == -1; //XXX: or just ret to mimic lseek + /* mimic fseek, which returns 0 upon success */ + return ret < 0; /*XXX: or just ret to mimic lseek */ } @@ -429,7 +429,7 @@ inline off_t rrd_tell( } -/* read count bytes into buffer buf, starting at rrd_file->pos. +/* Read count bytes into buffer buf, starting at rrd_file->pos. * Returns the number of bytes read or <0 on error. */ inline ssize_t rrd_read( @@ -441,10 +441,10 @@ inline ssize_t rrd_read( size_t _cnt = count; ssize_t _surplus; - if (rrd_file->pos > rrd_file->file_len || _cnt == 0) /* EOF */ - return 0; + if (rrd_file->pos > rrd_file->file_len || _cnt == 0) /* EOF */ + return 0; if (buf == NULL) - return -1; /* EINVAL */ + return -1; /* EINVAL */ _surplus = rrd_file->pos + _cnt - rrd_file->file_len; if (_surplus > 0) { /* short read */ _cnt -= _surplus; @@ -466,7 +466,7 @@ inline ssize_t rrd_read( } -/* write count bytes from buffer buf to the current position +/* Write count bytes from buffer buf to the current position * rrd_file->pos of rrd_file->fd. * Returns the number of bytes written or <0 on error. */ @@ -477,9 +477,9 @@ inline ssize_t rrd_write( { #ifdef HAVE_MMAP if (count == 0) - return 0; + return 0; if (buf == NULL) - return -1; /* EINVAL */ + return -1; /* EINVAL */ memcpy(rrd_file->file_start + rrd_file->pos, buf, count); rrd_file->pos += count; return count; /* mimmic write() semantics */ @@ -514,6 +514,7 @@ void rrd_init( rrd->ds_def = NULL; rrd->rra_def = NULL; rrd->live_head = NULL; + rrd->legacy_last_up = NULL; rrd->rra_ptr = NULL; rrd->pdp_prep = NULL; rrd->cdp_prep = NULL; @@ -524,9 +525,12 @@ void rrd_init( /* free RRD header data. */ #ifdef HAVE_MMAP -inline void rrd_free( - rrd_t UNUSED(*rrd)) +void rrd_free( + rrd_t *rrd) { + if (rrd->legacy_last_up){ /* this gets set for version < 3 only */ + free(rrd->live_head); + } } #else void rrd_free(