From 1203c574dd96c17c67c8f6e37ba43dfd1b421703 Mon Sep 17 00:00:00 2001 From: Kichiyaki Date: Tue, 2 Jun 2020 12:09:32 +0200 Subject: [PATCH] fix concurrency bug --- .gitignore | 3 ++- Dockerfile | 5 +++++ cron/handler.go | 13 ++++++++++--- cron/server_handler.go | 2 ++ main.go | 10 ++++++---- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index d44addc..78ff441 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env.development .env.production -.env \ No newline at end of file +.env +.netrc \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 5b9aa28..bbfb974 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,11 @@ FROM golang:alpine +RUN apk add git ENV MODE=production +ENV GOPRIVATE=github.com/tribalwarshelp + +COPY ./.netrc /root/.netrc +RUN chmod 600 /root/.netrc WORKDIR /go/src/app COPY . . diff --git a/cron/handler.go b/cron/handler.go index 567100e..34214c8 100644 --- a/cron/handler.go +++ b/cron/handler.go @@ -45,6 +45,8 @@ func (h *handler) init() error { if err != nil { return err } + defer tx.Close() + models := []interface{}{ (*models.LangVersion)(nil), (*models.Server)(nil), @@ -67,6 +69,7 @@ func (h *handler) createSchema(key string) error { if err != nil { return err } + defer tx.Close() if _, err := tx.Exec(fmt.Sprintf("CREATE SCHEMA IF NOT EXISTS %s", key)); err != nil { return err @@ -158,9 +161,11 @@ func (h *handler) updateData() { log.Println(err.Error()) return } + var wg sync.WaitGroup max := runtime.NumCPU() * 5 count := 0 + for _, server := range servers { url, ok := urls[server.Key] if !ok { @@ -176,15 +181,17 @@ func (h *handler) updateData() { baseURL: url, } count++ + wg.Add(1) go func(server *models.Server, sh *serverHandler) { - wg.Add(1) + defer wg.Done() + log.Printf("%s: Updating", server.Key) if err := sh.updateData(); err != nil { log.Println(errors.Wrap(err, server.Key)) } else { - log.Printf("%s updated", server.Key) + log.Printf("%s: updated", server.Key) } - wg.Done() }(server, sh) } + wg.Wait() } diff --git a/cron/server_handler.go b/cron/server_handler.go index 26b23fa..68b758c 100644 --- a/cron/server_handler.go +++ b/cron/server_handler.go @@ -311,6 +311,8 @@ func (h *serverHandler) updateData() error { if err != nil { return err } + defer tx.Close() + if len(tribes) > 0 { if _, err := tx.Model(&tribes). OnConflict("(id) DO UPDATE"). diff --git a/main.go b/main.go index 2d0dd52..b0f935e 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "os" "os/signal" "syscall" + "time" "github.com/tribalwarshelp/shared/mode" @@ -25,10 +26,11 @@ func init() { func main() { db := pg.Connect(&pg.Options{ - User: os.Getenv("DB_USER"), - Password: os.Getenv("DB_PASSWORD"), - Database: os.Getenv("DB_NAME"), - Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"), + User: os.Getenv("DB_USER"), + Password: os.Getenv("DB_PASSWORD"), + Database: os.Getenv("DB_NAME"), + Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"), + PoolTimeout: 1 * time.Minute, }) defer func() { if err := db.Close(); err != nil {