- _madvise(rrd_file->file_start + PAGE_ALIGN_DOWN(rrd_file->header_len),
- rrd_file->file_len - PAGE_ALIGN(rrd_file->header_len),
+ rra_start = rrd_file->header_len;
+ dontneed_start = PAGE_START(rra_start)+_page_size;
+ for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
+ active_block =
+ PAGE_START(rra_start
+ + rrd->rra_ptr[i].cur_row
+ * rrd->stat_head->ds_cnt
+ * sizeof(rrd_value_t));
+ if (active_block > dontneed_start){
+#ifdef USE_MADVISE
+ _madvise(rrd_file->file_start + dontneed_start,
+ active_block-dontneed_start-1,
+ MADV_DONTNEED);
+#endif
+/* in linux at least only fadvise DONTNEED seems to purge pages from cache */
+#ifdef HAVE_POSIX_FADVISE
+ posix_fadvise(rrd_file->fd, dontneed_start, active_block-dontneed_start-1, POSIX_FADV_DONTNEED);
+#endif
+ }
+ dontneed_start = active_block + _page_size;
+ rra_start += rrd->rra_def[i].row_cnt * rrd->stat_head->ds_cnt * sizeof(rrd_value_t);
+ }
+#ifdef USE_MADVISE
+ _madvise(rrd_file->file_start + dontneed_start,
+ rrd_file->file_len - dontneed_start,