From 1e2fddfa33d3c7cc93ca3ee0f32852699bd3e012 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 29 Jul 2019 07:41:06 +0200 Subject: [PATCH] Handle fsync failures in pg_receivewal and pg_recvlogical It is not safe to simply report an fsync error and continue. We must exit the program instead. Reviewed-by: Michael Paquier Reviewed-by: Sehrope Sarkuni Discussion: https://www.postgresql.org/message-id/flat/9b49fe44-8f3e-eca9-5914-29e9e99030bf@2ndquadrant.com --- src/bin/pg_basebackup/pg_recvlogical.c | 4 ++-- src/bin/pg_basebackup/receivelog.c | 12 ++++++------ src/bin/pg_basebackup/walmethods.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index 90a3f41bbb..af29dd7651 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -192,8 +192,8 @@ OutputFsync(TimestampTz now) if (fsync(outfd) != 0) { - pg_log_error("could not fsync file \"%s\": %m", outfile); - return false; + pg_log_fatal("could not fsync file \"%s\": %m", outfile); + exit(1); } return true; diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index 2fd16421aa..d73f6145c1 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -134,10 +134,10 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint) /* fsync file in case of a previous crash */ if (stream->walmethod->sync(f) != 0) { - pg_log_error("could not fsync existing write-ahead log file \"%s\": %s", + pg_log_fatal("could not fsync existing write-ahead log file \"%s\": %s", fn, stream->walmethod->getlasterror()); stream->walmethod->close(f, CLOSE_UNLINK); - return false; + exit(1); } walfile = f; @@ -763,9 +763,9 @@ HandleCopyStream(PGconn *conn, StreamCtl *stream, { if (stream->walmethod->sync(walfile) != 0) { - pg_log_error("could not fsync file \"%s\": %s", + pg_log_fatal("could not fsync file \"%s\": %s", current_walfile_name, stream->walmethod->getlasterror()); - goto error; + exit(1); } lastFlushPosition = blockpos; @@ -1015,9 +1015,9 @@ ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len, */ if (stream->walmethod->sync(walfile) != 0) { - pg_log_error("could not fsync file \"%s\": %s", + pg_log_fatal("could not fsync file \"%s\": %s", current_walfile_name, stream->walmethod->getlasterror()); - return false; + exit(1); } lastFlushPosition = blockpos; } diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 83b520898b..8ec12e6f72 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -864,7 +864,7 @@ tar_close(Walfile f, WalCloseMethod method) /* Always fsync on close, so the padding gets fsynced */ if (tar_sync(f) < 0) - return -1; + exit(1); /* Clean up and done */ pg_free(tf->pathname); -- 2.40.0