Re: Race condition in InvalidateObsoleteReplicationSlots()
Alvaro Herrera <alvherre@alvh.no-ip.org>
From: Álvaro Herrera <alvherre@alvh.no-ip.org>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-hackers@postgresql.org, Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>, Fujii Masao <fujii@postgresql.org>
Date: 2021-06-10T22:02:58Z
Lists: pgsql-hackers
Attachments
- 0001-the-code-fix.patch (text/x-diff)
Here's a version that I feel is committable (0001). There was an issue when returning from the inner loop, if in a previous iteration we had released the lock. In that case we need to return with the lock not held, so that the caller can acquire it again, but weren't. This seems pretty hard to hit in practice (I suppose somebody needs to destroy the slot just as checkpointer killed the walsender, but before checkpointer marks it as its own) ... but if it did happen, I think checkpointer would block with no recourse. Also added some comments and slightly restructured the code. There are plenty of conflicts in pg13, but it's all easy to handle. I wrote a test (0002) to cover the case of signalling a walsender, which is currently not covered (we only deal with the case of a standby that's not running). There are some sharp edges in this code -- I had to make it use background_psql() to send a CHECKPOINT, which hangs, because I previously send a SIGSTOP to the walreceiver. Maybe there's a better way to achieve a walreceiver that remains connected but doesn't consume input from the primary, but I don't know what it is. Anyway, the code becomes covered with this. I would like to at least see it in master, to gather some reactions from buildfarm. -- Álvaro Herrera Valdivia, Chile <Schwern> It does it in a really, really complicated way <crab> why does it need to be complicated? <Schwern> Because it's MakeMaker.
Commits
-
Add test case for obsoleting slot with active walsender, take 2
- 24043c27b46f 14.0 landed
-
Add test case for obsoleting slot with active walsender
- 09126984a263 14.0 landed
-
Return ReplicationSlotAcquire API to its original form
- 1632ea43682f 14.0 landed
-
Fix race condition in invalidating obsolete replication slots
- 96540f80f833 14.0 landed
- 218b101008b5 13.4 landed
-
Fix issues in invalidation of obsolete replication slots.
- f9e9704f09da 14.0 cited
-
Allow users to limit storage reserved by replication slots
- c6550776394e 13.0 cited