Commit 21034301 authored by Heikki Linnakangas's avatar Heikki Linnakangas

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.
parent e36ce0c7
...@@ -134,8 +134,6 @@ FindStreamingStart(uint32 *tli) ...@@ -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) ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment