mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Fix parsing of xlog file name in pg_receivexlog.
The parsing of WAL filenames of segments larger than > 255 was broken, making pg_receivexlog unable to restart streaming after stopping it. The bug was introduced by the changes in 9.3 to represent WAL segment number as a 64-bit integer instead of two ints, log and seg. To fix, replace the plain sscanf call with XLogFromFileName macro, which does the conversion from log+seg to a 64-bit integer correcly. Reported by Mika Eloranta.
This commit is contained in:
parent
e36ce0c7f7
commit
2103430179
@ -134,8 +134,6 @@ FindStreamingStart(uint32 *tli)
|
|||||||
while ((dirent = readdir(dir)) != NULL)
|
while ((dirent = readdir(dir)) != NULL)
|
||||||
{
|
{
|
||||||
uint32 tli;
|
uint32 tli;
|
||||||
unsigned int log,
|
|
||||||
seg;
|
|
||||||
XLogSegNo segno;
|
XLogSegNo segno;
|
||||||
bool ispartial;
|
bool ispartial;
|
||||||
|
|
||||||
@ -164,14 +162,7 @@ FindStreamingStart(uint32 *tli)
|
|||||||
/*
|
/*
|
||||||
* Looks like an xlog file. Parse its position.
|
* Looks like an xlog file. Parse its position.
|
||||||
*/
|
*/
|
||||||
if (sscanf(dirent->d_name, "%08X%08X%08X", &tli, &log, &seg) != 3)
|
XLogFromFileName(dirent->d_name, &tli, &segno);
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
_("%s: could not parse transaction log file name \"%s\"\n"),
|
|
||||||
progname, dirent->d_name);
|
|
||||||
disconnect_and_exit(1);
|
|
||||||
}
|
|
||||||
segno = ((uint64) log) << 32 | seg;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that the segment has the right size, if it's supposed to be
|
* Check that the segment has the right size, if it's supposed to be
|
||||||
|
Loading…
x
Reference in New Issue
Block a user