From 48232ca57b0e8e5a1aa950527ae6ef3a3eb9d0d8 Mon Sep 17 00:00:00 2001 From: taichanne30 Date: Thu, 25 Jul 2024 16:01:41 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BCTL=E3=81=A7?= =?UTF-8?q?=E3=81=AFFTT=E3=81=AE=E3=82=BD=E3=83=BC=E3=82=B9=E3=81=8C?= =?UTF-8?q?=E7=A9=BA=E3=81=AE=E9=9A=9B=E3=81=ABDB=E3=81=ABFallback?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/src/core/FanoutTimelineEndpointService.ts | 8 +++++--- packages/backend/src/server/api/endpoints/users/notes.ts | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/core/FanoutTimelineEndpointService.ts b/packages/backend/src/core/FanoutTimelineEndpointService.ts index 6c874db9d1..4f513110b4 100644 --- a/packages/backend/src/core/FanoutTimelineEndpointService.ts +++ b/packages/backend/src/core/FanoutTimelineEndpointService.ts @@ -34,6 +34,7 @@ type TimelineOptions = { excludeReplies?: boolean; excludePureRenotes: boolean; dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise, + preventEmptyTimelineDbFallback?: boolean; }; @Injectable() @@ -63,8 +64,9 @@ export class FanoutTimelineEndpointService { const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId); - // 取得したredisResultのうち、2つ以上ソースがあり、1つでも空であればDBにフォールバックする - let shouldFallbackToDb = ps.useDbFallback && (redisResult.length > 1 && redisResult.some(ids => ids.length === 0)); + // オプション無効時、取得したredisResultのうち、2つ以上ソースがあり、1つでも空であればDBにフォールバックする + let shouldFallbackToDb = ps.useDbFallback && + (ps.preventEmptyTimelineDbFallback !== true && redisResult.length > 1 && redisResult.some(ids => ids.length === 0)); // 取得したresultの中で最古のIDのうち、最も新しいものを取得 const fttThresholdId = redisResult.map(ids => ids[0]).sort()[0]; @@ -75,7 +77,7 @@ export class FanoutTimelineEndpointService { let noteIds = redisResultIds.filter(id => id >= fttThresholdId).slice(0, ps.limit); const oldestNoteId = ascending ? redisResultIds[0] : redisResultIds[redisResultIds.length - 1]; - shouldFallbackToDb ||= noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId; + shouldFallbackToDb ||= ps.useDbFallback && (noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId); if (!shouldFallbackToDb) { let filter = ps.noteFilter ?? (_note => true); diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts index cc76c12f1d..cbd14cf608 100644 --- a/packages/backend/src/server/api/endpoints/users/notes.ts +++ b/packages/backend/src/server/api/endpoints/users/notes.ts @@ -143,6 +143,7 @@ export default class extends Endpoint { // eslint- withFiles: ps.withFiles, withRenotes: ps.withRenotes, }, me), + preventEmptyTimelineDbFallback: true, }); return timeline;