Code

use posix_fallocate when initialiying rrd files ... instead of filling them with...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 2 Feb 2012 15:38:44 +0000 (15:38 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 2 Feb 2012 15:38:44 +0000 (15:38 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4/program@2270 a5681a0c-68f1-0310-ab6d-d61299d08faa

configure.ac
src/rrd_open.c

index b686bc0b23eedf307eb1b6f2728fbcbeadff5577..076fcbfb6f44115c44b5c3b8104ad8e9c7406be0 100644 (file)
@@ -280,6 +280,9 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#define _XOPEN_SOURCE 600
 #include <fcntl.h>])
 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)
index ff332d0202a118e1769ef378a7e0311524b65c27..9a5385ae9ef979668f92d04959e50e55e4b2dc72 100644 (file)
@@ -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,