aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index f97ab1ae3a2..77e5c3b5d85 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -2259,6 +2259,7 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
XLogSegNo installed_segno;
int max_advance;
int fd;
+ bool zero_fill = true;
XLogFilePath(path, ThisTimeLineID, logsegno);
@@ -2301,24 +2302,18 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
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
@@ -2366,7 +2361,6 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
}
pfree(zbuffer);
}
-#endif /* HAVE_POSIX_FALLOCATE */
if (pg_fsync(fd) != 0)
{