Skip to content

Commit 1d09fb1

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 e949137 commit 1d09fb1

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/bin/pg_rewind/libpq_fetch.c

Lines changed: 10 additions & 5 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy