map_usecase.GetMarkers should load villages in separate goroutines

This commit is contained in:
Dawid Wysokiński 2020-07-31 20:49:00 +02:00
parent 68848a783c
commit e97fb53bcf
3 changed files with 87 additions and 57 deletions

1
go.mod
View File

@ -18,6 +18,7 @@ require (
github.com/tribalwarshelp/map-generator v0.0.0-20200623143352-cc037d744be2 github.com/tribalwarshelp/map-generator v0.0.0-20200623143352-cc037d744be2
github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd
github.com/vektah/gqlparser/v2 v2.0.1 github.com/vektah/gqlparser/v2 v2.0.1
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect
google.golang.org/protobuf v1.25.0 // indirect google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect

3
go.sum
View File

@ -264,7 +264,10 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

View File

@ -5,12 +5,14 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
"sync"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/tribalwarshelp/api/servermap" "github.com/tribalwarshelp/api/servermap"
"github.com/tribalwarshelp/api/village" "github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/map-generator/generator" "github.com/tribalwarshelp/map-generator/generator"
"github.com/tribalwarshelp/shared/models" "github.com/tribalwarshelp/shared/models"
"golang.org/x/sync/errgroup"
) )
const ( const (
@ -27,6 +29,9 @@ func New(villageRepo village.Repository) servermap.Usecase {
} }
func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersConfig) ([]*generator.Marker, error) { func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersConfig) ([]*generator.Marker, error) {
var mutex sync.Mutex
g := new(errgroup.Group)
tribes := make(map[string][]int) tribes := make(map[string][]int)
tribeIDs := []int{} tribeIDs := []int{}
cache := make(map[int]bool) cache := make(map[int]bool)
@ -64,6 +69,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
markers := []*generator.Marker{} markers := []*generator.Marker{}
if cfg.ShowOtherPlayerVillages { if cfg.ShowOtherPlayerVillages {
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server, Server: cfg.Server,
Filter: &models.VillageFilter{ Filter: &models.VillageFilter{
@ -77,15 +83,20 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
Count: false, Count: false,
}) })
if err != nil { if err != nil {
return nil, err return err
} }
mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: defaultPlayerVillagesColor, Color: defaultPlayerVillagesColor,
}) })
mutex.Unlock()
return nil
})
} }
if cfg.ShowBarbarianVillages { if cfg.ShowBarbarianVillages {
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server, Server: cfg.Server,
Filter: &models.VillageFilter{ Filter: &models.VillageFilter{
@ -94,15 +105,20 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
Count: false, Count: false,
}) })
if err != nil { if err != nil {
return nil, err return err
} }
mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: defaultBarbarianVillagesColor, Color: defaultBarbarianVillagesColor,
}) })
mutex.Unlock()
return nil
})
} }
for color, tribeIDs := range tribes { for color, tribeIDs := range tribes {
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server, Server: cfg.Server,
Filter: &models.VillageFilter{ Filter: &models.VillageFilter{
@ -113,15 +129,20 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
Count: false, Count: false,
}) })
if err != nil { if err != nil {
return nil, err return err
} }
mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: color, Color: color,
}) })
mutex.Unlock()
return nil
})
} }
for color, playerIDs := range players { for color, playerIDs := range players {
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server, Server: cfg.Server,
Filter: &models.VillageFilter{ Filter: &models.VillageFilter{
@ -130,15 +151,20 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
Count: false, Count: false,
}) })
if err != nil { if err != nil {
return nil, err return err
} }
mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: color, Color: color,
}) })
mutex.Unlock()
return nil
})
} }
return markers, nil err := g.Wait()
return markers, err
} }
func parseQueryParam(str string) (int, string, error) { func parseQueryParam(str string) (int, string, error) {