Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5f89bb4

Browse files
committed
Fix handling of missing files when using pg_rewind with online source
When working with an online source cluster, pg_rewind gets a list of all the files in the source data directory using a WITH RECURSIVE query, returning a NULL result for a file's metadata if it gets removed between the moment it is listed in a directory and the moment its metadata is obtained with pg_stat_file() (say a recycled WAL segment). The query result was processed in such a way that for each tuple we checked only that the first file's metadata was NULL. This could have two consequences, both resulting in a failure of the rewind: - If the first tuple referred to a removed file, all files from the source would be ignored. - Any file actually missing would not be considered as such. While on it, rework slightly the code so as no values are saved if we know that a file is going to be skipped. Issue introduced by b36805f, so backpatch down to 9.5. Author: Justin Pryzby, Michael Paquier Reviewed-by: Daniel Gustafsson, Masahiko Sawada Discussion: https://postgr.es/m/20200713061010.GC23581@telsasoft.com Backpatch-through: 9.5
1 parent e38705b commit 5f89bb4

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/bin/pg_rewind/libpq_fetch.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,13 @@ libpqProcessFileList(void)
214214
/* Read result to local variables */
215215
for (i = 0; i < PQntuples(res); i++)
216216
{
217-
char *path = PQgetvalue(res, i, 0);
218-
int64 filesize = atol(PQgetvalue(res, i, 1));
219-
bool isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
220-
char *link_target = PQgetvalue(res, i, 3);
217+
char *path;
218+
int64 filesize;
219+
bool isdir;
220+
char *link_target;
221221
file_type_t type;
222222

223-
if (PQgetisnull(res, 0, 1))
223+
if (PQgetisnull(res, i, 1))
224224
{
225225
/*
226226
* The file was removed from the server while the query was
@@ -229,6 +229,11 @@ libpqProcessFileList(void)
229229
continue;
230230
}
231231

232+
path = PQgetvalue(res, i, 0);
233+
filesize = atol(PQgetvalue(res, i, 1));
234+
isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
235+
link_target = PQgetvalue(res, i, 3);
236+
232237
if (link_target[0])
233238
type = FILE_TYPE_SYMLINK;
234239
else if (isdir)

0 commit comments

Comments
 (0)