1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

Assorted corrections to the patch to add WAL receiver replies.

Per reports from Fujii Masao.
This commit is contained in:
Robert Haas
2011-02-15 12:02:53 -05:00
parent 6a77e9385e
commit 883a9659fa
2 changed files with 42 additions and 29 deletions

View File

@ -89,6 +89,11 @@ static uint32 sendOff = 0;
*/
static XLogRecPtr sentPtr = {0, 0};
/*
* Buffer for processing reply messages.
*/
static StringInfoData reply_message;
/* Flags set by signal handlers for later service in main loop */
static volatile sig_atomic_t got_SIGHUP = false;
volatile sig_atomic_t walsender_shutdown_requested = false;
@ -469,7 +474,7 @@ ProcessRepliesIfAny(void)
switch (firstchar)
{
/*
* 'd' means a standby reply wrapped in a COPY BOTH packet.
* 'd' means a standby reply wrapped in a CopyData packet.
*/
case 'd':
ProcessStandbyReplyMessage();
@ -495,16 +500,15 @@ ProcessRepliesIfAny(void)
static void
ProcessStandbyReplyMessage(void)
{
static StringInfoData input_message;
StandbyReplyMessage reply;
char msgtype;
initStringInfo(&input_message);
resetStringInfo(&reply_message);
/*
* Read the message contents.
*/
if (pq_getmessage(&input_message, 0))
if (pq_getmessage(&reply_message, 0))
{
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
@ -516,13 +520,16 @@ ProcessStandbyReplyMessage(void)
* Check message type from the first byte. At the moment, there is only
* one type.
*/
msgtype = pq_getmsgbyte(&input_message);
msgtype = pq_getmsgbyte(&reply_message);
if (msgtype != 'r')
{
ereport(COMMERROR,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("unexpected message type %c", msgtype)));
proc_exit(0);
}
pq_copymsgbytes(&input_message, (char *) &reply, sizeof(StandbyReplyMessage));
pq_copymsgbytes(&reply_message, (char *) &reply, sizeof(StandbyReplyMessage));
elog(DEBUG2, "write %X/%X flush %X/%X apply %X/%X ",
reply.write.xlogid, reply.write.xrecoff,
@ -559,6 +566,12 @@ WalSndLoop(void)
*/
output_message = palloc(1 + sizeof(WalDataMessageHeader) + MAX_SEND_SIZE);
/*
* Allocate buffer that will be used for processing reply messages. As
* above, do this just once to reduce palloc overhead.
*/
initStringInfo(&reply_message);
/* Loop forever, unless we get an error */
for (;;)
{