Ensure write failure reports no-disk-space
authorAlvaro Herrera <[email protected]>
Fri, 19 Jun 2020 20:46:06 +0000 (16:46 -0400)
committerAlvaro Herrera <[email protected]>
Fri, 19 Jun 2020 20:46:06 +0000 (16:46 -0400)
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 <[email protected]>
Author: Tom Lane <[email protected]>
Author: Álvaro Herrera <[email protected]>
Discussion: https://postgr.es/m/20200611153753[email protected]

src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_dump/pg_backup_directory.c

index d9801edd76038794c9c7f1e33999f5c8299f1633..49417084c4326906069451fb758fa2089b28e7b8 100644 (file)
@@ -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);
index 7568bc1c0d388eee09e94e0decb797b4122b678f..52120731c66d662d2dc25cc9c29f37a26e3e493f 100644 (file)
@@ -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;
 }