/*****************************************************************************
- * 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
*****************************************************************************
}
#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) {
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
__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);
}
+#if defined DEBUG && DEBUG > 1
/* Print list of in-core pages of a the current rrd_file. */
static
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 */
}
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) {
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);
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 */
}
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;
{
#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 */
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;
/* 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(