Skip to content

Add setting SQLITE_JOURNAL_MODE to enable WAL #20535

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jul 30, 2022
Prev Previous commit
Next Next commit
Revert "remove the setting, there are enough already"
This reverts commit 1f744f9.
  • Loading branch information
noerw committed Jul 30, 2022
commit 195a2e98eac47d9651aff229a4931a77b4208911
1 change: 1 addition & 0 deletions custom/conf/app.example.ini
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ USER = root
;DB_TYPE = sqlite3
;PATH= ; defaults to data/gitea.db
;SQLITE_TIMEOUT = ; Query timeout defaults to: 500
;SQLITE_JOURNAL_MODE = ; defaults to DELETE, can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
Expand Down
1 change: 1 addition & 0 deletions docs/content/doc/advanced/config-cheat-sheet.en-us.md
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
- `verify-ca`: Enable TLS with verification of the database server certificate against its root certificate.
- `verify-full`: Enable TLS and verify the database server name matches the given certificate in either the `Common Name` or `Subject Alternative Name` fields.
- `SQLITE_TIMEOUT`: **500**: Query timeout for SQLite3 only.
- `SQLITE_JOURNAL_MODE`: on windows & linux: **WAL**, otherwise **DELETE**: Change journal mode for SQlite3. See [SQlite3 docs](https://www.sqlite.org/pragma.html#pragma_journal_mode) for possible values.
- `ITERATE_BUFFER_SIZE`: **50**: Internal buffer size for iterating.
- `CHARSET`: **utf8mb4**: For MySQL only, either "utf8" or "utf8mb4". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this.
- `PATH`: **data/gitea.db**: For SQLite3 only, the database file path.
Expand Down
26 changes: 16 additions & 10 deletions modules/setting/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ var (
LogSQL bool
Charset string
Timeout int // seconds
SQliteJournalMode string
UseSQLite3 bool
UseMySQL bool
UseMSSQL bool
Expand Down Expand Up @@ -89,10 +90,24 @@ func InitDBConfig() {
if Database.UseMySQL && defaultCharset != "utf8mb4" {
log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
}

if Database.UseSQLite3 {
Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db"))
Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)

// WAL mode is preferred for better concurent write performance, but needs special VFS driver features,
// which are guaranteed to be available for unix & windows OSes
var defaultJournalMode string
switch runtime.GOOS {
// probably the BSDs are supported too, but i found no information on this - better safe than sorry.
case "windows", "linux": // "darwin", "freebsd", "openbsd", "netbsd":
defaultJournalMode = "WAL"
default:
defaultJournalMode = "DELETE"
}
Database.SQliteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString(defaultJournalMode)
}

Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2)
if Database.UseMySQL {
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(3 * time.Second)
Expand Down Expand Up @@ -138,17 +153,8 @@ func DBConnStr() (string, error) {
if err := os.MkdirAll(path.Dir(Database.Path), os.ModePerm); err != nil {
return "", fmt.Errorf("Failed to create directories: %v", err)
}

// WAL mode is preferred for better concurent write performance, but needs special VFS driver features,
// which are guaranteed to be available for unix & windows OSes: https://www.sqlite.org/wal.html
journalMode := "DELETE"
switch runtime.GOOS {
// probably the BSDs are supported too, but i found no information on this - better safe than sorry.
case "windows", "linux": // "darwin", "freebsd", "openbsd", "netbsd":
journalMode = "WAL"
}
connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d&_txlock=immediate&_journal_mode=%s",
Database.Path, Database.Timeout, journalMode)
Database.Path, Database.Timeout, Database.SQliteJournalMode)
default:
return "", fmt.Errorf("Unknown database type: %s", Database.Type)
}
Expand Down