Skip to content
This repository has been archived by the owner on Jul 24, 2022. It is now read-only.

Commit

Permalink
Merge pull request #17 from chibiegg/math/ranking-cache
Browse files Browse the repository at this point in the history
use cache on ranking
  • Loading branch information
chibiegg committed Jul 23, 2022
2 parents 63af1eb + d93739d commit a4ef67e
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions webapp/go/isuports.go
Original file line number Diff line number Diff line change
Expand Up @@ -1377,23 +1377,41 @@ func competitionRankingHandler(c echo.Context) error {
}
}

// player_scoreを読んでいるときに更新が走ると不整合が起こるのでロックを取得する (トランザクションにする)
tx := tenantDB.MustBegin()

pagedRanks := []CompetitionRank{}
if err := tx.SelectContext(
ctx,
&pagedRanks,
"SELECT p.display_name AS display_name, ps.player_id AS player_id, ps.score AS score, ps.rank as `rank` FROM player_score as ps, player as p WHERE ps.tenant_id = ? AND ps.competition_id = ? AND ? < ps.rank AND ps.rank <= ? AND ps.player_id = p.id ORDER BY ps.rank ASC",
tenant.ID,
competitionID,
rankAfter,
rankAfter+100,
); err != nil {
tx.Rollback()
return fmt.Errorf("error Select player_score: tenantID=%d, competitionID=%s, %w", tenant.ID, competitionID, err)

playerScoreCacheMapMutex.RLock()
playerScoreCache, ok := playerScoreCacheMap[competitionID]
playerScoreCacheMapMutex.RUnlock()

if ok {
playerCacheMapMutex.RLock()
for i := int(rankAfter); i < int(rankAfter)+100; i++ {
if i < len(playerScoreCache) {
rank := CompetitionRank{
Rank: playerScoreCache[i].Rank,
Score: playerScoreCache[i].Score,
PlayerID: playerScoreCache[i].PlayerID,
PlayerDisplayName: playerCacheMap[playerScoreCache[i].PlayerID].DisplayName,
}
pagedRanks = append(pagedRanks, rank)
} else {
break
}
}
playerCacheMapMutex.RUnlock()
} else {
if err := tenantDB.SelectContext(
ctx,
&pagedRanks,
"SELECT p.display_name AS display_name, ps.player_id AS player_id, ps.score AS score, ps.rank as `rank` FROM player_score as ps, player as p WHERE ps.tenant_id = ? AND ps.competition_id = ? AND ? < ps.rank AND ps.rank <= ? AND ps.player_id = p.id ORDER BY ps.rank ASC",
tenant.ID,
competitionID,
rankAfter,
rankAfter+100,
); err != nil {
return fmt.Errorf("error Select player_score: tenantID=%d, competitionID=%s, %w", tenant.ID, competitionID, err)
}
}
tx.Commit()

res := SuccessResult{
Status: true,
Expand Down

0 comments on commit a4ef67e

Please sign in to comment.