68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package store
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// DurabilityRefusal 判断 PostgreSQL 耐久参数。off 或缺失即拒绝。
|
|
// synchronous_commit=local 不是 off,不拒绝。
|
|
func DurabilityRefusal(settings map[string]string) error {
|
|
for _, key := range []string{"fsync", "full_page_writes", "synchronous_commit"} {
|
|
value, ok := settings[key]
|
|
if !ok || strings.EqualFold(strings.TrimSpace(value), "off") {
|
|
return fmt.Errorf("durability: %s=%q", key, value)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Store) verifyDurability() error {
|
|
switch s.dialect.name() {
|
|
case "sqlite":
|
|
return s.verifySQLiteDurability()
|
|
case "postgres":
|
|
return s.verifyPostgresDurability()
|
|
default:
|
|
return fmt.Errorf("durability: unknown dialect %s", s.dialect.name())
|
|
}
|
|
}
|
|
|
|
func (s *Store) verifySQLiteDurability() error {
|
|
var journal string
|
|
if err := s.db.QueryRow(`PRAGMA journal_mode`).Scan(&journal); err != nil {
|
|
return fmt.Errorf("durability: journal_mode: %w", err)
|
|
}
|
|
var syncLevel int64
|
|
if err := s.db.QueryRow(`PRAGMA synchronous`).Scan(&syncLevel); err != nil {
|
|
return fmt.Errorf("durability: synchronous: %w", err)
|
|
}
|
|
if !strings.EqualFold(journal, "wal") || syncLevel != 2 {
|
|
return fmt.Errorf("durability: journal_mode=%s synchronous=%d", journal, syncLevel)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Store) verifyPostgresDurability() error {
|
|
rows, err := s.db.Query(`SELECT name, setting FROM pg_settings WHERE name IN ('fsync','full_page_writes','synchronous_commit')`)
|
|
if err != nil {
|
|
return fmt.Errorf("durability: pg_settings: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
got := map[string]string{}
|
|
for rows.Next() {
|
|
var name, setting string
|
|
if err := rows.Scan(&name, &setting); err != nil {
|
|
return err
|
|
}
|
|
got[name] = setting
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return err
|
|
}
|
|
if err := DurabilityRefusal(got); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|