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 <michael@paquier.xyz>
Reviewed-by: Sehrope Sarkuni <sehrope@jackdb.com>
Discussion: https://www.postgresql.org/message-id/flat/9b49fe44-8f3e-eca9-5914-29e9e99030bf@2ndquadrant.com
This commit is contained in:
Peter Eisentraut 2019-07-29 07:41:06 +02:00
parent eb43f3d193
commit 1e2fddfa33
3 changed files with 9 additions and 9 deletions

View File

@ -192,8 +192,8 @@ OutputFsync(TimestampTz now)
if (fsync(outfd) != 0) if (fsync(outfd) != 0)
{ {
pg_log_error("could not fsync file \"%s\": %m", outfile); pg_log_fatal("could not fsync file \"%s\": %m", outfile);
return false; exit(1);
} }
return true; return true;

View File

@ -134,10 +134,10 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
/* fsync file in case of a previous crash */ /* fsync file in case of a previous crash */
if (stream->walmethod->sync(f) != 0) 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()); fn, stream->walmethod->getlasterror());
stream->walmethod->close(f, CLOSE_UNLINK); stream->walmethod->close(f, CLOSE_UNLINK);
return false; exit(1);
} }
walfile = f; walfile = f;
@ -763,9 +763,9 @@ HandleCopyStream(PGconn *conn, StreamCtl *stream,
{ {
if (stream->walmethod->sync(walfile) != 0) 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()); current_walfile_name, stream->walmethod->getlasterror());
goto error; exit(1);
} }
lastFlushPosition = blockpos; lastFlushPosition = blockpos;
@ -1015,9 +1015,9 @@ ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
*/ */
if (stream->walmethod->sync(walfile) != 0) 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()); current_walfile_name, stream->walmethod->getlasterror());
return false; exit(1);
} }
lastFlushPosition = blockpos; lastFlushPosition = blockpos;
} }

View File

@ -864,7 +864,7 @@ tar_close(Walfile f, WalCloseMethod method)
/* Always fsync on close, so the padding gets fsynced */ /* Always fsync on close, so the padding gets fsynced */
if (tar_sync(f) < 0) if (tar_sync(f) < 0)
return -1; exit(1);
/* Clean up and done */ /* Clean up and done */
pg_free(tf->pathname); pg_free(tf->pathname);