diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 0ea5b6a29..c5d904591 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -155,7 +155,8 @@ export default class Hydro { getNext(t: JudgeTask) { return (data: Partial) => { log.debug('Next: %o', data); - if (getConfig('performance') && data.case && !data.compilerText && !data.message) { + const performanceMode = getConfig('performance') || t.meta.rejudge || t.meta.hackRejudge; + if (performanceMode && data.case && !data.compilerText && !data.message) { t.callbackCache ||= []; t.callbackCache.push(data.case); } else { diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index e97b1fd94..a794de15e 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -441,8 +441,8 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { const priority = await record.submissionPriority(this.user._id, -10000 - rdocs.length * 5 - 50); await record.reset(domainId, rdocs.map((rdoc) => rdoc._id), true); await Promise.all([ - record.judge(domainId, rdocs.filter((i) => i.contest).map((i) => i._id), priority, { detail: false }), - record.judge(domainId, rdocs.filter((i) => !i.contest).map((i) => i._id), priority, {}), + record.judge(domainId, rdocs.filter((i) => i.contest).map((i) => i._id), priority, { detail: false }, { rejudge: true }), + record.judge(domainId, rdocs.filter((i) => !i.contest).map((i) => i._id), priority, {}, { rejudge: true }), ]); this.back(); } diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 3b1af5fb3..f9d7c2903 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -336,6 +336,7 @@ export interface RecordDoc { export interface JudgeMeta { problemOwner: number; hackRejudge?: string; + rejudge?: boolean; } export interface JudgeRequest extends Omit { diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 85ba8bc7c..ed8a0846d 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -115,7 +115,7 @@ export default class RecordModel { contest?: ObjectID, input?: string, files?: Record, - type: 'judge' | 'contest' | 'pretest' | 'hack', + type: 'judge' | 'rejudge' | 'contest' | 'pretest' | 'hack', } = { type: 'judge' }, ) { const data: RecordDoc = { @@ -138,14 +138,17 @@ export default class RecordModel { }; if (args.contest) data.contest = args.contest; if (args.files) data.files = args.files; - if (args.type === 'pretest') { + if (args.type === 'rejudge') { + args.type = 'judge'; + data.rejudged = true; + } else if (args.type === 'pretest') { data.input = args.input || ''; data.contest = new ObjectID('000000000000000000000000'); } const res = await RecordModel.coll.insertOne(data); if (addTask) { const priority = await RecordModel.submissionPriority(uid, args.type === 'pretest' ? -20 : (args.type === 'contest' ? 50 : 0)); - await RecordModel.judge(domainId, res.insertedId, priority, args.type === 'contest' ? { detail: false } : {}); + await RecordModel.judge(domainId, res.insertedId, priority, args.type === 'contest' ? { detail: false } : {}, { rejudge: data.rejudged }); } return res.insertedId; }