Use pg_pwrite_zeros() in walmethods.c

This change impacts pg_receivewal and pg_basebackup, for the pre-padding
with zeros of all the new non-compressed WAL segments, so as the code is
more robust on partial writes.  This makes the code consistent with the
backend (XLogFileInitInternal) when wal_init_zeros is enabled for the
WAL segment initialization.

Author: Bharath Rupireddy
Reviewed-by: Nathan Bossart, Andres Freund, Thomas Munro, Michael
Paquier
Discussion: https://postgr.es/m/CALj2ACUq7nAb7=bJNbK3yYmp-SZhJcXFR_pLk8un6XgDzDF3OA@mail.gmail.com
This commit is contained in:
Michael Paquier 2022-11-08 12:37:11 +09:00
parent 3bdbdf5d06
commit 28cc2976a9

View File

@ -220,22 +220,21 @@ dir_open_for_write(WalWriteMethod *wwmethod, const char *pathname,
/* Do pre-padding on non-compressed files */
if (pad_to_size && wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
{
PGAlignedXLogBlock zerobuf;
int bytes;
ssize_t rc;
memset(zerobuf.data, 0, XLOG_BLCKSZ);
for (bytes = 0; bytes < pad_to_size; bytes += XLOG_BLCKSZ)
rc = pg_pwrite_zeros(fd, pad_to_size);
if (rc < 0)
{
errno = 0;
if (write(fd, zerobuf.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
{
/* If write didn't set errno, assume problem is no disk space */
wwmethod->lasterrno = errno ? errno : ENOSPC;
wwmethod->lasterrno = errno;
close(fd);
return NULL;
}
}
/*
* pg_pwrite() (called via pg_pwrite_zeros()) may have moved the file
* position, so reset it (see win32pwrite.c).
*/
if (lseek(fd, 0, SEEK_SET) != 0)
{
wwmethod->lasterrno = errno;