From 0ac113fc73a86fe29e90fe8bb417defcb5ef9252 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 26 Jan 2024 01:30:57 +0800 Subject: [PATCH] judge: trigger `start` when ready --- packages/hydrojudge/src/hosts/hydro.ts | 4 ++-- packages/hydrooj/src/handler/judge.ts | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 9275991ac..7f75b52bd 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -196,7 +196,6 @@ export default class Hydro implements Session { const content = Object.keys(config).length ? JSON.stringify({ key: 'config', ...config }) : '{"key":"ping"}'; - setInterval(() => this.ws?.send?.(content), 30000); this.ws.on('message', (data) => { if (data.toString() === 'ping') { this.ws.send('pong'); @@ -216,6 +215,8 @@ export default class Hydro implements Session { }); await new Promise((resolve) => { this.ws.once('open', async () => { + this.ws.send(content); + this.ws.send('{"key":"start"}'); if (!this.config.noStatus) { const info = await sysinfo.get(); this.ws.send(JSON.stringify({ key: 'status', info })); @@ -224,7 +225,6 @@ export default class Hydro implements Session { this.ws.send(JSON.stringify({ key: 'status', info: { mid, ...inf } })); }, 1200000); } - this.ws.send(content); resolve(null); }); }); diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index 7c449510a..07e66a8e7 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -213,6 +213,7 @@ export class JudgeFileUpdateHandler extends Handler { class JudgeConnectionHandler extends ConnectionHandler { category = '#judge'; processing: Task[] = []; + started = false; closed = false; query: any = { type: { $in: ['judge', 'generate'] } }; rdocs: Record = {}; @@ -222,9 +223,12 @@ class JudgeConnectionHandler extends ConnectionHandler { async prepare() { logger.info('Judge daemon connected from ', this.request.ip); this.sendLanguageConfig(); - // Ensure language sent - await sleep(100); - this.newTask().catch((e) => logger.error(e)); + // TODO deprecated, just for compatibility + setTimeout(() => { + if (this.started || this.closed) return; + this.newTask().catch((e) => logger.error(e)); + this.started = true; + }, 15000); } @subscribe('system/setting') @@ -291,6 +295,10 @@ class JudgeConnectionHandler extends ConnectionHandler { if (msg.lang instanceof Array && msg.lang.every((i) => typeof i === 'string')) { this.query.lang = { $in: msg.lang }; } + } else if (msg.key === 'start') { + if (this.started) return; + this.newTask().catch((e) => logger.error(e)); + this.started = true; } }