From ee62870e707523a5a070a706604f9b666be5550a Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 29 Oct 2020 22:07:54 +0800 Subject: [PATCH] core: add RecordDetailHandler.postCancel judge: allow judge without config --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/cases.ts | 2 +- packages/hydrojudge/src/judge/interactive.ts | 2 +- packages/hydrojudge/src/service.ts | 2 +- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/record.ts | 25 ++++++++++++++++++-- packages/hydrooj/src/interface.ts | 5 +--- packages/hydrooj/src/loader.ts | 4 ++-- 8 files changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index d118d99c7..c1b18fd35 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.1.8", + "version": "2.1.9", "main": "package.json", "author": "masnn", "dependencies": { diff --git a/packages/hydrojudge/src/cases.ts b/packages/hydrojudge/src/cases.ts index c85f38dd3..7acc30748 100644 --- a/packages/hydrojudge/src/cases.ts +++ b/packages/hydrojudge/src/cases.ts @@ -281,7 +281,7 @@ function convertIniConfig(ini: string) { return res; } -export default async function readCases(folder: string, cfg: Record, args) { +export default async function readCases(folder: string, cfg: Record = {}, args) { const iniConfig = path.resolve(folder, 'config.ini'); const yamlConfig = path.resolve(folder, 'config.yaml'); let config; diff --git a/packages/hydrojudge/src/judge/interactive.ts b/packages/hydrojudge/src/judge/interactive.ts index 6ae137314..7b32e795d 100644 --- a/packages/hydrojudge/src/judge/interactive.ts +++ b/packages/hydrojudge/src/judge/interactive.ts @@ -39,7 +39,7 @@ function judgeCase(c) { status = STATUS.STATUS_RUNTIME_ERROR; if (code < 32) message = signals[code]; else message = `您的程序返回了 ${code}.`; - } else[status, score, message] = resInteractor.files.stderr.split('\n'); + } else [status, score, message] = resInteractor.files.stderr.split('\n'); ctxSubtask.score = Score[ctxSubtask.subtask.type](ctxSubtask.score, score); ctxSubtask.status = Math.max(ctxSubtask.status, status); ctx.total_time_usage_ms += time_usage_ms; diff --git a/packages/hydrojudge/src/service.ts b/packages/hydrojudge/src/service.ts index 27513eb5b..142c59369 100644 --- a/packages/hydrojudge/src/service.ts +++ b/packages/hydrojudge/src/service.ts @@ -16,7 +16,7 @@ declare module 'hydrooj/dist/interface' { async function postInit() { // Only start a single daemon - if (!cluster.isFirstWorker) return; + if (!global.Hydro.isFirstWorker) return; const { compilerText } = require('./utils'); const tmpfs = require('./tmpfs'); const { FormatError, CompileError, SystemError } = require('./error'); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 39b4b79af..609ad865d 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.13.27", + "version": "2.13.28", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 2ba82fceb..9cd6b4ee7 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -1,6 +1,6 @@ import { ObjectID } from 'mongodb'; import { PermissionError, RecordNotFoundError } from '../error'; -import { PERM, CONSTANT } from '../model/builtin'; +import { PERM, CONSTANT, STATUS } from '../model/builtin'; import * as problem from '../model/problem'; import * as file from '../model/file'; import * as record from '../model/record'; @@ -97,6 +97,27 @@ class RecordDetailHandler extends RecordHandler { } this.back(); } + + @param('rid', Types.ObjectID) + async postCancel(domainId: string, rid: ObjectID) { + const rdoc = await record.get(domainId, rid); + if (rdoc) { + const $set = { + status: STATUS.STATUS_CANCELED, + score: 0, + time: 0, + memory: 0, + testCases: [{ + status: 9, score: 0, time: 0, memory: 0, message: 'score canceled', + }], + }; + await Promise.all([ + record.update(domainId, rid, $set), + bus.emit('record/change', rdoc, $set), + ]); + } + this.back(); + } } class RecordHackHandler extends Handler { @@ -130,11 +151,11 @@ class RecordHackHandler extends Handler { /** * @deprecated + * use RecordDetailHandler.postRejudge instead. */ class RecordRejudgeHandler extends Handler { @param('rid', Types.ObjectID) async post(domainId: string, rid: ObjectID) { - this.checkPerm(PERM.PERM_REJUDGE); const rdoc = await record.get(domainId, rid); if (rdoc) { await record.reset(domainId, rid, true); diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index b486e675c..9a39f1816 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -569,12 +569,9 @@ declare global { error: typeof import('./error'), Logger: typeof import('./logger'), locales: Dict>, + isFirstWorker: boolean, }, addons: string[], } } } - -declare module 'cluster' { - let isFirstWorker: boolean; -} diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index 3d5286dea..4907c560b 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -228,8 +228,8 @@ export async function load() { await entry({ entry: argv.entry as string }); logger.success(`Worker ${process.pid} Started as ${argv.entry}`); } else { - if (argv.firstWorker) cluster.isFirstWorker = true; - else cluster.isFirstWorker = false; + if (argv.firstWorker) global.Hydro.isFirstWorker = true; + else global.Hydro.isFirstWorker = false; logger.info(`Worker ${process.pid} Starting`); await entry({ entry: 'worker' }); logger.success(`Worker ${process.pid} Started`);