diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 9c2188a2c..9212b25dd 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.5.10", + "version": "2.5.11", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 177b32265..960cc115d 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -244,7 +244,7 @@ export default class Hydro { this.ws.send(this.config.cookie); global.onDestory.push(() => this.ws.close()); setInterval(() => { - this.ws.send('{"event":"ping"}'); + this.ws.send(`{"key":"prio","prio":${this.config.minPriority || -50}}`); }, 30000); }); this.ws.on('message', (data) => { diff --git a/packages/hydrojudge/src/judge/interactive.ts b/packages/hydrojudge/src/judge/interactive.ts index ffc9d9382..75d182efd 100644 --- a/packages/hydrojudge/src/judge/interactive.ts +++ b/packages/hydrojudge/src/judge/interactive.ts @@ -1,5 +1,6 @@ import Queue from 'p-queue'; import fs from 'fs-extra'; +import { argv } from 'yargs'; import * as STATUS from '../status'; import { parse } from '../testlib'; import { findFileSync, parseFilename } from '../utils'; diff --git a/packages/hydrojudge/src/service.ts b/packages/hydrojudge/src/service.ts index fa8b896ab..11c9e77c0 100644 --- a/packages/hydrojudge/src/service.ts +++ b/packages/hydrojudge/src/service.ts @@ -243,6 +243,7 @@ async function postInit() { } task.consume({ type: 'judge' }, (t) => (new JudgeTask(t)).handle().catch(logger.error)); + task.consume({ type: 'judge', priority: { $gt: -50 } }, (t) => (new JudgeTask(t)).handle().catch(logger.error)); } global.Hydro.service.bus.once('app/started', postInit); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 3e2788d1c..c0e6bd27b 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.23.18", + "version": "2.23.19", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index 7e94cf158..dbe5c4525 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -118,6 +118,7 @@ export class JudgeFilesDownloadHandler extends Handler { class JudgeConnectionHandler extends ConnectionHandler { processing: any = null; closed = false; + query: any = { type: 'judge' }; async prepare() { logger.info('Judge daemon connected from ', this.request.ip); @@ -132,7 +133,7 @@ class JudgeConnectionHandler extends ConnectionHandler { await sleep(100); if (this.closed) return; // eslint-disable-next-line no-await-in-loop - t = await task.getFirst({ type: 'judge' }); + t = await task.getFirst(this.query); } this.send({ task: t }); this.processing = t; @@ -150,6 +151,8 @@ class JudgeConnectionHandler extends ConnectionHandler { await this.newTask(); } else if (msg.key === 'status') { await updateJudge(msg.info); + } else if (msg.key === 'prio') { + this.query.priority = { $gt: msg.prio }; } } diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 9a979cdda..02fc76257 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -211,7 +211,7 @@ export class ProblemDetailHandler extends ProblemHandler { // TODO maybe async? await record.getMulti(domainId, { pid }).forEach(async (doc) => { await record.reset(domainId, doc._id, true); - await record.judge(domainId, doc._id, -1); + await record.judge(domainId, doc._id, -50); }); this.back(); } diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 9434fda8d..caa931288 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -16,11 +16,11 @@ import db from '../service/db'; class RecordModel { static coll: Collection = db.collection('record'); - static async submissionPriority(uid: number) { + static async submissionPriority(uid: number, base: number = 0) { const pending = await task.count({ uid }); const timeRecent = await RecordModel.coll .find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, uid }).project({ time: 1 }).toArray(); - return -(pending * (sum(timeRecent.map((i) => i.time || 0)) / 100000)); + return base - ((pending + 0.5) * (sum(timeRecent.map((i) => i.time || 0)) / 10000)); } static async get(domainId: string, _id: ObjectID): Promise { @@ -45,7 +45,7 @@ class RecordModel { }; } - static async judge(domainId: string, rid: ObjectID, priority = 1, config: ProblemConfig = {}) { + static async judge(domainId: string, rid: ObjectID, priority = 0, config: ProblemConfig = {}) { const rdoc = await RecordModel.get(domainId, rid); let data = []; if (rdoc.pid) { @@ -87,15 +87,19 @@ class RecordModel { judgeAt: null, rejudged: false, }; + let isContest = false; if (typeof contestOrConfig === 'string') { // is Run data.input = contestOrConfig; data.hidden = true; - } else data.contest = contestOrConfig; + } else { + data.contest = contestOrConfig; + isContest = true; + } const res = await RecordModel.coll.insertOne(data); if (addTask) { - const priority = await RecordModel.submissionPriority(uid); - await RecordModel.judge(domainId, res.insertedId, 1 + priority); + const priority = await RecordModel.submissionPriority(uid, isContest ? 50 : 0); + await RecordModel.judge(domainId, res.insertedId, priority); } return res.insertedId; } diff --git a/packages/hydrooj/src/model/task.ts b/packages/hydrooj/src/model/task.ts index 7bb2e4f74..696f6e355 100644 --- a/packages/hydrooj/src/model/task.ts +++ b/packages/hydrooj/src/model/task.ts @@ -12,7 +12,7 @@ class TaskModel { const t: Task = { ...task, count: task.count ?? 1, - priority: task.priority ?? 1, + priority: task.priority ?? 0, executeAfter: task.executeAfter || new Date(), _id: new ObjectID(), }; diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 2302c3b1b..ef0866c6d 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -296,6 +296,7 @@ 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); }