diff options
author | Stan Hu <stanhu@gmail.com> | 2020-04-09 23:19:17 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2020-04-10 01:55:08 +0300 |
commit | 8f26b4b441517a19dc250bdc21990bf07ba93dd1 (patch) | |
tree | 93d3d0953cc086f09a3a78641d1fe191f3181ab5 | |
parent | ed0edf396da0d62aeec607ee4988e19bec36ea30 (diff) |
Support ignoring unknown Praefect migrations
This commit adds an `-ignore-unknown` flag to make it possible to bypass
the unknown migration check in Prafect. This emulates the behavior of
Rails.
We had a canary deployment that ran `praefect sql-migrate` on a binary
that was more recent that the one that was being deployed in
production. As a result, the older binary going to production failed in
the `praefect sql-migrate` because it detected a new but unknown
migration. This halted the deploy, and we worked around this by rolling
back the newly-added tables.
Note that we don't do this by default because the documentation warns
that this flag should be used sparingly, and it remains to be seen
whether using this mode is a flaw with our deployment process.
Closes https://gitlab.com/gitlab-org/gitaly/-/issues/2644
-rw-r--r-- | changelogs/unreleased/sh-support-sql-migrate-ignore-unknown.yml | 5 | ||||
-rw-r--r-- | cmd/praefect/subcmd.go | 10 | ||||
-rw-r--r-- | internal/praefect/datastore/glsql/postgres.go | 3 | ||||
-rw-r--r-- | internal/praefect/datastore/glsql/testing.go | 2 |
4 files changed, 15 insertions, 5 deletions
diff --git a/changelogs/unreleased/sh-support-sql-migrate-ignore-unknown.yml b/changelogs/unreleased/sh-support-sql-migrate-ignore-unknown.yml new file mode 100644 index 000000000..1247b62b7 --- /dev/null +++ b/changelogs/unreleased/sh-support-sql-migrate-ignore-unknown.yml @@ -0,0 +1,5 @@ +--- +title: Support ignoring unknown Praefect migrations +merge_request: 2039 +author: +type: changed diff --git a/cmd/praefect/subcmd.go b/cmd/praefect/subcmd.go index 0e0fd3820..ff8cf783e 100644 --- a/cmd/praefect/subcmd.go +++ b/cmd/praefect/subcmd.go @@ -86,10 +86,14 @@ func (s *sqlPingSubcommand) Exec(flags *flag.FlagSet, conf config.Config) error return nil } -type sqlMigrateSubcommand struct{} +type sqlMigrateSubcommand struct { + ignoreUnknown bool +} func (s *sqlMigrateSubcommand) FlagSet() *flag.FlagSet { - return flag.NewFlagSet("sql-migrate", flag.ExitOnError) + flags := flag.NewFlagSet("sql-migrate", flag.ExitOnError) + flags.BoolVar(&s.ignoreUnknown, "ignore-unknown", false, "ignore unknown migrations (default is false)") + return flags } func (s *sqlMigrateSubcommand) Exec(flags *flag.FlagSet, conf config.Config) error { @@ -101,7 +105,7 @@ func (s *sqlMigrateSubcommand) Exec(flags *flag.FlagSet, conf config.Config) err } defer clean() - n, err := glsql.Migrate(db) + n, err := glsql.Migrate(db, s.ignoreUnknown) if err != nil { return fmt.Errorf("%s: fail: %v", subCmd, err) } diff --git a/internal/praefect/datastore/glsql/postgres.go b/internal/praefect/datastore/glsql/postgres.go index ee837e86a..cee10faa1 100644 --- a/internal/praefect/datastore/glsql/postgres.go +++ b/internal/praefect/datastore/glsql/postgres.go @@ -30,8 +30,9 @@ func OpenDB(conf config.DB) (*sql.DB, error) { } // Migrate will apply all pending SQL migrations. -func Migrate(db *sql.DB) (int, error) { +func Migrate(db *sql.DB, ignoreUnknown bool) (int, error) { migrationSource := &migrate.MemoryMigrationSource{Migrations: migrations.All()} + migrate.SetIgnoreUnknown(ignoreUnknown) return migrate.Exec(db, "postgres", migrationSource, migrate.Up) } diff --git a/internal/praefect/datastore/glsql/testing.go b/internal/praefect/datastore/glsql/testing.go index 1bda1a54c..f9bf61738 100644 --- a/internal/praefect/datastore/glsql/testing.go +++ b/internal/praefect/datastore/glsql/testing.go @@ -82,7 +82,7 @@ func GetDB(t testing.TB, database string) DB { testDBInitOnce.Do(func() { sqlDB := initGitalyTestDB(t, database) - _, mErr := Migrate(sqlDB) + _, mErr := Migrate(sqlDB, false) require.NoError(t, mErr, "failed to run database migration") testDB = DB{DB: sqlDB} }) |