From 6363c12fca3621ed5b93ae10a9375f748b055680 Mon Sep 17 00:00:00 2001 From: Joseph Boudou Date: Wed, 26 May 2021 15:00:12 +0200 Subject: [PATCH] Reduce DB connections leaks Attempt to fix the MaxConnection test bug. Relates to #68. --- db/database.go | 1 + main/create_test.go | 1 + main/delete.go | 3 ++- main/poll_test.go | 12 ++++++++++++ main/unlogged.go | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/db/database.go b/db/database.go index 7e5c5eb..cf72284 100644 --- a/db/database.go +++ b/db/database.go @@ -179,6 +179,7 @@ func RepeatDeadlocked(ctx context.Context, opts *sql.TxOptions, fct func(tx *sql if !ok || !errors.As(err, &mySqlError) || mySqlError.Number != 1213 { panic(exc) } + log.Println("SQL error 1213. Restarting transaction.") }() fct(tx) diff --git a/main/create_test.go b/main/create_test.go index 6a7a601..dc1d261 100644 --- a/main/create_test.go +++ b/main/create_test.go @@ -140,6 +140,7 @@ func (self *createPollChecker) Check(t *testing.T, response *http.Response, requ // Check Alternatives rows, err := db.DB.Query(qCheckAlternative, pollSegment.Id) + defer rows.Close() mustt(t, err) for id, alt := range query.Alternatives { if !rows.Next() { diff --git a/main/delete.go b/main/delete.go index ee80a85..a0e5153 100644 --- a/main/delete.go +++ b/main/delete.go @@ -57,6 +57,7 @@ func DeleteHandler(ctx context.Context, response server.Response, request *serve ) rows, err := db.DB.QueryContext(ctx, qTitle, segment.Id, request.User.Id) + defer rows.Close() must(err) if !rows.Next() { panic(server.NewHttpError(ImpossibleStatus, ImpossibleMessage, "")) @@ -66,9 +67,9 @@ func DeleteHandler(ctx context.Context, response server.Response, request *serve panic(server.NewHttpError(http.StatusInternalServerError, server.InternalHttpErrorMsg, "Two polls witht the same Id")) } - rows.Close() rows, err = db.DB.QueryContext(ctx, qParticipants, segment.Id) + defer rows.Close() must(err) for rows.Next() { var uid uint32 diff --git a/main/poll_test.go b/main/poll_test.go index 76f636c..5d58de4 100644 --- a/main/poll_test.go +++ b/main/poll_test.go @@ -18,7 +18,9 @@ package main import ( "context" + "fmt" "net/http" + "runtime" "strconv" "testing" @@ -336,7 +338,15 @@ func (self *pollTest) GetName() string { return self.Name } +func stats(ctx string) { + stats := db.DB.Stats() + fmt.Printf("%s -- open %d, use %d, idle %d, goroutines %d\n", ctx, + stats.OpenConnections, stats.InUse, stats.Idle, runtime.NumGoroutine()) +} + func (self *pollTest) Prepare(t *testing.T) { + stats("Before Prepare") + if !self.Sequential { t.Parallel() } @@ -419,6 +429,7 @@ func (self *pollTest) Prepare(t *testing.T) { if checker, ok := self.Checker.(interface { Before(*testing.T) }); ok { checker.Before(t) } + stats("After Prepare") } func (self *pollTest) GetRequest(t *testing.T) *srvt.Request { @@ -450,6 +461,7 @@ func (self *pollTest) Check(t *testing.T, response *http.Response, request *serv } else { t.Errorf("Checker is not an srvt.Checker") } + stats("After Check") } func (self *pollTest) Close() { diff --git a/main/unlogged.go b/main/unlogged.go index c9ca87e..7c34fdf 100644 --- a/main/unlogged.go +++ b/main/unlogged.go @@ -64,6 +64,7 @@ func UnloggedFromHash(ctx context.Context, hash uint32) (user server.User, err e if err != nil { return } + rows.Close() user.Hash = hash user.Logged = false