summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2020-06-19 16:46:07 -0400
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2020-06-19 16:46:07 -0400
commit2e155d90d1b867f7b5bf9616236386eb1e0f40ff (patch)
tree0dd8f7db402ed548fb8ecb1e688ad99f8d295dd5 /src
parente7c183cd1fd1a7b2fb7ebbe1084bac836fbefac7 (diff)
Ensure write failure reports no-disk-space
A few places calling fwrite and gzwrite were not setting errno to ENOSPC when reporting errors, as is customary; this led to some failures being reported as "could not write file: Success" which makes us look silly. Make a few of these places in pg_dump and pg_basebackup use our customary pattern. Backpatch-to: 9.5 Author: Justin Pryzby <pryzby@telsasoft.com> Author: Tom Lane <tgl@sss.pgh.pa.us> Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Discussion: https://postgr.es/m/20200611153753.GU14879@telsasoft.com
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_basebackup/pg_basebackup.c12
-rw-r--r--src/bin/pg_dump/pg_backup_directory.c19
2 files changed, 30 insertions, 1 deletions
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index aa68f599653..305dba20cb0 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -931,8 +931,12 @@ writeTarData(
#ifdef HAVE_LIBZ
if (ztarfile != NULL)
{
+ errno = 0;
if (gzwrite(ztarfile, buf, r) != r)
{
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
fprintf(stderr,
_("%s: could not write to compressed file \"%s\": %s\n"),
progname, current_file, get_gz_error(ztarfile));
@@ -942,8 +946,12 @@ writeTarData(
else
#endif
{
+ errno = 0;
if (fwrite(buf, r, 1, tarfile) != 1)
{
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
progname, current_file, strerror(errno));
disconnect_and_exit(1);
@@ -1555,8 +1563,12 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
continue;
}
+ errno = 0;
if (fwrite(copybuf, r, 1, file) != 1)
{
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
progname, filename, strerror(errno));
disconnect_and_exit(1);
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index 0ec049e6ea0..fe1f8e1e33f 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -351,10 +351,15 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
{
lclContext *ctx = (lclContext *) AH->formatData;
+ errno = 0;
if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH));
-
+ }
return;
}
@@ -491,9 +496,15 @@ _WriteByte(ArchiveHandle *AH, const int i)
unsigned char c = (unsigned char) i;
lclContext *ctx = (lclContext *) AH->formatData;
+ errno = 0;
if (cfwrite(&c, 1, ctx->dataFH) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH));
+ }
return 1;
}
@@ -521,9 +532,15 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
{
lclContext *ctx = (lclContext *) AH->formatData;
+ errno = 0;
if (cfwrite(buf, len, ctx->dataFH) != len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
exit_horribly(modulename, "could not write to output file: %s\n",
get_cfp_error(ctx->dataFH));
+ }
return;
}