mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Fix memory leak in LogStandbySnapshot().
The array allocated by GetRunningTransactionLocks() needs to be pfree'd when we're done with it. Otherwise we leak some memory during each checkpoint, if wal_level = hot_standby. This manifests as memory bloat in the checkpointer process, or in bgwriter in versions before we made the checkpointer separate. Reported and fixed by Naoya Anzai. Back-patch to 9.0 where the issue was introduced. In passing, improve comments for GetRunningTransactionLocks(), and add an Assert that we didn't overrun the palloc'd array.
This commit is contained in:
@ -865,16 +865,11 @@ LogStandbySnapshot(void)
|
||||
|
||||
/*
|
||||
* Get details of any AccessExclusiveLocks being held at the moment.
|
||||
*
|
||||
* XXX GetRunningTransactionLocks() currently holds a lock on all
|
||||
* partitions though it is possible to further optimise the locking. By
|
||||
* reference counting locks and storing the value on the ProcArray entry
|
||||
* for each backend we can easily tell if any locks need recording without
|
||||
* trying to acquire the partition locks and scanning the lock table.
|
||||
*/
|
||||
locks = GetRunningTransactionLocks(&nlocks);
|
||||
if (nlocks > 0)
|
||||
LogAccessExclusiveLocks(nlocks, locks);
|
||||
pfree(locks);
|
||||
|
||||
/*
|
||||
* Log details of all in-progress transactions. This should be the last
|
||||
|
Reference in New Issue
Block a user