Thread: pgsql: Fix memory leak in pgoutput with publication list cache

pgsql: Fix memory leak in pgoutput with publication list cache

From
Michael Paquier
Date:
Fix memory leak in pgoutput with publication list cache

The pgoutput module caches publication names in a list and frees it upon
invalidation.  However, the code forgot to free the actual publication
names within the list elements, as publication names are pstrdup()'d in
GetPublication().  This would cause memory to leak in
CacheMemoryContext, bloating it over time as this context is not
cleaned.

This is a problem for WAL senders running for a long time, as an
accumulation of invalidation requests would bloat its cache memory
usage.  A second case, where this leak is easier to see, involves a
backend calling SQL functions like pg_logical_slot_{get,peek}_changes()
which create a new decoding context with each execution.  More
publications create more bloat.

To address this, this commit adds a new memory context within the
logical decoding context and resets it each time the publication names
cache is invalidated, based on a suggestion from Amit Kapila.  This
ensures that the lifespan of the publication names aligns with that of
the logical decoding context.

This solution changes PGOutputData, which is fine for HEAD but it could
cause an ABI breakage in stable branches as the structure size would
change, so these are left out for now.

Analyzed-by: Michael Paquier, Jeff Davis
Author: Zhijie Hou
Reviewed-by: Michael Paquier, Masahiko Sawada, Euler Taveira
Discussion: https://postgr.es/m/Z0khf9EVMVLOc_YY@paquier.xyz

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/f0c569d7151532fbc9c016b01af49f04a9fb5278

Modified Files
--------------
src/backend/replication/pgoutput/pgoutput.c | 19 ++++++++++---------
src/include/replication/pgoutput.h          |  1 +
2 files changed, 11 insertions(+), 9 deletions(-)