Commit 1d04a59b authored by Fujii Masao's avatar Fujii Masao

Make walsender always initialize the buffers.

Walsender uses the local buffers for each outgoing and incoming message.
Previously when creating replication slot, walsender forgot to initialize
one of them and which can cause the segmentation fault error. To fix this
issue, this commit changes walsender so that it always initialize them
before it executes the requested replication command.

Back-patch to 9.4 where replication slot was introduced.

Problem report and initial patch by Stas Kelvich, modified by me.
Report: https://www.postgresql.org/message-id/A1E9CB90-1FAC-4CAD-8DBA-9AA62A6E97C5@postgrespro.ru
parent d3653700
...@@ -773,8 +773,6 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) ...@@ -773,8 +773,6 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
cmd->temporary ? RS_TEMPORARY : RS_EPHEMERAL); cmd->temporary ? RS_TEMPORARY : RS_EPHEMERAL);
} }
initStringInfo(&output_message);
if (cmd->kind == REPLICATION_KIND_LOGICAL) if (cmd->kind == REPLICATION_KIND_LOGICAL)
{ {
LogicalDecodingContext *ctx; LogicalDecodingContext *ctx;
...@@ -1258,6 +1256,14 @@ exec_replication_command(const char *cmd_string) ...@@ -1258,6 +1256,14 @@ exec_replication_command(const char *cmd_string)
cmd_node = replication_parse_result; cmd_node = replication_parse_result;
/*
* Allocate buffers that will be used for each outgoing and incoming
* message. We do this just once per command to reduce palloc overhead.
*/
initStringInfo(&output_message);
initStringInfo(&reply_message);
initStringInfo(&tmpbuf);
switch (cmd_node->type) switch (cmd_node->type)
{ {
case T_IdentifySystemCmd: case T_IdentifySystemCmd:
...@@ -1736,14 +1742,6 @@ WalSndCheckTimeOut(TimestampTz now) ...@@ -1736,14 +1742,6 @@ WalSndCheckTimeOut(TimestampTz now)
static void static void
WalSndLoop(WalSndSendDataCallback send_data) WalSndLoop(WalSndSendDataCallback send_data)
{ {
/*
* Allocate buffers that will be used for each outgoing and incoming
* message. We do this just once to reduce palloc overhead.
*/
initStringInfo(&output_message);
initStringInfo(&reply_message);
initStringInfo(&tmpbuf);
/* /*
* Initialize the last reply timestamp. That enables timeout processing * Initialize the last reply timestamp. That enables timeout processing
* from hereon. * from hereon.
......
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