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.tags/v1.19.0-rc0
;; | ;; | ||||
;; Database maximum number of open connections, default is 0 meaning no maximum | ;; Database maximum number of open connections, default is 0 meaning no maximum | ||||
;MAX_OPEN_CONNS = 0 | ;MAX_OPEN_CONNS = 0 | ||||
;; | |||||
;; Whether execute database models migrations automatically | |||||
;AUTO_MIGRATION = true | |||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
- `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit. | - `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`. | - `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). | - `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 | 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. | relation to port exhaustion. |
) | ) | ||||
func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error { | 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 err := db.InitEngineWithMigration(ctx, migrations.EnsureUpToDate); err != nil { | ||||
if !autofix { | if !autofix { | ||||
logger.Critical("Error: %v during ensure up to date", err) | logger.Critical("Error: %v during ensure up to date", err) |
MaxOpenConns int | MaxOpenConns int | ||||
ConnMaxLifetime time.Duration | ConnMaxLifetime time.Duration | ||||
IterateBufferSize int | IterateBufferSize int | ||||
AutoMigration bool | |||||
}{ | }{ | ||||
Timeout: 500, | Timeout: 500, | ||||
IterateBufferSize: 50, | IterateBufferSize: 50, | ||||
Database.LogSQL = sec.Key("LOG_SQL").MustBool(true) | Database.LogSQL = sec.Key("LOG_SQL").MustBool(true) | ||||
Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10) | Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10) | ||||
Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second) | Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second) | ||||
Database.AutoMigration = sec.Key("AUTO_MIGRATION").MustBool(true) | |||||
} | } | ||||
// DBConnStr returns database connection string | // DBConnStr returns database connection string |
"code.gitea.io/gitea/models/migrations" | "code.gitea.io/gitea/models/migrations" | ||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
"code.gitea.io/gitea/modules/setting" | "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 | // InitDBEngine In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology | ||||
default: | default: | ||||
} | } | ||||
log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries) | 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 | break | ||||
} else if i == setting.Database.DBConnectRetries-1 { | } else if i == setting.Database.DBConnectRetries-1 { | ||||
return err | return err | ||||
db.HasEngine = true | db.HasEngine = true | ||||
return nil | 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 | |||||
} |