postgres.git / summary / log / commit / refs

commit    bbbce94dc262fa255ec53a9949f899369afdb4e7
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Fri Jun 19 20:46:06 2020 +0000
First released in: 14.0, 9.5.23, 9.6.19, 10.14, 11.9, 12.4, 13.0

    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


src/bin/pg_basebackup/pg_basebackup.c | 12 ++++++++++++ src/bin/pg_dump/pg_backup_directory.c | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index d9801edd760..49417084c43 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -740,8 +740,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)); @@ -751,8 +755,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); @@ -1357,8 +1365,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 7568bc1c0d3..52120731c66 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -356,10 +356,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; } @@ -496,9 +501,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; } @@ -526,9 +537,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; } [parent: 34ef5863c77b]