/*****************************************************************************
- * RRDtool 1.2.19 Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007
*****************************************************************************
* rrd_update.c RRD Update Function
*****************************************************************************
#include <sys/types.h>
#include <fcntl.h>
#ifdef HAVE_MMAP
- #include <sys/mman.h>
+# include <sys/mman.h>
#endif
#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
rpnstack_t rpnstack; /* used for COMPUTE DS */
int version; /* rrd version */
char *endptr; /* used in the conversion */
+
#ifdef HAVE_MMAP
void *rrd_mmaped_file;
unsigned long rrd_filesize;
if(rrd_open(filename,&rrd_file,&rrd, RRD_READWRITE)==-1){
return -1;
}
+
/* initialize time */
version = atoi(rrd.stat_head->version);
gettimeofday(&tmp_time, 0);
fclose(rrd_file);
return(-1);
}
+#ifdef HAVE_MADVISE
+ /* when we use mmaping we tell the kernel the mmap equivalent
+ of POSIX_FADV_RANDOM */
+ madvise(rrd_mmaped_file,rrd_filesize,POSIX_MADV_RANDOM);
+#endif
#endif
/* loop through the arguments. */
for(arg_i=0; arg_i<argc;arg_i++) {
i < rrd.stat_head->rra_cnt;
rra_start += rrd.rra_def[i].row_cnt * rrd.stat_head -> ds_cnt * sizeof(rrd_value_t),
i++) {
- /* is there anything to write for this RRA? If not, continue. */
+ /* is th5Aere anything to write for this RRA? If not, continue. */
if (rra_step_cnt[i] == 0) continue;
/* write the first row */
fclose(rrd_file);
return(-1);
}
+
+#ifdef HAVE_POSIX_FADVISExxx
+
+ /* with update we have write ops, so they will probably not be done by now, this means
+ the buffers will not get freed. But calling this for the whole file - header
+ will let the data off the hook as soon as it is written when if it is from a previous
+ update cycle. Calling fdsync to force things is much too hard here. */
+
+ if (0 != posix_fadvise(fileno(rrd_file), rra_begin, 0, POSIX_FADV_DONTNEED)) {
+ rrd_set_error("setting POSIX_FADV_DONTNEED on '%s': %s",filename, rrd_strerror(errno));
+ fclose(rrd_file);
+ return(-1);
+ }
+#endif
/* OK now close the files and free the memory */
if(fclose(rrd_file) != 0){
if (schedule_smooth)
{
rrd_file = fopen(filename,"rb+");
+
+
rra_start = rra_begin;
for (i = 0; i < rrd.stat_head -> rra_cnt; ++i)
{
rra_start += rrd.rra_def[i].row_cnt
*rrd.stat_head->ds_cnt*sizeof(rrd_value_t);
}
+#ifdef HAVE_POSIX_FADVISExxx
+ /* same procedure as above ... */
+ if (0 != posix_fadvise(fileno(rrd_file), rra_begin, 0, POSIX_FADV_DONTNEED)) {
+ rrd_set_error("setting POSIX_FADV_DONTNEED on '%s': %s",filename, rrd_strerror(errno));
+ fclose(rrd_file);
+ return(-1);
+ }
+#endif
fclose(rrd_file);
}
rrd_free(&rrd);