Do saved message clean-up globally, not per-guild

Possible fix for the DEADLOCK errors on the server, and should also be
more performant (though probably marginally).
This commit is contained in:
Dragory 2019-04-20 19:51:26 +03:00
parent d7079df83d
commit d30fbbbbaa

View file

@ -5,10 +5,37 @@ import { QueuedEventEmitter } from "../QueuedEventEmitter";
import { GuildChannel, Message } from "eris";
import moment from "moment-timezone";
const CLEANUP_INTERVAL = 5 * 60 * 1000;
const CLEANUP_INTERVAL = 5 * 60 * 1000; // 5 min
const RETENTION_PERIOD = 5 * 24 * 60 * 60 * 1000; // 5 days
async function cleanup() {
const repository = getRepository(SavedMessage);
await repository
.createQueryBuilder("messages")
.where(
// Clear deleted messages
new Brackets(qb => {
qb.where("deleted_at IS NOT NULL");
qb.andWhere(`deleted_at <= (NOW() - INTERVAL ${CLEANUP_INTERVAL}000 MICROSECOND)`);
}),
)
.orWhere(
// Clear old messages
new Brackets(qb => {
qb.where("is_permanent = 0");
qb.andWhere(`posted_at <= (NOW() - INTERVAL ${RETENTION_PERIOD}000 MICROSECOND)`);
}),
)
.delete()
.execute();
setTimeout(cleanup, CLEANUP_INTERVAL);
}
// Start first cleanup 30 seconds after startup
setTimeout(cleanup, 30 * 1000);
export class GuildSavedMessages extends BaseRepository {
private messages: Repository<SavedMessage>;
protected toBePermanent: Set<string>;
@ -21,9 +48,6 @@ export class GuildSavedMessages extends BaseRepository {
this.events = new QueuedEventEmitter();
this.toBePermanent = new Set();
this.cleanup();
setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
}
public msgToSavedMessageData(msg: Message): ISavedMessageData {
@ -42,33 +66,6 @@ export class GuildSavedMessages extends BaseRepository {
return data;
}
async cleanup() {
await this.messages
.createQueryBuilder("messages")
.where("guild_id = :guild_id", { guild_id: this.guildId })
.andWhere(
new Brackets(qb => {
// Clear deleted messages
qb.orWhere(
new Brackets(qb2 => {
qb2.where("deleted_at IS NOT NULL");
qb2.andWhere(`deleted_at <= (NOW() - INTERVAL ${CLEANUP_INTERVAL}000 MICROSECOND)`);
}),
);
// Clear old messages
qb.orWhere(
new Brackets(qb2 => {
qb2.where("is_permanent = 0");
qb2.andWhere(`posted_at <= (NOW() - INTERVAL ${RETENTION_PERIOD}000 MICROSECOND)`);
}),
);
}),
)
.delete()
.execute();
}
find(id) {
return this.messages
.createQueryBuilder()