X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_open.c;h=e1685d2924aa8cb33be18ddc73dda5753692d560;hb=9cd66f2d7fbf16ca07e1709cd156ae78cd0da278;hp=60151ba0b6ad3f3ed26bd58e1763bebf02b3b15d;hpb=0b02de621f7461381f81b56a417420f3341b9a0b;p=rrdtool.git diff --git a/src/rrd_open.c b/src/rrd_open.c index 60151ba..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 ***************************************************************************** @@ -182,7 +182,8 @@ rrd_file_t *rrd_open( } #endif - __rrd_read(rrd->stat_head, stat_head_t, 1); + __rrd_read(rrd->stat_head, stat_head_t, + 1); /* lets do some test if we are on track ... */ if (memcmp(rrd->stat_head->cookie, RRD_COOKIE, sizeof(RRD_COOKIE)) != 0) { @@ -225,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 @@ -241,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); @@ -267,6 +265,7 @@ rrd_file_t *rrd_open( } +#if defined DEBUG && DEBUG > 1 /* Print list of in-core pages of a the current rrd_file. */ static void mincore_print( @@ -309,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 +348,7 @@ void rrd_dontneed( } dontneed_start = active_block; /* do not release 'hot' block if update for this RAA will occur - * within 10 minutes */ + * 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); @@ -416,7 +416,7 @@ off_t rrd_seek( rrd_file->pos = ret; #endif /* mimic fseek, which returns 0 upon success */ - return ret < 0; //XXX: or just ret to mimic lseek + return ret < 0; /*XXX: or just ret to mimic lseek */ } @@ -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; @@ -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(