core: use rdoc.source & pdoc.reference

This commit is contained in:
undefined committed 2021-10-24 18:28:35 +08:00
1 parent 465a80d617
commit 4aa689b508
24 files changed
+250 -250

No files matched your search

+16 -18
View File
@@ -28,8 +28,7 @@ class JudgeTask {
host: string;
request: any;
ws: WebSocket;
domainId: string;
pid: string;
source: string;
rid: string;
lang: string;
code: string;
@@ -55,20 +54,19 @@ class JudgeTask {
this.next = this.next.bind(this);
this.end = this.end.bind(this);
this.stat.handle = new Date();
this.domainId = this.request.pdomain;
this.pid = this.request.pid.toString();
this.rid = this.request.rid;
this.lang = this.request.lang;
this.code = this.request.code;
this.config = this.request.config;
this.input = this.request.input;
this.data = this.request.data;
this.source = this.request.source;
this.tmpdir = path.resolve(getConfig('tmp_dir'), this.host, this.rid);
this.clean = [];
await Lock.aquire(`${this.host}/${this.domainId}/${this.rid}`);
await Lock.aquire(`${this.host}/${this.source}/${this.rid}`);
fs.ensureDirSync(this.tmpdir);
tmpfs.mount(this.tmpdir, '512m');
log.info('Submission: %s/%s/%s pid=%s', this.host, this.domainId, this.rid, this.pid);
log.info('Submission: %s/%s/%s pid=%s', this.host, this.source, this.rid);
try {
if (typeof this.input === 'string') await this.run();
else await this.doSubmission();
@@ -92,7 +90,7 @@ class JudgeTask {
});
}
} finally {
Lock.release(`${this.host}/${this.domainId}/${this.rid}`);
Lock.release(`${this.host}/${this.source}/${this.rid}`);
for (const clean of this.clean) await clean().catch(noop);
tmpfs.umount(this.tmpdir);
fs.removeSync(this.tmpdir);
@@ -106,12 +104,12 @@ class JudgeTask {
async doSubmission() {
this.stat.cache_start = new Date();
this.folder = await this.session.cacheOpen(this.domainId, this.pid, this.data, this.next);
this.folder = await this.session.cacheOpen(this.source, this.data, this.next);
this.stat.read_cases = new Date();
this.config = await readCases(
this.folder,
{ detail: this.session.config.detail, ...this.config },
{ next: this.next, key: md5(`${this.domainId}${this.pid}${getConfig('secret')}`) },
{ next: this.next, key: md5(`${this.source}${getConfig('secret')}`) },
);
this.stat.judge = new Date();
const type = this.config.type || 'default';
@@ -175,18 +173,18 @@ export default class Hydro {
setInterval(() => { this.axios.get('judge/noop'); }, 30000000);
}
async cacheOpen(domainId: string, pid: string, files: any[], next?) {
await Lock.aquire(`${this.config.host}/${domainId}/${pid}`);
async cacheOpen(source: string, files: any[], next?) {
await Lock.aquire(`${this.config.host}/${source}`);
try {
return this._cacheOpen(domainId, pid, files, next);
return this._cacheOpen(source, files, next);
} finally {
Lock.release(`${this.config.host}/${domainId}/${pid}`);
Lock.release(`${this.config.host}/${source}`);
}
}
async _cacheOpen(domainId: string, pid: string, files: any[], next?) {
const domainDir = path.join(getConfig('cache_dir'), this.config.host, domainId);
const filePath = path.join(domainDir, pid);
async _cacheOpen(source: string, files: any[], next?) {
const [domainId, pid] = source.split('/');
const filePath = path.join(getConfig('cache_dir'), this.config.host, source);
await fs.ensureDir(filePath);
if (!files?.length) throw new SystemError('Problem data not found.');
let etags: Record<string, string> = {};
@@ -205,11 +203,11 @@ export default class Hydro {
if (!allFiles.has(name) && fs.existsSync(path.join(filePath, name))) await fs.rm(path.join(filePath, name));
}
if (filenames.length) {
log.info(`Getting problem data: ${this.config.host}/${domainId}/${pid}`);
log.info(`Getting problem data: ${this.config.host}/${source}`);
if (next) next({ judge_text: '正在同步测试数据,请稍候' });
await this.ensureLogin();
const res = await this.axios.post(`/d/${domainId}/judge/files`, {
pid,
pid: +pid,
files: filenames,
});
// eslint-disable-next-line no-inner-declarations
+8 -10
View File
@@ -73,8 +73,8 @@ async function postInit() {
}
}
async function cacheOpen(domainId: string, pid: string, files: any[]) {
const filePath = path.join(getConfig('cache_dir'), domainId, pid);
async function cacheOpen(source: string, files: any[]) {
const filePath = path.join(getConfig('cache_dir'), source);
await fs.ensureDir(filePath);
if (!files?.length) throw new SystemError('Problem data not found.');
let etags: Record<string, string> = {};
@@ -87,7 +87,7 @@ async function postInit() {
filenames.add(file.name);
version[file.name] = file.etag + file.lastModified;
if (etags[file.name] !== file.etag + file.lastModified) {
await storage.get(`problem/${domainId}/${pid}/testdata/${file.name}`, path.join(filePath, file.name));
await storage.get(`problem/${source}/testdata/${file.name}`, path.join(filePath, file.name));
}
}
for (const name in etags) {
@@ -142,9 +142,8 @@ async function postInit() {
stat: any;
request: any;
event: string;
pid: string;
source: string;
rid: string;
domainId: string;
lang: string;
code: string;
data: any[];
@@ -168,12 +167,11 @@ async function postInit() {
async handle() {
try {
this.stat.handle = new Date();
this.pid = (this.request.pid || 'unknown').toString();
this.rid = this.request.rid.toString();
this.domainId = this.request.pdomain;
this.lang = this.request.lang;
this.code = this.request.code;
this.data = this.request.data;
this.source = this.request.source;
this.config = this.request.config;
this.input = this.request.input;
this.next = getNext(this);
@@ -182,7 +180,7 @@ async function postInit() {
this.clean = [];
fs.ensureDirSync(this.tmpdir);
tmpfs.mount(this.tmpdir, getConfig('tmpfs_size'));
logger.info(`Submission: ${this.domainId}/${this.rid}`, { pid: this.pid });
logger.info(`Submission: ${this.source}/${this.rid}`);
if (typeof this.input === 'string') await this.run();
else await this.submission();
} catch (e) {
@@ -212,12 +210,12 @@ async function postInit() {
async submission() {
this.stat.cache_start = new Date();
this.folder = await cacheOpen(this.domainId, this.pid, this.data);
this.folder = await cacheOpen(this.source, this.data);
this.stat.read_cases = new Date();
this.config = await readCases(
this.folder,
this.config,
{ next: this.next, key: md5(`${this.domainId}${this.pid}${getConfig('secret')}`) },
{ next: this.next, key: md5(`${this.source}/${getConfig('secret')}`) },
);
this.stat.judge = new Date();
const type = this.config.type || 'default';