Index: src/rrd_resize.c =================================================================== --- src/rrd_resize.c (revision 1086) +++ src/rrd_resize.c (working copy) @@ -55,7 +55,7 @@ int rrd_resize( modify = -modify; - rrd_file = rrd_open(infilename, &rrdold, RRD_READWRITE); + rrd_file = rrd_open(infilename, &rrdold, RRD_READWRITE | RRD_COPY); if (rrd_file == NULL) { rrd_set_error("could not open RRD"); return (-1); @@ -111,15 +111,14 @@ int rrd_resize( case 1: rrdold.stat_head->version[3] = '3'; break; - default:{ + default: rrd_set_error("Do not know how to handle RRD version %s", rrdold.stat_head->version); + rrd_close(rrd_file); rrd_free(&rrdold); - close(rrd_file->fd); return (-1); + break; } - } - /* XXX: Error checking? */ rrd_write(rrd_out_file, rrdnew.stat_head, sizeof(stat_head_t) * 1); @@ -231,8 +230,9 @@ int rrd_resize( rrd_write(rrd_out_file, rrdnew.rra_ptr, sizeof(rra_ptr_t) * rrdnew.stat_head->rra_cnt); - close(rrd_out_file->fd); + rrd_close(rrd_file); rrd_free(&rrdold); - close(rrd_file->fd); + rrd_close(rrd_out_file); + rrd_free(&rrdnew); return (0); } Index: src/rrd_open.c =================================================================== --- src/rrd_open.c (revision 1086) +++ src/rrd_open.c (working copy) @@ -118,9 +118,8 @@ rrd_file_t *rrd_open( #ifdef HAVE_MMAP mm_flags = MAP_PRIVATE; # ifdef MAP_NORESERVE - mm_flags |= MAP_NORESERVE; + mm_flags |= MAP_NORESERVE; /* readonly, so no swap backing needed */ # endif - mm_flags |= MAP_PRIVATE; #endif } else { if (rdwr & RRD_READWRITE) { @@ -137,19 +136,19 @@ rrd_file_t *rrd_open( } if (rdwr & RRD_READAHEAD) { #ifdef MAP_POPULATE - mm_flags |= MAP_POPULATE; + mm_flags |= MAP_POPULATE; /* populate ptes and data */ #endif -#if defined MAP_NONBLOCK && !defined USE_DIRECT_IO - mm_flags |= MAP_NONBLOCK; /* just populage ptes */ +#if defined MAP_NONBLOCK + mm_flags |= MAP_NONBLOCK; /* just populate ptes */ #endif - } else { #ifdef USE_DIRECT_IO + } else { flags |= O_DIRECT; #endif -#if 0 //def O_NONBLOCK - flags |= O_NONBLOCK; -#endif } +#ifdef O_NONBLOCK + flags |= O_NONBLOCK; +#endif if ((rrd_file->fd = open(file_name, flags, mode)) < 0) { rrd_set_error("opening '%s': %s", file_name, rrd_strerror(errno)); @@ -195,11 +194,9 @@ rrd_file_t *rrd_open( rrd_strerror(errno)); goto out_close; } - rrd_file->file_start = data; -#else #endif #ifdef USE_MADVISE - if (rdwr & RRD_COPY) { /*XXX: currently not used! */ + if (rdwr & RRD_COPY) { /* We will read everything in a moment (copying) */ madvise(data, rrd_file->file_len, MADV_WILLNEED | MADV_SEQUENTIAL); goto out_done; @@ -287,6 +284,7 @@ rrd_file_t *rrd_open( #ifdef USE_MADVISE out_done: #endif + rrd_file->file_start = data; rrd_file->header_len = offset; rrd_file->pos = offset; /* we could close(rrd_file->fd); here, the mapping is still valid anyway */ @@ -357,9 +355,8 @@ ssize_t rrd_read( size_t count) { #ifdef HAVE_MMAP - char *pos = rrd_file->file_start + rrd_file->pos; - - buf = memmove(buf, pos, count); + buf = memmove(buf, rrd_file->file_start + rrd_file->pos, count); + rrd_file->pos += count; /* mimmic read() semantics */ rrd_file->pos += count; /* mimmic read() semantics */ return count; #else @@ -424,8 +421,8 @@ void rrd_free( free(rrd->pdp_prep); free(rrd->cdp_prep); free(rrd->rrd_value); -//XXX: ? rrd_init(rrd); #endif +//XXX: ? rrd_init(rrd); } /* routine used by external libraries to free memory allocated by Index: configure.ac =================================================================== --- configure.ac (revision 1086) +++ configure.ac (working copy) @@ -299,10 +299,12 @@ AC_ARG_ENABLE([mmap], [ --disable-mmap disable mmap in rrd_update, use seek+write instead], [], [enable_mmap=yes]) + +dnl will most likely not work on compressed filesystems, i think.. *shrug* AC_ARG_ENABLE([direct-io], -[ --enable-direct-io enable O_DIRECT], -[], -[enable_direct_io=yes]) +[ --enable-direct-io enable O_DIRECT if available], +[enable_direct_io=yes], +[]) AC_ARG_ENABLE(pthread,[ --disable-pthread disable multithread support], [],[enable_pthread=yes]) @@ -342,6 +344,27 @@ AC_HEADER_STDC AC_HEADER_DIRENT AC_CHECK_HEADERS(features.h sys/stat.h sys/types.h fcntl.h locale.h fp_class.h malloc.h unistd.h ieeefp.h math.h sys/times.h sys/param.h sys/resource.h signal.h float.h stdio.h stdlib.h errno.h string.h ctype.h) +if test "x$enable_direct_io" = "xyes"; then +CFLAGS="$CFLAGS -D_GNU_SOURCE" +AC_CACHE_CHECK([for O_DIRECT flag to open(2)],rrd_cv_HAVE_OPEN_O_DIRECT,[ +AC_TRY_COMPILE([ +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif], +[int fd = open("/dev/null", O_DIRECT);], +rrd_cv_HAVE_OPEN_O_DIRECT=yes,rrd_cv_HAVE_OPEN_O_DIRECT=no)]) + if test "x$rrd_cv_HAVE_OPEN_O_DIRECT" = "xyes"; then + AC_DEFINE(USE_DIRECT_IO,1,[Whether the open(2) accepts O_DIRECT]) + else + enable_direct_io="no" + fi +else + enable_direct_io="no" +fi + dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_HEADER_TIME @@ -403,15 +426,11 @@ if test "x$enable_mmap" = "xyes"; then if test "x$ac_cv_func_mmap" != "xyes"; then AC_MSG_ERROR([--enable-mmap requested but mmap() was not detected]) +dnl enable_mmap="no" fi fi -dnl if test "x$enable_direct_io" = "xyes"; then -dnl check for working O_DIRECT -dnl fi -AC_SUBST([USE_DIRECT_IO]) - CONFIGURE_PART(IEEE Math Checks) @@ -826,7 +845,8 @@ echo echo "----------------------------------------------------------------" echo "Config is DONE!" echo -echo " With MMAP IO: $ac_cv_func_mmap_fixed_mapped" +echo " With MMAP IO: $enable_mmap" +echo " Use O_DIRECT: $enable_direct_io" echo " Perl Modules: $COMP_PERL" echo " Perl Binary: $PERL" echo " Perl Version: $PERL_VERSION"