core: pm2 cluster management

This commit is contained in:
undefined committed 2021-09-09 06:18:16 +08:00
1 parent 9f5c00a985
commit 448c398d21
30 files changed
+206 -427

No files matched your search

+7 -6
View File
@@ -113,12 +113,11 @@ const acm: ContestRule = {
for (const [rank, tsdoc] of rankedTsdocs) {
const tsddict = {};
for (const item of tsdoc.detail || []) tsddict[item.pid] = item;
const row: ScoreboardRow = [];
row.push(
const row: ScoreboardRow = [
{ type: 'string', value: rank.toString() },
{ type: 'user', value: udict[tsdoc.uid].uname, raw: tsdoc.uid },
{ type: 'string', value: tsdoc.accept || 0 },
);
];
if (isExport) {
row.push(
{ type: 'string', value: tsdoc.time || 0.0 },
@@ -133,9 +132,11 @@ const acm: ContestRule = {
const colTime = accept ? doc.time : '-';
const colTimeStr = accept ? misc.formatSeconds(colTime) : '-';
if (isExport) {
row.push({ type: 'string', value: colAccepted });
row.push({ type: 'string', value: colTime });
row.push({ type: 'string', value: colTimeStr });
row.push(
{ type: 'string', value: colAccepted },
{ type: 'string', value: colTime },
{ type: 'string', value: colTimeStr },
);
} else {
row.push({
type: 'record',
-1
View File
@@ -175,7 +175,6 @@ SystemSetting(
Setting('setting_server', 'server.center', 'https://hydro.undefined.moe:8443/center', 'text', 'server.center', '', FLAG_HIDDEN),
Setting('setting_server', 'server.name', 'Hydro', 'text', 'server.name', 'Server Name'),
Setting('setting_server', 'server.displayName', 'Hydro', 'text', 'server.name', 'Server Name (Global Display)', FLAG_PRO),
Setting('setting_server', 'server.worker', 1, 'number', 'server.worker', 'Server Workers Number', FLAG_PRO),
Setting('setting_server', 'server.url', '/', 'text', 'server.url', 'Server BaseURL'),
Setting('setting_server', 'server.cdn', '/', 'text', 'server.cdn', 'CDN Prefix'),
Setting('setting_server', 'server.port', 8888, 'number', 'server.port', 'Server Port'),
+26 -1
View File
@@ -1,4 +1,5 @@
import moment from 'moment-timezone';
import { hostname } from 'os';
import { FilterQuery, ObjectID } from 'mongodb';
import { sleep } from '@hydrooj/utils/lib/utils';
import { BaseService, Task } from '../interface';
@@ -8,6 +9,7 @@ import * as bus from '../service/bus';
const logger = new Logger('model/task');
const coll = db.collection('task');
const collEvent = db.collection('event');
async function getFirst(query: FilterQuery<Task>) {
const q = { ...query };
@@ -45,7 +47,7 @@ class Consumer {
await this.func(res);
this.running = null;
// eslint-disable-next-line no-await-in-loop
} else await sleep(100);
} else await sleep(1000);
} catch (err) {
logger.error(err);
if (this.destoryOnError) this.destory();
@@ -145,6 +147,29 @@ bus.once('app/started', async () => {
interval: [1, 'day'],
});
}
await collEvent.createIndex({ expire: 1 }, { expireAfterSeconds: 0 });
const id = hostname() + process.env.NODE_APP_INSTANCE;
(async () => {
// eslint-disable-next-line no-constant-condition
while (true) {
// eslint-disable-next-line no-await-in-loop
const res = await collEvent.findOneAndUpdate(
{ ack: { $not: { $elemMatch: { $eq: id } } } },
{ $push: { ack: id } },
);
if (res.value) bus.parallel(res.value.event, ...JSON.parse(res.value.payload));
// eslint-disable-next-line no-await-in-loop
else await sleep(100);
}
})();
});
bus.on('bus/broadcast', (event, payload) => {
collEvent.insertOne({
ack: [],
event,
payload: JSON.stringify(payload),
expire: new Date(Date.now() + 10000),
});
});
export default TaskModel;