From d0e1796ae4ca2eb591bcf38e957c1bd7cc0b718b Mon Sep 17 00:00:00 2001 From: riku6460 <17585784+riku6460@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:35:33 +0900 Subject: [PATCH] =?UTF-8?q?perf(backend):=20queue=20=E3=81=AE=20delayed=20?= =?UTF-8?q?=E3=81=AE=E4=BB=B6=E6=95=B0=E3=81=8C=E5=A2=97=E3=81=88=E3=81=9F?= =?UTF-8?q?=E9=9A=9B=E3=81=AB=20deliver-delayed=20=E3=81=A8=20inbox-delaye?= =?UTF-8?q?d=20=E3=81=8C=E8=BF=94=E3=81=A3=E3=81=A6=E3=81=93=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20(MisskeyIO#750)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 3fdcf99011d7eadae3a9027b712ac159f6fd58f6) --- .../endpoints/admin/queue/deliver-delayed.ts | 26 +++++++++++++------ .../endpoints/admin/queue/inbox-delayed.ts | 26 +++++++++++++------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts index f3e440b4cb..b3f417c027 100644 --- a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts +++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts @@ -7,6 +7,7 @@ import { URL } from 'node:url'; import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import type { DeliverQueue } from '@/core/QueueModule.js'; +import { ApiLoggerService } from '@/server/api/ApiLoggerService.js'; export const meta = { tags: ['admin'], @@ -48,24 +49,33 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( @Inject('queue:deliver') public deliverQueue: DeliverQueue, + + private apiLoggerService: ApiLoggerService, ) { super(meta, paramDef, async (ps, me) => { const jobs = await this.deliverQueue.getJobs(['delayed']); - const res = [] as [string, number][]; + const res = new Map(); for (const job of jobs) { - const host = new URL(job.data.to).host; - if (res.find(x => x[0] === host)) { - res.find(x => x[0] === host)![1]++; + let host: string; + try { + host = new URL(job.data.to).host; + } catch (e) { + this.apiLoggerService.logger.warn(`failed to parse url in ${job.id}: ${e}`); + this.apiLoggerService.logger.warn(`id: ${job.id}, data: ${JSON.stringify(job.data)}`); + continue; + } + + const found = res.get(host); + if (found) { + res.set(host, found + 1); } else { - res.push([host, 1]); + res.set(host, 1); } } - res.sort((a, b) => b[1] - a[1]); - - return res; + return Array.from(res.entries()).sort((a, b) => b[1] - a[1]); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts index e7589cba81..b19b3ff5ef 100644 --- a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts +++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts @@ -7,6 +7,7 @@ import { URL } from 'node:url'; import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import type { InboxQueue } from '@/core/QueueModule.js'; +import { ApiLoggerService } from '@/server/api/ApiLoggerService.js'; export const meta = { tags: ['admin'], @@ -48,24 +49,33 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( @Inject('queue:inbox') public inboxQueue: InboxQueue, + + private apiLoggerService: ApiLoggerService, ) { super(meta, paramDef, async (ps, me) => { const jobs = await this.inboxQueue.getJobs(['delayed']); - const res = [] as [string, number][]; + const res = new Map(); for (const job of jobs) { - const host = new URL(job.data.signature.keyId).host; - if (res.find(x => x[0] === host)) { - res.find(x => x[0] === host)![1]++; + let host: string; + try { + host = new URL(job.data.signature.keyId).host; + } catch (e) { + this.apiLoggerService.logger.warn(`failed to parse url in ${job.id}: ${e}`); + this.apiLoggerService.logger.warn(`id: ${job.id}, data: ${JSON.stringify(job.data)}`); + continue; + } + + const found = res.get(host); + if (found) { + res.set(host, found + 1); } else { - res.push([host, 1]); + res.set(host, 1); } } - res.sort((a, b) => b[1] - a[1]); - - return res; + return Array.from(res.entries()).sort((a, b) => b[1] - a[1]); }); } }