summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-01-08 23:06:03 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-01-08 23:30:55 +0200
commit3bd8987ef88b8cf2c4c792ef5bbc46fc852e0f13 (patch)
tree0206f0f05af60e154d27b544294424f823f14b4a
parent82c75f9dd3187d44d9fe2e335cd7460fc6d99b71 (diff)
Fix pause_at_recovery_target + recovery_target_inclusive combination.
If pause_at_recovery_target is set, recovery pauses *before* applying the target record, even if recovery_target_inclusive is set. If you then continue with pg_xlog_replay_resume(), it will apply the target record before ending recovery. In other words, if you log in while it's paused and verify that the database looks OK, ending recovery changes its state again, possibly destroying data that you were tring to salvage with PITR. Backpatch to 9.1, this has been broken since pause_at_recovery_target was added.
-rw-r--r--src/backend/access/transam/xlog.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index de17f722dfc..679720a33ee 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6868,11 +6868,6 @@ StartupXLOG(void)
*/
if (recoveryStopsHere(record, &recoveryApply))
{
- if (recoveryPauseAtTarget)
- {
- SetRecoveryPause(true);
- recoveryPausesHere();
- }
reachedStopPoint = true; /* see below */
recoveryContinue = false;
@@ -6951,6 +6946,12 @@ StartupXLOG(void)
* end of main redo apply loop
*/
+ if (recoveryPauseAtTarget && reachedStopPoint)
+ {
+ SetRecoveryPause(true);
+ recoveryPausesHere();
+ }
+
ereport(LOG,
(errmsg("redo done at %X/%X",
ReadRecPtr.xlogid, ReadRecPtr.xrecoff)));