-
- /* lets see if we had an error */
- if (ferror(rrd_file)) {
- rrd_set_error("a file error occurred while creating '%s'", file_name);
- fclose(rrd_file);
- rrd_free(rrd);
- return (-1);
- }
-#ifdef HAVE_POSIX_FADVISE
- /* this file is not going to be read again any time
- soon, so we drop everything except the header portion from
- the buffer cache. for this to work, we have to fdsync the file
- first though. This will not be all that fast, but 'good' data
- like other rrdfiles headers will stay in cache. Now this only works if creating
- a single rrd file is not too large, but I assume this should not be the case
- in general. Otherwhise we would have to sync and release while writing all
- the unknown data. */
- fflush(rrd_file);
- fdatasync(fileno(rrd_file));
- if (0 !=
- posix_fadvise(fileno(rrd_file), rrd_head_size, 0,
- POSIX_FADV_DONTNEED)) {
- rrd_set_error("setting POSIX_FADV_DONTNEED on '%s': %s", file_name,
- rrd_strerror(errno));
- fclose(rrd_file);
- return (-1);
+ fdatasync(rrd_file);
+ free(rrd->stat_head);
+ free(rrd->live_head);
+ if (close(rrd_file) == -1) {
+ rrd_set_error("creating rrd: %s", rrd_strerror(errno));
+ return -1;