diff --git a/packages/hydrojudge/src/hosts/builtin.ts b/packages/hydrojudge/src/hosts/builtin.ts index 4920b916..72a335aa 100644 --- a/packages/hydrojudge/src/hosts/builtin.ts +++ b/packages/hydrojudge/src/hosts/builtin.ts @@ -76,6 +76,10 @@ export async function postInit() { await fs.ensureDir(getConfig('tmp_dir')); const handle = async (t) => { const rdoc = await RecordModel.get(t.domainId, t.rid); + if (!rdoc) { + logger.debug('Record not found: %o', t); + return; + } (new JudgeTask(session, Object.assign(rdoc, t))).handle().catch(logger.error); }; TaskModel.consume({ type: 'judge' }, handle); diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index 0cfea84e..7a524066 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -195,14 +195,16 @@ class JudgeConnectionHandler extends ConnectionHandler { async newTask() { if (this.processing) return; let t; + let rdoc: RecordDoc; while (!t) { if (this.closed) return; - // eslint-disable-next-line no-await-in-loop + /* eslint-disable no-await-in-loop */ t = await task.getFirst(this.query); - // eslint-disable-next-line no-await-in-loop if (!t) await sleep(500); + else rdoc = await record.get(t.domainId, t.rid); + /* eslint-enable no-await-in-loop */ + if (!rdoc) t = null; } - let rdoc = await record.get(t.domainId, t.rid); this.send({ task: { ...rdoc, ...t } }); this.processing = t; const $set = { status: builtin.STATUS.STATUS_FETCHED };