From c32e8e4c9746d0ada9f57f9a08e35e7ba382f868 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Sat, 24 Oct 2026 07:08:45 +0000 Subject: [PATCH] db: return database-open errors for 0.29.6 Backport #3496. --- hscontrol/db/db.go | 17 +++++++++++--- hscontrol/db/db_test.go | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/hscontrol/db/db.go b/hscontrol/db/db.go index a7fb0a159..824afb440 100644 --- a/hscontrol/db/db.go +++ b/hscontrol/db/db.go @@ -968,16 +968,23 @@ func openDB(cfg types.DatabaseConfig) (*gorm.DB, error) { Logger: dbLogger, }, ) + if err != nil { + return nil, err + } // The pure Go SQLite library does not handle locking in // the same way as the C based one and we can't use the gorm // connection pool as of 2022/02/23. - sqlDB, _ := db.DB() + sqlDB, err := db.DB() + if err != nil { + return nil, err + } + sqlDB.SetMaxIdleConns(1) sqlDB.SetMaxOpenConns(1) sqlDB.SetConnMaxIdleTime(time.Hour) - return db, err + return db, nil case types.DatabasePostgres: dbString := fmt.Sprintf( @@ -1015,7 +1022,11 @@ func openDB(cfg types.DatabaseConfig) (*gorm.DB, error) { return nil, err } - sqlDB, _ := db.DB() + sqlDB, err := db.DB() + if err != nil { + return nil, err + } + sqlDB.SetMaxIdleConns(cfg.Postgres.MaxIdleConnections) sqlDB.SetMaxOpenConns(cfg.Postgres.MaxOpenConnections) sqlDB.SetConnMaxIdleTime( diff --git a/hscontrol/db/db_test.go b/hscontrol/db/db_test.go index 092a44a71..2a3297dc9 100644 --- a/hscontrol/db/db_test.go +++ b/hscontrol/db/db_test.go @@ -646,3 +646,54 @@ func TestSQLiteAllTestdataMigrations(t *testing.T) { }) } } + +func TestOpenDBReturnsOpenError(t *testing.T) { + tests := []struct { + name string + cfg func(t *testing.T) types.DatabaseConfig + }{ + { + name: "sqlite-path-is-a-directory", + cfg: func(t *testing.T) types.DatabaseConfig { + t.Helper() + + return types.DatabaseConfig{ + Type: types.DatabaseSqlite, + Sqlite: types.SqliteConfig{Path: t.TempDir()}, + } + }, + }, + { + name: "postgres-unreachable-host", + cfg: func(t *testing.T) types.DatabaseConfig { + t.Helper() + + return types.DatabaseConfig{ + Type: types.DatabasePostgres, + Postgres: types.PostgresConfig{ + Host: "127.0.0.1", + Port: 1, + Name: "headscale", + User: "headscale", + Ssl: "false", + }, + } + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var ( + db *gorm.DB + err error + ) + + require.NotPanics(t, func() { + db, err = openDB(tt.cfg(t)) + }) + require.Error(t, err) + assert.Nil(t, db) + }) + } +}