BUG #17103: WAL segments are not removed after exceeding max_slot_wal_keep_size
The Post Office <noreply@postgresql.org>
From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: mk@071.ovh
Date: 2021-07-13T09:15:17Z
Lists: pgsql-bugs
The following bug has been logged on the website: Bug reference: 17103 Logged by: Marcin Krupowicz Email address: mk@071.ovh PostgreSQL version: 13.3 Operating system: CentOS 7.6 Description: Hi, After the replication fell behind and the lag exceeded max_slot_wal_keep_size, WAL on master were not removed. It seems that Postgres tried to maintain max_slot_wal_keep_size worth of segments. Please find the details below (sligthly redacted version of what I wrote here: https://stackoverflow.com/questions/68314222/replication-lag-exceeding-max-slot-wal-keep-size-wal-segments-not-removed). -- Summary -- We are using max_slot_wal_keep_size from Postgresql 13 to prevent master from being killed by a lagging replication. It seems, that in our case, WAL storage wasn't freed up after exceeding this parameter which resulted in a replication failure. WAL which, as I believe, should have been freed up did not seem to be needed by any other transaction at a time. -- Configuration -- master & one replica - streaming replication using a slot ~700GB available for pg_wal max_slot_wal_keep_size = 600GB min_wal_size = 20GB max_wal_size = 40GB default checkpoint_timeout = 5 minutes (no problem with checkpoints) archiving is on and is catching up well -- What happened -- Under heavy load (large COPY/INSERT transactions, loading hundreds of GB of data), the replication started falling behind. Available space on pg_wal was being reduced in the same rate as safe_slot pg_replication_slot.safe_wal_size - as expected. At some point safe_wal_size went negative and streaming stopped working. It wasn't a problem, because replica started recovery from WAL archive. I expected that once the slot is lost, WALs will be removed up to max_wal_size. This did not happen though. It seems that Postgres tried to maintain something close to max_slot_wal_keep_size (600GB) available, in case replica starts catching up again. Over the time, there was no single transaction which would require this much WAL to be kept. archiving wasn't behind either. Amount of free space on pg_wal was more or less 70GB for most of the time, however at some point, during heavy autovacuuming, it dipped to 0 :( This is when PG crashed and (auto-recovered soon after). After getting back up, there was 11GB left on pg_wal and no transaction running, no loading. This lasted for hours. During this time replica finally caught up from the archive and restored the replication with no delay. None of the WALs were removed. I manually run checkpoint but it did not clear any WALs. I finally restarted Postgresql and during the restarting pg_wal were finally cleared. Again - why PG did not clear WAL? WALs, even more clearly, were not needed by any process. Many thanks, -- Marcin
Commits
-
Close yet another race condition in replication slot test code
- 41d27ee7b870 13.4 landed
- f951f6f69c7e 14.0 landed
- ce197e91d02c 15.0 landed
-
Make new replication slot test code even less racy
- ce413eba4116 13.4 landed
- 1e8751380836 14.0 landed
- 0d2cb6b2bbc3 15.0 landed
-
Make new replication slot test code less racy
- d8f3b021c618 14.0 landed
- 8589299e03ff 15.0 landed
- 7099ba058035 13.4 landed
-
Advance old-segment horizon properly after slot invalidation
- ead9e51e8236 15.0 landed
- e5bcbb10707b 14.0 landed
- 866237a6fa01 13.4 landed