fix concurrency bug

This commit is contained in:
Dawid Wysokiński 2020-06-02 12:09:32 +02:00
parent 9041745d61
commit 1203c574dd
5 changed files with 25 additions and 8 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
.env.development
.env.production
.env
.env
.netrc

View File

@ -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 . .

View File

@ -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()
}

View File

@ -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").

10
main.go
View File

@ -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 {