Retry opening new segments in pg_xlogdump --folllow

There is a small window between when the server closes out the existing
segment and the new one is created. Put a loop around the open call in
this case to make sure we wait for the new file to actually appear.
This commit is contained in:
Magnus Hagander 2016-09-30 11:19:30 +02:00
parent 2937ffa5d5
commit d8b4c3490c
1 changed files with 25 additions and 1 deletions

View File

@ -249,6 +249,7 @@ XLogDumpXLogRead(const char *directory, TimeLineID timeline_id,
if (sendFile < 0 || !XLByteInSeg(recptr, sendSegNo))
{
char fname[MAXFNAMELEN];
int tries;
/* Switch to another logfile segment */
if (sendFile >= 0)
@ -258,7 +259,30 @@ XLogDumpXLogRead(const char *directory, TimeLineID timeline_id,
XLogFileName(fname, timeline_id, sendSegNo);
sendFile = fuzzy_open_file(directory, fname);
/*
* In follow mode there is a short period of time after the
* server has written the end of the previous file before the
* new file is available. So we loop for 5 seconds looking
* for the file to appear before giving up.
*/
for (tries = 0; tries < 10; tries++)
{
sendFile = fuzzy_open_file(directory, fname);
if (sendFile >= 0)
break;
if (errno == ENOENT)
{
int save_errno = errno;
/* File not there yet, try again */
pg_usleep(500 * 1000);
errno = save_errno;
continue;
}
/* Any other error, fall through and fail */
break;
}
if (sendFile < 0)
fatal_error("could not find file \"%s\": %s",