Use the same cmd_context throughout a walsender's lifetime. exec_replication_command created a cmd_context to work in and then deleted it on exit. This is pretty dangerous because some replication commands start/finish transactions. In the wake of commit 1afe31f03, that could lead to re-selecting a CurrentMemoryContext that's already been deleted, leading to hilarity such as a memory context that is its own parent.
To fix, let's make the cmd_context persist across exec_replication_command calls; instead of deleting it, we'll just reset it each time. In this way it retains the same identity and there's no problem if transaction abort restores it as the working context. It probably even saves a few microseconds to do this. This fix also ensures that exec_replication_command returns to the caller (PostgresMain) with the same context active that had been when it was called (probably MessageContext). The previous coding could get that wrong too. Reported-by: Anthonin Bonnefoy <anthonin.bonne...@datadoghq.com> Author: Anthonin Bonnefoy <anthonin.bonne...@datadoghq.com> Reviewed-by: Tom Lane <t...@sss.pgh.pa.us> Discussion: https://postgr.es/m/CAO6_XqoJA7-_G6t7Uqe5nWF3nj+QBGn4F6Ptp=rugdr0zo+...@mail.gmail.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/80b727eb9deab589a8648750bc20f1623d5acd3e Modified Files -------------- src/backend/replication/walsender.c | 42 +++++++++++++++++++++++++++++-------- src/test/subscription/t/100_bugs.pl | 18 ++++++++++++++++ 2 files changed, 51 insertions(+), 9 deletions(-)