XLogSegNo installed_segno;
int max_advance;
int fd;
+ bool zero_fill = true;
XLogFilePath(path, ThisTimeLineID, logsegno);
errmsg("could not create file \"%s\": %m", tmppath)));
#ifdef HAVE_POSIX_FALLOCATE
- {
- errno = posix_fallocate(fd, 0, XLogSegSize);
-
- if (errno)
- {
- int errno_saved = errno;
-
- close(fd);
- unlink(tmppath);
- errno = errno_saved;
+ /*
+ * If posix_fallocate() is available and succeeds, then the file is
+ * properly allocated and we don't need to zero-fill it (which is less
+ * efficient). In case of an error, fall back to writing zeros, because on
+ * some platforms posix_fallocate() is available but will not always
+ * succeed in cases where zero-filling will.
+ */
+ if (posix_fallocate(fd, 0, XLogSegSize) == 0)
+ zero_fill = false;
+#endif /* HAVE_POSIX_FALLOCATE */
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not allocate space for file \"%s\" using posix_fallocate: %m",
- tmppath)));
- }
- }
-#else /* !HAVE_POSIX_FALLOCATE */
+ if (zero_fill)
{
/*
* Allocate a buffer full of zeros. This is done before opening the
}
pfree(zbuffer);
}
-#endif /* HAVE_POSIX_FALLOCATE */
if (pg_fsync(fd) != 0)
{