From 0a85537c79b65f3b10a4b66265a23a8de46a2e43 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Wed, 7 Dec 2022 23:58:31 +0800 Subject: [PATCH] Support disabling database auto migration (#22053) Gitea will migrate the database model version automatically, but it should be able to be disabled and keep Gitea shutdown if the version is not matched. --- custom/conf/app.example.ini | 3 +++ .../doc/advanced/config-cheat-sheet.en-us.md | 1 + modules/doctor/dbversion.go | 1 + modules/setting/database.go | 2 ++ routers/common/db.go | 21 ++++++++++++++++++- 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index bee12ffa9b..03f004ee90 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -403,6 +403,9 @@ LOG_SQL = false ; if unset defaults to true ;; ;; Database maximum number of open connections, default is 0 meaning no maximum ;MAX_OPEN_CONNS = 0 +;; +;; Whether execute database models migrations automatically +;AUTO_MIGRATION = true ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 756ab32256..37f03b42ea 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -444,6 +444,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a - `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit. - `MAX_IDLE_CONNS` **2**: Max idle database connections on connection pool, default is 2 - this will be capped to `MAX_OPEN_CONNS`. - `CONN_MAX_LIFETIME` **0 or 3s**: Sets the maximum amount of time a DB connection may be reused - default is 0, meaning there is no limit (except on MySQL where it is 3s - see #6804 & #7071). +- `AUTO_MIGRATION` **true**: Whether execute database models migrations automatically. Please see #8540 & #8273 for further discussion of the appropriate values for `MAX_OPEN_CONNS`, `MAX_IDLE_CONNS` & `CONN_MAX_LIFETIME` and their relation to port exhaustion. diff --git a/modules/doctor/dbversion.go b/modules/doctor/dbversion.go index 3ddca92fb3..2b20cb2340 100644 --- a/modules/doctor/dbversion.go +++ b/modules/doctor/dbversion.go @@ -12,6 +12,7 @@ import ( ) func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error { + logger.Info("Expected database version: %d", migrations.ExpectedVersion()) if err := db.InitEngineWithMigration(ctx, migrations.EnsureUpToDate); err != nil { if !autofix { logger.Critical("Error: %v during ensure up to date", err) diff --git a/modules/setting/database.go b/modules/setting/database.go index be06c47478..5480f9dffd 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -49,6 +49,7 @@ var ( MaxOpenConns int ConnMaxLifetime time.Duration IterateBufferSize int + AutoMigration bool }{ Timeout: 500, IterateBufferSize: 50, @@ -105,6 +106,7 @@ func InitDBConfig() { Database.LogSQL = sec.Key("LOG_SQL").MustBool(true) Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10) Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second) + Database.AutoMigration = sec.Key("AUTO_MIGRATION").MustBool(true) } // DBConnStr returns database connection string diff --git a/routers/common/db.go b/routers/common/db.go index ac082ab36f..2e86fbd0fd 100644 --- a/routers/common/db.go +++ b/routers/common/db.go @@ -12,6 +12,8 @@ import ( "code.gitea.io/gitea/models/migrations" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + + "xorm.io/xorm" ) // InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology @@ -24,7 +26,7 @@ func InitDBEngine(ctx context.Context) (err error) { default: } log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries) - if err = db.InitEngineWithMigration(ctx, migrations.Migrate); err == nil { + if err = db.InitEngineWithMigration(ctx, migrateWithSetting); err == nil { break } else if i == setting.Database.DBConnectRetries-1 { return err @@ -36,3 +38,20 @@ func InitDBEngine(ctx context.Context) (err error) { db.HasEngine = true return nil } + +func migrateWithSetting(x *xorm.Engine) error { + if setting.Database.AutoMigration { + return migrations.Migrate(x) + } + + if current, err := migrations.GetCurrentDBVersion(x); err != nil { + return err + } else if current < 0 { + // execute migrations when the database isn't initialized even if AutoMigration is false + return migrations.Migrate(x) + } else if expected := migrations.ExpectedVersion(); current != expected { + log.Fatal(`"database.AUTO_MIGRATION" is disabled, but current database version %d is not equal to the expected version %d.`+ + `You can set "database.AUTO_MIGRATION" to true or migrate manually by running "gitea [--config /path/to/app.ini] migrate"`, current, expected) + } + return nil +}