mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-09-30 12:01:59 +00:00
Implements the fixes from audit/pkg/dbmanager.audit.md. - Stop closing the shared *sql.DB to recover from errors. Adapter factories and the health checker no longer call Reconnect; Reconnect is atomic and operator-only. - Postgres uses a custom driver.Connector: Reconnect retires pooled connections by generation without closing the pool, so held Bun/GORM handles keep working. Verified against a live server restart. - Add TCP keepalive, TCP_USER_TIMEOUT, a bounded reuse ping and statement_timeout as a runtime parameter; drop the 2 min timeout floor. - Health check pings without holding the connection lock. - Listener: single goroutine pair, bounded Close without UNLISTEN, and serialised use of the pgx connection (fixes conn busy and a close race). - Fix Connect/Close/Connect/Close panic, idempotent Connect, dial outside the manager lock, clean up on partial failure. - SQLite: pin :memory: to one connection, pragmas via DSN. - Escape credentials in Postgres/MSSQL/Mongo DSNs; sslmode defaults to prefer. Wire retry settings, publish metrics, fix logger calls. - NewConnectionFromDB: Close is a no-op with a warning (caller owns the pool); Reconnect only pings. - Document correct usage in the README; mark the audit with what was done. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
35 lines
764 B
Go
35 lines
764 B
Go
package providers
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
func TestConnectorGenerationInvalidatesConns(t *testing.T) {
|
|
cfg, err := pgx.ParseConfig("postgres://u:p@127.0.0.1:1/db")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
c := newPGConnector(cfg)
|
|
conn := &pgConn{owner: c, gen: c.generation.Load()}
|
|
if conn.stale() {
|
|
t.Fatal("fresh connection reported stale")
|
|
}
|
|
c.swap(cfg)
|
|
if !conn.stale() {
|
|
t.Fatal("connection from an older generation must be stale")
|
|
}
|
|
if err := conn.ResetSession(t.Context()); err != driver.ErrBadConn {
|
|
t.Fatalf("ResetSession on stale conn = %v, want ErrBadConn", err)
|
|
}
|
|
}
|
|
|
|
func TestDialFuncHasTimeout(t *testing.T) {
|
|
if newDialFunc(2*time.Second) == nil {
|
|
t.Fatal("nil dial func")
|
|
}
|
|
}
|