From f42393f7af584a52cc9ba9adffb34443ae732fc3 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 22 Apr 2021 13:48:24 +0800 Subject: [PATCH] core: fix limit_rate --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/model/opcount.ts | 10 +++++++--- packages/hydrooj/src/service/server.ts | 3 +-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index c0e6bd27b..05e5c9263 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.23.19", + "version": "2.23.20", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/opcount.ts b/packages/hydrooj/src/model/opcount.ts index f7745f75d..3203b53e0 100644 --- a/packages/hydrooj/src/model/opcount.ts +++ b/packages/hydrooj/src/model/opcount.ts @@ -10,18 +10,22 @@ export async function inc(op: string, ident: string, periodSecs: number, maxOper const expireAt = new Date(beginAt.getTime() + periodSecs * 1000); try { await coll.findOneAndUpdate({ + op, ident, beginAt, expireAt, - op: { $lt: maxOperations }, - }, { $inc: { op: 1 } }, { upsert: true }); + opcount: { $lt: maxOperations }, + }, { $inc: { opcount: 1 } }, { upsert: true }); } catch (e) { throw new OpcountExceededError(op, periodSecs, maxOperations); } } function ensureIndexes() { - return coll.createIndex('expireAt', { expireAfterSeconds: 0 }); + return Promise.all([ + coll.createIndex('expireAt', { expireAfterSeconds: 0 }), + coll.createIndex({ op: 1, ident: 1 }, { unique: true }), + ]); } bus.once('app/started', ensureIndexes); diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index ef0866c6d..5c3c33ba5 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -296,7 +296,6 @@ export class HandlerCommon { async limitRate(op: string, periodSecs: number, maxOperations: number) { if (this.user && this.user.hasPriv(PRIV.PRIV_UNLIMITED_ACCESS)) return; - logger.info(op, periodSecs, maxOperations, this.request.ip); await opcount.inc(op, this.request.ip, periodSecs, maxOperations); } @@ -484,7 +483,7 @@ export class Handler extends HandlerCommon { } async init({ domainId }) { - if (!argv.benchmark) await this.limitRate('global', 10, 88); + if (!argv.benchmark) await this.limitRate('global', 10, 1); const [absoluteDomain, inferDomain] = await Promise.all([ domain.get(domainId), domain.getByHost(this.request.host),