Leaderboard update flag (#2676)

* blocking leaderboard get requests if lb is updating

* locking lb while its updating

* brackets
This commit is contained in:
Jack 2022-03-10 21:34:20 +01:00 committed by GitHub
parent 6b12ba3900
commit 9e41df2158
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 2 deletions

View file

@ -17,7 +17,15 @@ class LeaderboardsController {
queryLimit
);
const normalizedLeaderboard = _.map(leaderboard, (entry) => {
if (leaderboard === false) {
return new MonkeyResponse(
"Leaderboard is currently updating. Please try again in a few seconds.",
null,
503
);
}
const normalizedLeaderboard = _.map(leaderboard as any[], (entry) => {
return uid && entry.uid === uid
? entry
: _.omit(entry, ["discordId", "uid", "difficulty", "language"]);

View file

@ -2,8 +2,11 @@ import db from "../init/db";
import Logger from "../utils/logger";
import { performance } from "perf_hooks";
const leaderboardUpdating = {};
class LeaderboardsDAO {
static async get(mode, mode2, language, skip, limit = 50) {
if (leaderboardUpdating[`${language}_${mode}_${mode2}`]) return false;
if (limit > 50 || limit <= 0) limit = 50;
if (skip < 0) skip = 0;
const preset = await db
@ -83,6 +86,7 @@ class LeaderboardsDAO {
});
let end2 = performance.now();
let start3 = performance.now();
leaderboardUpdating[`${language}_${mode}_${mode2}`] = true;
try {
await db.collection(`leaderboards.${language}.${mode}.${mode2}`).drop();
} catch (e) {}
@ -103,6 +107,7 @@ class LeaderboardsDAO {
.createIndex({
rank: 1,
});
leaderboardUpdating[`${language}_${mode}_${mode2}`] = false;
let end4 = performance.now();
let timeToRunAggregate = (end1 - start1) / 1000;

View file

@ -8,7 +8,13 @@ const RECENT_AGE_MINUTES = 10;
const RECENT_AGE_MILLISECONDS = RECENT_AGE_MINUTES * 60 * 1000;
async function getTop10(leaderboardTime: string): Promise<WithId<Document>[]> {
return await LeaderboardsDAO.get("time", leaderboardTime, "english", 0, 10);
return (await LeaderboardsDAO.get(
"time",
leaderboardTime,
"english",
0,
10
)) as any[];
}
async function updateLeaderboardAndNotifyChanges(