pgsql: If recovery.conf is created after "pg_ctl stop -m i", do crash r

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема pgsql: If recovery.conf is created after "pg_ctl stop -m i", do crash r
Дата
Msg-id E1U8q2J-00057u-BR@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
If recovery.conf is created after "pg_ctl stop -m i", do crash recovery.

If you create a base backup using an atomic filesystem snapshot, and try to
perform PITR starting from that base backup, or if you just kill a master
server and create recovery.conf to put it into standby mode, we don't know
how far we need to recover before reaching consistency. Normally in crash
recovery, we replay all the WAL present in pg_xlog, and assume that we're
consistent after that. And normally in archive recovery, minRecoveryPoint,
backupEndRequired, or backupEndPoint is set in the control file, indicating
how far we need to replay to reach consistency. But if the server was
previously up and running normally, and you kill -9 it or take an atomic
filesystem snapshot, none of those fields are set in the control file.

The solution is to perform crash recovery first, replaying all the WAL in
pg_xlog. After that's done, we assume that the system is consistent like in
normal crash recovery, and switch to archive recovery mode after that.

Per report from Kyotaro HORIGUCHI. In his scenario, recovery.conf was
created after "pg_ctl stop -m i". I'm not sure we need to support that exact
scenario, but we should support backing up using a filesystem snapshot,
which looks identical.

This issue goes back to at least 9.0, where hot standby was introduced and
we started to track when consistency is reached. In 9.1 and 9.2, we would
open up for hot standby too early, and queries could briefly see an
inconsistent state. But 9.2 made it more visible, as we started to PANIC if
we see a reference to a non-existing page during recovery, if we've already
reached consistency. This is a fairly big patch, so back-patch to 9.2 only,
where the issue is more visible. We can consider back-patching further after
this has received some more testing in 9.2 and master.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/abf5c5c9a4f142b3343614746bb9e99a794f8e7b

Modified Files
--------------
src/backend/access/transam/xlog.c |  257 ++++++++++++++++++++++++++-----------
1 files changed, 179 insertions(+), 78 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Heikki Linnakangas
Дата:
Сообщение: pgsql: If recovery.conf is created after "pg_ctl stop -m i", do crash r
Следующее
От: Heikki Linnakangas
Дата:
Сообщение: pgsql: Fix thinko in previous commit.