diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2020-06-19 16:46:07 -0400 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2020-06-19 16:46:07 -0400 |
commit | e74559c9763049ff4d3edd26817bad58c13113a1 (patch) | |
tree | ccb02b2e67581e132f6a01c88f082c6a8ea2042d | |
parent | 577dcf890cdb2621cf21ded1a2b6c96c40441f3d (diff) | |
download | postgresql-e74559c9763049ff4d3edd26817bad58c13113a1.tar.gz postgresql-e74559c9763049ff4d3edd26817bad58c13113a1.zip |
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
-rw-r--r-- | src/bin/pg_basebackup/pg_basebackup.c | 16 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_backup_directory.c | 18 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index b9ec640d2fc..3be5f6c645f 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -992,8 +992,12 @@ writeTarData(WriteTarState *state, char *buf, int r) #ifdef HAVE_LIBZ if (state->ztarfile != NULL) { + errno = 0; if (gzwrite(state->ztarfile, buf, r) != r) { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; pg_log_error("could not write to compressed file \"%s\": %s", state->filename, get_gz_error(state->ztarfile)); exit(1); @@ -1002,8 +1006,12 @@ writeTarData(WriteTarState *state, char *buf, int r) else #endif { + errno = 0; if (fwrite(buf, r, 1, state->tarfile) != 1) { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; pg_log_error("could not write to file \"%s\": %m", state->filename); exit(1); @@ -1691,8 +1699,12 @@ ReceiveTarAndUnpackCopyChunk(size_t r, char *copybuf, void *callback_data) return; } + errno = 0; if (fwrite(copybuf, r, 1, state->file) != 1) { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; pg_log_error("could not write to file \"%s\": %m", state->filename); exit(1); } @@ -1743,8 +1755,12 @@ ReceiveBackupManifestChunk(size_t r, char *copybuf, void *callback_data) { WriteManifestState *state = callback_data; + errno = 0; if (fwrite(copybuf, r, 1, state->file) != 1) { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; pg_log_error("could not write to file \"%s\": %m", state->filename); exit(1); } diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c index ac81151acc9..cb0f7f31fd7 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -346,9 +346,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; fatal("could not write to output file: %s", get_cfp_error(ctx->dataFH)); + } } /* @@ -481,9 +487,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; fatal("could not write to output file: %s", get_cfp_error(ctx->dataFH)); + } return 1; } @@ -511,9 +523,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; fatal("could not write to output file: %s", get_cfp_error(ctx->dataFH)); + } } /* |