removed locks, switching to WAL for SQLite default

This commit is contained in:
2021-10-25 02:12:12 +02:00
parent c30da099ed
commit efd0f9a6af
6 changed files with 46 additions and 143 deletions

View File

@@ -22,7 +22,6 @@ import (
"sort"
"strconv"
"strings"
"sync"
"time"
)
@@ -60,11 +59,6 @@ type Conf struct {
}
}
type DBWithLock struct {
Client *ent.Client
Lock *sync.RWMutex
}
type CommunityXML struct {
SteamID64 uint64 `xml:"steamID64"`
AvatarURL string `xml:"avatarFull"`
@@ -221,8 +215,8 @@ func SendJSON(data interface{}, w http.ResponseWriter) error {
return nil
}
func GetMatchStats(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, error) {
wins, loss, ties, err := getWinLossTieFromPlayer(dbPlayer, lock)
func GetMatchStats(dbPlayer *ent.Player) (int, int, int, error) {
wins, loss, ties, err := getWinLossTieFromPlayer(dbPlayer)
if err != nil {
return 0, 0, 0, err
}
@@ -230,20 +224,16 @@ func GetMatchStats(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, err
return wins, ties, loss, nil
}
func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse, error) {
func GetMetaStats(dbPlayer *ent.Player) (*MetaStatsResponse, error) {
mResponse := new(MetaStatsResponse)
mResponse.Player = &PlayerResponse{SteamID64: dbPlayer.ID}
lock.RLock()
tPlayers, err := dbPlayer.QueryMatches().QueryPlayers().Select(player.FieldID).All(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
lock.RLock()
matchIDs, err := dbPlayer.QueryMatches().IDs(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
@@ -266,14 +256,12 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
SteamID64: s.ID,
}
lock.RLock()
pMatches, err := s.QueryMatches().
Select(match.FieldID, match.FieldMatchResult, match.FieldMap).
Where(match.IDIn(matchIDs...)).
WithStats().
Where(match.HasStatsWith(stats.Or(stats.PlayerStats(dbPlayer.ID), stats.PlayerStats(s.ID)))).
All(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
@@ -307,10 +295,8 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
}
}
lock.RLock()
wSs, err := subjectStats.QueryWeaponStats().
Select(weaponstats.FieldEqType, weaponstats.FieldDmg).All(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
@@ -396,13 +382,12 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
return mResponse, nil
}
func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, error) {
func getWinLossTieFromPlayer(dbPlayer *ent.Player) (int, int, int, error) {
var res []struct {
MatchResult int `json:"match_result"`
Count int `json:"count"`
}
lock.RLock()
err := dbPlayer.QueryMatches().GroupBy(match.FieldMatchResult).Aggregate(func(s *sql.Selector) string {
sT := sql.Table(stats.Table)
@@ -416,16 +401,13 @@ func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int
))
return sql.Count("*")
}).Scan(context.Background(), &res)
lock.RUnlock()
if err != nil {
return 0, 0, 0, err
}
lock.RLock()
total, err := dbPlayer.QueryMatches().Modify(func(s *sql.Selector) {
s.Select("COUNT(*)")
}).Int(context.Background())
lock.RUnlock()
if err != nil {
return 0, 0, 0, err
}
@@ -447,13 +429,11 @@ func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int
return wins, total - wins - ties, ties, nil
}
func IsAuthCodeValid(player *ent.Player, lock *sync.RWMutex, apiKey string, shareCode string, authCode string, rl ratelimit.Limiter) (bool, error) {
func IsAuthCodeValid(player *ent.Player, apiKey string, shareCode string, authCode string, rl ratelimit.Limiter) (bool, error) {
var tMatch *ent.Match
var err error
if shareCode == "" {
lock.RLock()
tMatch, err = player.QueryMatches().Order(ent.Asc(match.FieldDate)).First(context.Background())
lock.RUnlock()
if err != nil {
return false, err
}
@@ -472,17 +452,13 @@ func IsAuthCodeValid(player *ent.Player, lock *sync.RWMutex, apiKey string, shar
}
}
func GetNewShareCodesForPlayer(player *ent.Player, lock *sync.RWMutex, apiKey string, rl ratelimit.Limiter) ([]string, error) {
lock.RLock()
func GetNewShareCodesForPlayer(player *ent.Player, apiKey string, rl ratelimit.Limiter) ([]string, error) {
latestMatch, err := player.QueryMatches().Order(ent.Desc(match.FieldDate)).First(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
lock.RLock()
oldestMatch, err := player.QueryMatches().Order(ent.Asc(match.FieldDate)).First(context.Background())
lock.RUnlock()
if err != nil {
return nil, err
}
@@ -506,9 +482,7 @@ func GetNewShareCodesForPlayer(player *ent.Player, lock *sync.RWMutex, apiKey st
}
}
lock.Lock()
err = player.Update().SetSharecodeUpdated(time.Now().UTC()).SetOldestSharecodeSeen(oldestMatch.ShareCode).Exec(context.Background())
lock.Unlock()
if err != nil {
return nil, err
}
@@ -562,7 +536,7 @@ func getNextShareCode(lastCode string, apiKey string, authCode string, steamId u
return rJson.Result.Code, nil
}
func GetPlayer(db *DBWithLock, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
func GetPlayer(db *ent.Client, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
switch e := id.(type) {
case uint64:
return GetPlayerFromSteamID64(db, e, apiKey, rl)
@@ -582,14 +556,12 @@ func GetPlayer(db *DBWithLock, id interface{}, apiKey string, rl ratelimit.Limit
}
}
func GetPlayerFromVanityURL(db *DBWithLock, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
func GetPlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
if id == "" {
return nil, fmt.Errorf("invalid arguments")
}
db.Lock.RLock()
tPlayer, err := db.Client.Player.Query().Where(player.VanityURL(strings.ToLower(id))).Only(context.Background())
db.Lock.RUnlock()
tPlayer, err := db.Player.Query().Where(player.VanityURL(strings.ToLower(id))).Only(context.Background())
if err == nil {
return tPlayer, nil
} else {
@@ -614,21 +586,17 @@ func GetPlayerFromVanityURL(db *DBWithLock, id string, apiKey string, rl ratelim
}
}
func GetPlayerFromSteamID64(db *DBWithLock, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
db.Lock.RLock()
tPlayer, err := db.Client.Player.Get(context.Background(), steamID)
db.Lock.RUnlock()
func GetPlayerFromSteamID64(db *ent.Client, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
tPlayer, err := db.Player.Get(context.Background(), steamID)
if err == nil {
return tPlayer, nil
} else {
db.Lock.Lock()
nPlayer, err := db.Client.Player.Create().SetID(steamID).Save(context.Background())
db.Lock.Unlock()
nPlayer, err := db.Player.Create().SetID(steamID).Save(context.Background())
if err != nil {
return nil, err
}
uPlayer, err := UpdatePlayerFromSteam([]*ent.Player{nPlayer}, db.Client, apiKey, db.Lock, rl)
uPlayer, err := UpdatePlayerFromSteam([]*ent.Player{nPlayer}, db, apiKey, rl)
if err != nil {
return nil, err
}
@@ -641,7 +609,7 @@ func GetPlayerFromSteamID64(db *DBWithLock, steamID uint64, apiKey string, rl ra
}
}
func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, lock *sync.RWMutex, rl ratelimit.Limiter) ([]*ent.Player, error) {
func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, rl ratelimit.Limiter) ([]*ent.Player, error) {
var idsToUpdate []uint64
for _, updatePlayer := range players {
@@ -667,7 +635,6 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
pS.ProfileURL = path.Base(pS.ProfileURL)
}
lock.Lock()
tPlayer, err := db.Player.UpdateOneID(pS.SteamID).
SetName(pS.PersonaName).
SetAvatar(pS.AvatarHash).
@@ -677,7 +644,6 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
SetSteamUpdated(time.Now().UTC()).
SetProfileCreated(time.Unix(pS.TimeCreated, 0).UTC()).
Save(context.Background())
lock.Unlock()
if err != nil {
return nil, err
}
@@ -696,9 +662,7 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
if ban.NumberOfVACBans > 0 {
banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan))
lock.Lock()
err := db.Player.UpdateOneID(ban.SteamID).SetVacCount(int(ban.NumberOfVACBans)).SetVacDate(banDate).Exec(context.Background())
lock.Unlock()
if err != nil {
return nil, err
}
@@ -706,9 +670,7 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
if ban.NumberOfGameBans > 0 {
banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan))
lock.Lock()
err := db.Player.UpdateOneID(ban.SteamID).SetGameBanCount(int(ban.NumberOfGameBans)).SetGameBanDate(banDate).Exec(context.Background())
lock.Unlock()
if err != nil {
return nil, err
}