aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2012-01-09 11:53:38 +0100
committerMagnus Hagander <magnus@hagander.net>2012-01-09 18:07:19 +0100
commit6b020d228b976821181ac673964f302b2c32f12d (patch)
tree566ae4191afad7ed13599d9ea7170d6fa0fa0a0c
parentdb49517c62750322fb2a37ff6324ecc00965e641 (diff)
downloadpostgresql-6b020d228b976821181ac673964f302b2c32f12d.tar.gz
postgresql-6b020d228b976821181ac673964f302b2c32f12d.zip
Fix pg_basebackup for keepalive messages
Teach pg_basebackup in streaming mode to deal with keepalive messages. Also change the order of checks to complain at the message rather than block size when a new message is introduced. In passing, switch to using sizeof() instead of hardcoded sizes for WAL protocol structs.
-rw-r--r--src/bin/pg_basebackup/receivelog.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index c18db4fd042..e3a0e92d363 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -33,8 +33,9 @@
#include <unistd.h>
-/* Size of the streaming replication protocol header */
-#define STREAMING_HEADER_SIZE (1+8+8+8)
+/* Size of the streaming replication protocol headers */
+#define STREAMING_HEADER_SIZE (1+sizeof(WalDataMessageHeader))
+#define STREAMING_KEEPALIVE_SIZE (1+sizeof(PrimaryKeepaliveMessage))
const XLogRecPtr InvalidXLogRecPtr = {0, 0};
@@ -374,18 +375,33 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline, char *sysi
progname, PQerrorMessage(conn));
return false;
}
- if (r < STREAMING_HEADER_SIZE + 1)
+ if (copybuf[0] == 'k')
{
- fprintf(stderr, _("%s: streaming header too small: %i\n"),
- progname, r);
- return false;
+ /*
+ * keepalive message, sent in 9.2 and newer. We just ignore
+ * this message completely, but need to forward past it
+ * in our reading.
+ */
+ if (r != STREAMING_KEEPALIVE_SIZE)
+ {
+ fprintf(stderr, _("%s: keepalive message is incorrect size: %i\n"),
+ progname, r);
+ return false;
+ }
+ continue;
}
- if (copybuf[0] != 'w')
+ else if (copybuf[0] != 'w')
{
fprintf(stderr, _("%s: unrecognized streaming header: \"%c\"\n"),
progname, copybuf[0]);
return false;
}
+ if (r < STREAMING_HEADER_SIZE + 1)
+ {
+ fprintf(stderr, _("%s: streaming header too small: %i\n"),
+ progname, r);
+ return false;
+ }
/* Extract WAL location for this block */
memcpy(&blockpos, copybuf + 1, 8);