From: oetiker Date: Thu, 2 Feb 2012 15:38:44 +0000 (+0000) Subject: use posix_fallocate when initialiying rrd files ... instead of filling them with... X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=30f248a18d60fbbc4def738a000094558e061ae8;p=rrdtool-all.git use posix_fallocate when initialiying rrd files ... instead of filling them with yero explicitly -- Richard Laager git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4@2270 a5681a0c-68f1-0310-ab6d-d61299d08faa --- diff --git a/program/configure.ac b/program/configure.ac index b686bc0b..076fcbfb 100644 --- a/program/configure.ac +++ b/program/configure.ac @@ -280,6 +280,9 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#define _XOPEN_SOURCE 600 #include ]) AC_CHECK_FUNCS(posix_fadvise) +dnl can we use posix_fallocate +AC_CHECK_FUNCS(posix_fallocate) + CONFIGURE_PART(Libintl Processing) AM_GNU_GETTEXT_VERSION(0.17) diff --git a/program/src/rrd_open.c b/program/src/rrd_open.c index ff332d02..9a5385ae 100644 --- a/program/src/rrd_open.c +++ b/program/src/rrd_open.c @@ -221,12 +221,20 @@ rrd_file_t *rrd_open( rrd_file->file_len = statb.st_size; } else { rrd_file->file_len = newfile_size; +#ifdef HAVE_POSIX_FALLOCATE + if (posix_fallocate(rrd_simple_file->fd, 0, newfile_size) == -1) { + rrd_set_error("posix_fallocate '%s': %s", file_name, + rrd_strerror(errno)); + goto out_close; + } +#else lseek(rrd_simple_file->fd, newfile_size - 1, SEEK_SET); if ( write(rrd_simple_file->fd, "\0", 1) == -1){ /* poke */ rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno)); goto out_close; } lseek(rrd_simple_file->fd, 0, SEEK_SET); +#endif } #ifdef HAVE_POSIX_FADVISE /* In general we need no read-ahead when dealing with rrd_files. @@ -247,6 +255,7 @@ rrd_file_t *rrd_open( */ #ifdef HAVE_MMAP +#ifndef HAVE_POSIX_FALLOCATE /* force allocating the file on the underlaying filesystem to prevent any * future bus error when the filesystem is full and attempting to write * trough the file mapping. Filling the file using memset on the file @@ -278,6 +287,7 @@ rrd_file_t *rrd_open( lseek(rrd_simple_file->fd, 0, SEEK_SET); } +#endif data = mmap(0, rrd_file->file_len, rrd_simple_file->mm_prot, rrd_simple_file->mm_flags,