Clarify some errors in pg_receivewal when closing WAL segments
A WAL segment closed during a WAL stream for pg_receivewal would generate incorrect error messages depending on the context, as the file name used when referring to a WAL segment ignored partial files or the compression method used. In such cases, the error message generated (failure on close, seek or rename) would not match a physical file name. The same code paths are used by pg_basebackup, but it uses no partial suffix so it is not impacted. 7fbe0c8 has introduced in walmethods.c a callback to get the exact physical file name used for a given context, this commit makes use of it to improve those error messages. This could be extended to more code paths of pg_basebackup/ in the future, if necessary. Extracted from a larger patch by the same author. Author: Georgios Kokolatos Discussion: https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me
This commit is contained in:
parent
5adb06732d
commit
cddcf7842c
@ -185,20 +185,27 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
|
|||||||
static bool
|
static bool
|
||||||
close_walfile(StreamCtl *stream, XLogRecPtr pos)
|
close_walfile(StreamCtl *stream, XLogRecPtr pos)
|
||||||
{
|
{
|
||||||
|
char *fn;
|
||||||
off_t currpos;
|
off_t currpos;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (walfile == NULL)
|
if (walfile == NULL)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
/* Note that this considers the compression used if necessary */
|
||||||
|
fn = stream->walmethod->get_file_name(current_walfile_name,
|
||||||
|
stream->partial_suffix);
|
||||||
|
|
||||||
currpos = stream->walmethod->get_current_pos(walfile);
|
currpos = stream->walmethod->get_current_pos(walfile);
|
||||||
|
|
||||||
if (currpos == -1)
|
if (currpos == -1)
|
||||||
{
|
{
|
||||||
pg_log_error("could not determine seek position in file \"%s\": %s",
|
pg_log_error("could not determine seek position in file \"%s\": %s",
|
||||||
current_walfile_name, stream->walmethod->getlasterror());
|
fn, stream->walmethod->getlasterror());
|
||||||
stream->walmethod->close(walfile, CLOSE_UNLINK);
|
stream->walmethod->close(walfile, CLOSE_UNLINK);
|
||||||
walfile = NULL;
|
walfile = NULL;
|
||||||
|
|
||||||
|
pg_free(fn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,8 +215,7 @@ close_walfile(StreamCtl *stream, XLogRecPtr pos)
|
|||||||
r = stream->walmethod->close(walfile, CLOSE_NORMAL);
|
r = stream->walmethod->close(walfile, CLOSE_NORMAL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pg_log_info("not renaming \"%s%s\", segment is not complete",
|
pg_log_info("not renaming \"%s\", segment is not complete", fn);
|
||||||
current_walfile_name, stream->partial_suffix);
|
|
||||||
r = stream->walmethod->close(walfile, CLOSE_NO_RENAME);
|
r = stream->walmethod->close(walfile, CLOSE_NO_RENAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -221,10 +227,14 @@ close_walfile(StreamCtl *stream, XLogRecPtr pos)
|
|||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
pg_log_error("could not close file \"%s\": %s",
|
pg_log_error("could not close file \"%s\": %s",
|
||||||
current_walfile_name, stream->walmethod->getlasterror());
|
fn, stream->walmethod->getlasterror());
|
||||||
|
|
||||||
|
pg_free(fn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pg_free(fn);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mark file as archived if requested by the caller - pg_basebackup needs
|
* Mark file as archived if requested by the caller - pg_basebackup needs
|
||||||
* to do so as files can otherwise get archived again after promotion of a
|
* to do so as files can otherwise get archived again after promotion of a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user