diff --git a/engine/.golangci.yml b/engine/.golangci.yml index e5a180f7fd142c7ac8729c1f731cead6716f9491..2b9a46df2c3672eed1df422a987c10a232ccb6eb 100644 --- a/engine/.golangci.yml +++ b/engine/.golangci.yml @@ -82,7 +82,7 @@ linters: - megacheck - misspell - prealloc -# - revive # temporarily disabled: https://gitlab.com/postgres-ai/database-lab/-/merge_requests/498 + - revive - structcheck - stylecheck - unconvert diff --git a/engine/internal/retrieval/engine/postgres/physical/pgbackrest.go b/engine/internal/retrieval/engine/postgres/physical/pgbackrest.go index 1c2f23521548210d5a39ba8715e3d607ebb5b6e3..07f13c80467b1eea339eef60aef7949f01014c64 100644 --- a/engine/internal/retrieval/engine/postgres/physical/pgbackrest.go +++ b/engine/internal/retrieval/engine/postgres/physical/pgbackrest.go @@ -16,8 +16,7 @@ const ( // pgbackrest defines a pgBackRest as an archival restoration tool. type pgbackrest struct { - pgDataDir string - options pgbackrestOptions + options pgbackrestOptions } type pgbackrestOptions struct { @@ -25,26 +24,28 @@ type pgbackrestOptions struct { ForceInit bool `yaml:"forceInit"` } -func newPgBackRest(pgDataDir string, options pgbackrestOptions) *pgbackrest { +func newPgBackRest(options pgbackrestOptions) *pgbackrest { return &pgbackrest{ - pgDataDir: pgDataDir, - options: options, + options: options, } } // GetRestoreCommand returns a command to restore data. func (p *pgbackrest) GetRestoreCommand() string { + restoreCmd := fmt.Sprintf("sudo -Eu postgres pgbackrest --type=standby --pg1-path=${PGDATA} --stanza=%[1]s restore "+ + "--recovery-option=restore_command='pgbackrest --pg1-path=${PGDATA} --stanza=%[1]s archive-get %%f %%p'", p.options.Stanza) + if p.options.ForceInit { - return fmt.Sprintf("sudo -Eu postgres pgbackrest --delta --type=standby --pg1-path=%s --stanza=%s restore", p.pgDataDir, p.options.Stanza) + restoreCmd += " --delta" } - return fmt.Sprintf("sudo -Eu postgres pgbackrest --type=standby --pg1-path=%s --stanza=%s restore", p.pgDataDir, p.options.Stanza) + return restoreCmd } // GetRecoveryConfig returns a recovery config to restore data. func (p *pgbackrest) GetRecoveryConfig(pgVersion float64) map[string]string { recoveryCfg := map[string]string{ - "restore_command": fmt.Sprintf("pgbackrest --pg1-path=%s --stanza=%s archive-get %%f %%p", p.pgDataDir, p.options.Stanza), + "restore_command": fmt.Sprintf("pgbackrest --pg1-path=${PGDATA} --stanza=%s archive-get %%f %%p", p.options.Stanza), } if pgVersion < defaults.PGVersion12 { diff --git a/engine/internal/retrieval/engine/postgres/physical/pgbackrest_test.go b/engine/internal/retrieval/engine/postgres/physical/pgbackrest_test.go index abc27f9553d27bff13f124837f9eb30fe09e80e8..2b8ca6d863741611ea9efefedbfeaf909770c3a7 100644 --- a/engine/internal/retrieval/engine/postgres/physical/pgbackrest_test.go +++ b/engine/internal/retrieval/engine/postgres/physical/pgbackrest_test.go @@ -7,31 +7,33 @@ import ( ) func TestPgBackRestRecoveryConfig(t *testing.T) { - pgbackrest := newPgBackRest("dataDir", pgbackrestOptions{Stanza: "stanzaName"}) + pgbackrest := newPgBackRest(pgbackrestOptions{Stanza: "stanzaName"}) recoveryConfig := pgbackrest.GetRecoveryConfig(11.7) expectedResponse11 := map[string]string{ - "restore_command": "pgbackrest --pg1-path=dataDir --stanza=stanzaName archive-get %f %p", + "restore_command": "pgbackrest --pg1-path=${PGDATA} --stanza=stanzaName archive-get %f %p", "recovery_target_timeline": "latest", } assert.Equal(t, expectedResponse11, recoveryConfig) recoveryConfig = pgbackrest.GetRecoveryConfig(12.3) expectedResponse12 := map[string]string{ - "restore_command": "pgbackrest --pg1-path=dataDir --stanza=stanzaName archive-get %f %p", + "restore_command": "pgbackrest --pg1-path=${PGDATA} --stanza=stanzaName archive-get %f %p", } assert.Equal(t, expectedResponse12, recoveryConfig) } func TestPgBackRestRestoreCommand(t *testing.T) { - pgbackrest := newPgBackRest("dataDir", pgbackrestOptions{Stanza: "stanzaName"}) + pgbackrest := newPgBackRest(pgbackrestOptions{Stanza: "stanzaName"}) restoreCmd := pgbackrest.GetRestoreCommand() - expectedResponse := "sudo -Eu postgres pgbackrest --type=standby --pg1-path=dataDir --stanza=stanzaName restore" + expectedResponse := "sudo -Eu postgres pgbackrest --type=standby --pg1-path=${PGDATA} --stanza=stanzaName restore " + + "--recovery-option=restore_command='pgbackrest --pg1-path=${PGDATA} --stanza=stanzaName archive-get %f %p'" assert.Equal(t, expectedResponse, restoreCmd) pgbackrest.options.ForceInit = true restoreCmd = pgbackrest.GetRestoreCommand() - expectedResponse = "sudo -Eu postgres pgbackrest --delta --type=standby --pg1-path=dataDir --stanza=stanzaName restore" + expectedResponse = "sudo -Eu postgres pgbackrest --type=standby --pg1-path=${PGDATA} --stanza=stanzaName restore " + + "--recovery-option=restore_command='pgbackrest --pg1-path=${PGDATA} --stanza=stanzaName archive-get %f %p' --delta" assert.Equal(t, expectedResponse, restoreCmd) } diff --git a/engine/internal/retrieval/engine/postgres/physical/physical.go b/engine/internal/retrieval/engine/postgres/physical/physical.go index be7a7f5e6426e49ae60e5e42a68196b0e4b466b9..bd03e2618541a740eb90d42bf72744ceaa239a1d 100644 --- a/engine/internal/retrieval/engine/postgres/physical/physical.go +++ b/engine/internal/retrieval/engine/postgres/physical/physical.go @@ -132,7 +132,7 @@ func (r *RestoreJob) getRestorer(tool string) (restorer, error) { return newWALG(r.fsPool.DataDir(), r.WALG), nil case pgbackrestTool: - return newPgBackRest(r.fsPool.DataDir(), r.PgBackRest), nil + return newPgBackRest(r.PgBackRest), nil case customTool: return newCustomTool(r.CustomTool), nil