Expose cli task to do cleaning + vacuum

This commit is contained in:
hgw 2024-02-02 03:09:44 +00:00
parent b19562e53d
commit 815fe04636
Signed by: hgw
SSH Key Fingerprint: SHA256:diG7RVYHjd3aDYkZWHYcBJbImu+6zfptuUP+3k/wol4

View File

@ -3,6 +3,7 @@ import { Command } from "commander";
import ClientManager from "../clientManager"; import ClientManager from "../clientManager";
import Utils from "./utils"; import Utils from "./utils";
import SqliteMessageStorage from "../plugins/messageStorage/sqlite"; import SqliteMessageStorage from "../plugins/messageStorage/sqlite";
import {StorageCleaner} from "../storageCleaner";
const program = new Command("storage").description( const program = new Command("storage").description(
"various utilities related to the message storage" "various utilities related to the message storage"
@ -10,7 +11,7 @@ const program = new Command("storage").description(
program program
.command("migrate") .command("migrate")
.argument("[user]", "migrate a specific user only, all if not provided") .argument("[username]", "migrate a specific user only, all if not provided")
.description("Migrate message storage where needed") .description("Migrate message storage where needed")
.on("--help", Utils.extraHelp) .on("--help", Utils.extraHelp)
.action(function (user) { .action(function (user) {
@ -20,7 +21,19 @@ program
}); });
}); });
async function runMigrations(user: string) { program
.command("clean")
.argument("[user]", "clean messages for a specific user only, all if not provided")
.description("Delete messages from the DB based on the storage policy")
.on("--help", Utils.extraHelp)
.action(function (user) {
runCleaning(user).catch((err) => {
log.error(err.toString());
process.exit(1);
});
});
async function runMigrations(user?: string) {
const manager = new ClientManager(); const manager = new ClientManager();
const users = manager.getUsers(); const users = manager.getUsers();
@ -65,4 +78,46 @@ function isUserLogEnabled(manager: ClientManager, user: string): boolean {
return conf.log; return conf.log;
} }
async function runCleaning(user: string) {
const manager = new ClientManager();
const users = manager.getUsers();
if (user) {
if (!users.includes(user)) {
throw new Error(`invalid user ${user}`);
}
return cleanUser(manager, user);
}
for (const name of users) {
await cleanUser(manager, name);
// if any migration fails we blow up,
// chances are the rest won't complete either
}
}
async function cleanUser(manager: ClientManager, user: string) {
log.info("handling user", user);
if (!isUserLogEnabled(manager, user)) {
log.info("logging disabled for user", user, ". Skipping");
return;
}
const sqlite = new SqliteMessageStorage(user);
await sqlite.enable();
const cleaner = new StorageCleaner(sqlite);
const num_deleted = await cleaner.runDeletesNoLimit();
log.info(`deleted ${num_deleted} messages`);
log.info("running a vacuum now, this might take a while");
if (num_deleted > 0) {
await sqlite.vacuum();
}
await sqlite.close();
log.info(`cleaning messages for ${user} has been successful`);
}
export default program; export default program;