diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts index 912f82b86..2ae1cf86c 100644 --- a/server/controllers/tracker.ts +++ b/server/controllers/tracker.ts @@ -48,7 +48,7 @@ const trackerServer = new TrackerServer({ try { if (CONFIG.TRACKER.PRIVATE === false) return cb() - const videoFileExists = await VideoFileModel.doesInfohashExist(infoHash) + const videoFileExists = await VideoFileModel.doesInfohashExistCached(infoHash) if (videoFileExists === true) return cb() const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExist(infoHash) diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts index ba07eaaf3..4c6f200f8 100644 --- a/server/helpers/utils.ts +++ b/server/helpers/utils.ts @@ -40,7 +40,7 @@ const getServerActor = memoizee(async function () { actor.Account = application.Account return actor -}) +}, { promise: true }) function generateVideoImportTmpPath (target: string | ParseTorrent) { const id = typeof target === 'string' ? target : target.infoHash diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 1b7b94d74..f4a2b358b 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -572,7 +572,12 @@ const HLS_STREAMING_PLAYLIST_DIRECTORY = join(CONFIG.STORAGE.STREAMING_PLAYLISTS const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls') const MEMOIZE_TTL = { - OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours + OVERVIEWS_SAMPLE: 1000 * 3600 * 4, // 4 hours + INFO_HASH_EXISTS: 1000 * 3600 * 12 // 12 hours +} + +const MEMOIZE_LENGTH = { + INFO_HASH_EXISTS: 200 } const QUEUE_CONCURRENCY = { @@ -728,6 +733,7 @@ export { ACTIVITY_PUB_ACTOR_TYPES, THUMBNAILS_SIZE, VIDEO_CATEGORIES, + MEMOIZE_LENGTH, VIDEO_LANGUAGES, VIDEO_PRIVACIES, VIDEO_LICENCES, diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts index fa5a6e76d..e08999385 100644 --- a/server/models/video/video-file.ts +++ b/server/models/video/video-file.ts @@ -24,9 +24,10 @@ import { VideoModel } from './video' import { VideoRedundancyModel } from '../redundancy/video-redundancy' import { VideoStreamingPlaylistModel } from './video-streaming-playlist' import { FindOptions, Op, QueryTypes, Transaction } from 'sequelize' -import { MIMETYPES } from '../../initializers/constants' +import { MIMETYPES, MEMOIZE_LENGTH, MEMOIZE_TTL } from '../../initializers/constants' import { MVideoFile, MVideoFileStreamingPlaylistVideo, MVideoFileVideo } from '../../typings/models/video/video-file' import { MStreamingPlaylistVideo, MVideo } from '@server/typings/models' +import * as memoizee from 'memoizee' @Table({ tableName: 'videoFile', @@ -138,6 +139,12 @@ export class VideoFileModel extends Model { }) RedundancyVideos: VideoRedundancyModel[] + static doesInfohashExistCached = memoizee(VideoFileModel.doesInfohashExist, { + promise: true, + max: MEMOIZE_LENGTH.INFO_HASH_EXISTS, + maxAge: MEMOIZE_TTL.INFO_HASH_EXISTS + }) + static doesInfohashExist (infoHash: string) { const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' const options = { diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts index faad4cc2d..0099add4e 100644 --- a/server/models/video/video-streaming-playlist.ts +++ b/server/models/video/video-streaming-playlist.ts @@ -5,7 +5,14 @@ import { VideoModel } from './video' import { VideoRedundancyModel } from '../redundancy/video-redundancy' import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type' import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' -import { CONSTRAINTS_FIELDS, P2P_MEDIA_LOADER_PEER_VERSION, STATIC_DOWNLOAD_PATHS, STATIC_PATHS } from '../../initializers/constants' +import { + CONSTRAINTS_FIELDS, + MEMOIZE_LENGTH, + MEMOIZE_TTL, + P2P_MEDIA_LOADER_PEER_VERSION, + STATIC_DOWNLOAD_PATHS, + STATIC_PATHS +} from '../../initializers/constants' import { join } from 'path' import { sha1 } from '../../helpers/core-utils' import { isArrayOf } from '../../helpers/custom-validators/misc' @@ -13,6 +20,7 @@ import { Op, QueryTypes } from 'sequelize' import { MStreamingPlaylist, MVideoFile } from '@server/typings/models' import { VideoFileModel } from '@server/models/video/video-file' import { getTorrentFileName, getVideoFilename } from '@server/lib/video-paths' +import * as memoizee from 'memoizee' @Table({ tableName: 'videoStreamingPlaylist', @@ -89,6 +97,12 @@ export class VideoStreamingPlaylistModel extends Model