diff --git a/pkg/drivers/generic/generic.go b/pkg/drivers/generic/generic.go index 367c15fee..d921222f1 100644 --- a/pkg/drivers/generic/generic.go +++ b/pkg/drivers/generic/generic.go @@ -122,16 +122,13 @@ func q(sql, param string, numbered bool) string { } func (d *Generic) Migrate(ctx context.Context) { - var ( - count = 0 - countKV = d.queryRow(ctx, "SELECT COUNT(*) FROM key_value") - countKine = d.queryRow(ctx, "SELECT COUNT(*) FROM kine") - ) + var count int + countKV := d.queryRow(ctx, "SELECT COUNT(*) FROM key_value") if err := countKV.Scan(&count); err != nil || count == 0 { return } - + countKine := d.queryRow(ctx, "SELECT COUNT(*) FROM kine") if err := countKine.Scan(&count); err != nil || count != 0 { return } diff --git a/pkg/drivers/sqlite/sqlite_test.go b/pkg/drivers/sqlite/sqlite_test.go new file mode 100644 index 000000000..7bcf9f5ee --- /dev/null +++ b/pkg/drivers/sqlite/sqlite_test.go @@ -0,0 +1,37 @@ +//go:build cgo +// +build cgo + +package sqlite + +import ( + "context" + "path/filepath" + "sync" + "testing" + "time" + + "github.com/k3s-io/kine/pkg/drivers" + "github.com/k3s-io/kine/pkg/drivers/generic" +) + +func TestMigrateReleasesItsConnections(t *testing.T) { + var wg sync.WaitGroup + _, dialect, err := NewVariant(t.Context(), &wg, "sqlite3", &drivers.Config{ + DataSourceName: filepath.Join(t.TempDir(), "test.db") + "?_journal=WAL&cache=shared&_busy_timeout=30000&_txlock=immediate", + // Use a single connection to catch any connection leaks in Migrate + ConnectionPoolConfig: generic.ConnectionPoolConfig{ + MaxOpen: 1, + MaxIdle: 1, + }, + }) + if err != nil { + t.Fatalf("failed to create dialect: %v", err) + } + t.Cleanup(wg.Wait) + + ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second) + defer cancel() + if _, err := dialect.DB.ExecContext(ctx, `SELECT 1`); err != nil { + t.Fatalf("database unusable after Migrate: %v", err) + } +}