Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2020-04-09 23:19:17 +0300
committerStan Hu <stanhu@gmail.com>2020-04-10 01:55:08 +0300
commit8f26b4b441517a19dc250bdc21990bf07ba93dd1 (patch)
tree93d3d0953cc086f09a3a78641d1fe191f3181ab5
parented0edf396da0d62aeec607ee4988e19bec36ea30 (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.yml5
-rw-r--r--cmd/praefect/subcmd.go10
-rw-r--r--internal/praefect/datastore/glsql/postgres.go3
-rw-r--r--internal/praefect/datastore/glsql/testing.go2
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}
})