core: optimize database operation

This commit is contained in:
undefined committed 2023-01-30 11:40:19 +08:00
1 parent 7a164483ba
commit 0726dba492
3 files changed
+18 -2

No files matched your search

+1 -1
View File
@@ -74,5 +74,5 @@ export async function apply(ctx: Context) {
ctx.Route('status', '/status', StatusHandler); ctx.Route('status', '/status', StatusHandler);
ctx.Route('status_admin', '/.status', AdminStatusHandler); ctx.Route('status_admin', '/.status', AdminStatusHandler);
ctx.Route('status_update', '/status/update', StatusUpdateHandler); ctx.Route('status_update', '/status/update', StatusUpdateHandler);
await db.ensureIndexes(coll, { key: { updateAt: 1 }, expireAfterSeconds: 24 * 2600 }); await db.ensureIndexes(coll, { name: 'expire', key: { updateAt: 1 }, expireAfterSeconds: 24 * 2600 });
} }
+1 -1
View File
@@ -130,7 +130,7 @@ export async function apply(ctx: Context) {
while (true) { while (true) {
// eslint-disable-next-line no-await-in-loop // eslint-disable-next-line no-await-in-loop
const res = await collEvent.findOneAndUpdate( const res = await collEvent.findOneAndUpdate(
{ ack: { $nin: [id] } }, { expire: { $gt: new Date() }, ack: { $nin: [id] } },
{ $push: { ack: id } }, { $push: { ack: id } },
); );
// eslint-disable-next-line no-await-in-loop // eslint-disable-next-line no-await-in-loop
+16
View File
@@ -2,6 +2,7 @@
import { import {
Collection, Db, IndexSpecification, MongoClient, Collection, Db, IndexSpecification, MongoClient,
} from 'mongodb'; } from 'mongodb';
import { Time } from '@hydrooj/utils';
import { Logger } from '../logger'; import { Logger } from '../logger';
import options from '../options'; import options from '../options';
import * as bus from './bus'; import * as bus from './bus';
@@ -51,6 +52,7 @@ class MongoService {
}); });
this.db = this.client.db(opts.name || 'hydro'); this.db = this.client.db(opts.name || 'hydro');
await bus.parallel('database/connect', this.db); await bus.parallel('database/connect', this.db);
setInterval(() => this.fixExpireAfter(), Time.hour);
} }
public collection<K extends keyof Collections>(c: K): Collection<Collections[K]> { public collection<K extends keyof Collections>(c: K): Collection<Collections[K]> {
@@ -58,6 +60,20 @@ class MongoService {
return this.db.collection(c); return this.db.collection(c);
} }
public async fixExpireAfter() {
// Sometimes mongo's expireAfterSeconds is not working in non-replica set mode;
const collections = await this.db.listCollections().toArray();
for (const c of collections) {
const coll = this.db.collection(c.name);
const indexes = await coll.listIndexes().toArray();
for (const i of indexes) {
if (!i.expireAfterSeconds) continue;
const key = Object.keys(i.key)[0];
await coll.deleteMany({ [key]: { $lt: new Date(Date.now() - i.expireAfterSeconds * 1000) } });
}
}
}
public async ensureIndexes<T>(coll: Collection<T>, ...args: IndexSpecification[]) { public async ensureIndexes<T>(coll: Collection<T>, ...args: IndexSpecification[]) {
if (process.env.NODE_APP_INSTANCE !== '0') return; if (process.env.NODE_APP_INSTANCE !== '0') return;
let existed: any[]; let existed: any[];