Skip to content

Commit 268ac6c

Browse files
committed
*: set recovery_target_action to promote when using recovery target settings
* Set recovery_target_action to "promote" when using recovery target settings * When the user specifies some recovery target settings then accept them only when the cluster role is not standby (it doesn't makes sense to restore a standby cluster to a different timeline or stopping at a specified time/lsn/xid)
1 parent 11f9f8a commit 268ac6c

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

cmd/keeper/cmd/keeper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,10 @@ func (p *PostgresKeeper) createRecoveryParameters(standbySettings *cluster.Stand
396396
if recoveryTargetSettings.RecoveryTargetXid != "" {
397397
parameters["recovery_target_xid"] = recoveryTargetSettings.RecoveryTargetXid
398398
}
399-
400399
if recoveryTargetSettings.RecoveryTargetTimeline != "" {
401400
parameters["recovery_target_timeline"] = recoveryTargetSettings.RecoveryTargetTimeline
402401
}
402+
parameters["recovery_target_action"] = "promote"
403403
}
404404

405405
return parameters

internal/cluster/cluster.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,9 @@ func (os *ClusterSpec) Validate() error {
461461
if s.PITRConfig.DataRestoreCommand == "" {
462462
return fmt.Errorf("pitrConfig.DataRestoreCommand undefined")
463463
}
464+
if s.PITRConfig.RecoveryTargetSettings != nil && *s.Role == ClusterRoleStandby {
465+
return fmt.Errorf("cannot define pitrConfig.RecoveryTargetSettings when required cluster role is standby")
466+
}
464467
default:
465468
return fmt.Errorf("unknown initMode: %q", *s.InitMode)
466469

tests/integration/pitr_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ import (
3333
func TestPITR(t *testing.T) {
3434
t.Parallel()
3535

36+
testPITR(t, false)
37+
}
38+
39+
func TestPITRRecoveryTarget(t *testing.T) {
40+
t.Parallel()
41+
42+
testPITR(t, true)
43+
}
44+
45+
func testPITR(t *testing.T, recoveryTarget bool) {
3646
dir, err := ioutil.TempDir("", "stolon")
3747
if err != nil {
3848
t.Fatalf("unexpected err: %v", err)
@@ -109,6 +119,9 @@ func TestPITR(t *testing.T) {
109119
t.Fatalf("unexpected err: %v", err)
110120
}
111121

122+
// save current time used to define recovery_target_time
123+
now := time.Now()
124+
112125
// ioutil.Tempfile already creates files with 0600 permissions
113126
pgpass, err := ioutil.TempFile("", "pgpass")
114127
if err != nil {
@@ -155,6 +168,13 @@ func TestPITR(t *testing.T) {
155168
"max_prepared_transactions": "100",
156169
}),
157170
}
171+
172+
if recoveryTarget {
173+
initialClusterSpec.PITRConfig.RecoveryTargetSettings = &cluster.RecoveryTargetSettings{
174+
RecoveryTargetTime: now.Format(time.RFC3339),
175+
}
176+
}
177+
158178
initialClusterSpecFile, err = writeClusterSpec(dir, initialClusterSpec)
159179
if err != nil {
160180
t.Fatalf("unexpected err: %v", err)

0 commit comments

Comments
 (0)