perf: don't load thumbs if disabled globally, cache thumb results

v1.18.x
Barış Soner Uşaklı 4 years ago
parent ff18cdfa39
commit 2d5a224b06

@ -145,13 +145,14 @@ Topics.getTopicsByTids = async function (tids, options) {
// Note: Backwards compatibility with old thumb logic, remove in v1.17.0 // Note: Backwards compatibility with old thumb logic, remove in v1.17.0
function restoreThumbValue(topic) { function restoreThumbValue(topic) {
if (topic.thumb && !topic.thumbs.length) { const isArray = Array.isArray(topic.thumbs);
if (isArray && !topic.thumbs.length && topic.thumb) {
topic.thumbs = [{ topic.thumbs = [{
id: topic.tid, id: topic.tid,
name: path.basename(topic.thumb), name: path.basename(topic.thumb),
url: topic.thumb, url: topic.thumb,
}]; }];
} else if (topic.thumbs.length) { } else if (isArray && topic.thumbs.length) {
topic.thumb = topic.thumbs[0].url; topic.thumb = topic.thumbs[0].url;
} }
} }

@ -9,10 +9,10 @@ const db = require('../database');
const file = require('../file'); const file = require('../file');
const plugins = require('../plugins'); const plugins = require('../plugins');
const posts = require('../posts'); const posts = require('../posts');
const meta = require('../meta');
const cache = require('../cache');
const Thumbs = {}; const Thumbs = module.exports;
module.exports = Thumbs;
Thumbs.exists = async function (tid, path) { Thumbs.exists = async function (tid, path) {
// TODO: tests // TODO: tests
@ -27,18 +27,33 @@ Thumbs.get = async function (tids) {
singular = true; singular = true;
} }
if (!meta.config.allowTopicsThumbnail) {
return singular ? null : tids.map(() => []);
}
const upload_url = nconf.get('upload_url');
const sets = tids.map(tid => `${validator.isUUID(String(tid)) ? 'draft' : 'topic'}:${tid}:thumbs`); const sets = tids.map(tid => `${validator.isUUID(String(tid)) ? 'draft' : 'topic'}:${tid}:thumbs`);
const thumbs = await Promise.all(sets.map(async set => db.getSortedSetRange(set, 0, -1))); const thumbs = await Promise.all(sets.map(set => getThumbs(set)));
let response = thumbs.map((thumbSet, idx) => thumbSet.map(thumb => ({ let response = thumbs.map((thumbSet, idx) => thumbSet.map(thumb => ({
id: tids[idx], id: tids[idx],
name: path.basename(thumb), name: path.basename(thumb),
url: thumb.startsWith('http') ? thumb : path.join(nconf.get('upload_url'), thumb), url: thumb.startsWith('http') ? thumb : path.join(upload_url, thumb),
}))); })));
({ thumbs: response } = await plugins.hooks.fire('filter:topics.getThumbs', { tids, thumbs: response })); ({ thumbs: response } = await plugins.hooks.fire('filter:topics.getThumbs', { tids, thumbs: response }));
return singular ? response.pop() : response; return singular ? response.pop() : response;
}; };
async function getThumbs(set) {
const cached = cache.get(set);
if (cached !== undefined) {
return cached.slice();
}
const thumbs = await db.getSortedSetRange(set, 0, -1);
cache.set(set, thumbs, 600000);
return thumbs.slice();
}
Thumbs.associate = async function ({ id, path: relativePath, url }) { Thumbs.associate = async function ({ id, path: relativePath, url }) {
// Associates a newly uploaded file as a thumb to the passed-in draft or topic // Associates a newly uploaded file as a thumb to the passed-in draft or topic
const isDraft = validator.isUUID(String(id)); const isDraft = validator.isUUID(String(id));
@ -52,6 +67,7 @@ Thumbs.associate = async function ({ id, path: relativePath, url }) {
} }
await db.sortedSetAdd(set, numThumbs, value); await db.sortedSetAdd(set, numThumbs, value);
cache.del(set);
// Associate thumbnails with the main pid (only on local upload) // Associate thumbnails with the main pid (only on local upload)
if (!isDraft && relativePath) { if (!isDraft && relativePath) {
@ -67,6 +83,7 @@ Thumbs.migrate = async function (uuid, id) {
const thumbs = await db.getSortedSetRange(set, 0, -1); const thumbs = await db.getSortedSetRange(set, 0, -1);
await Promise.all(thumbs.map(async path => await Thumbs.associate({ id, path }))); await Promise.all(thumbs.map(async path => await Thumbs.associate({ id, path })));
await db.delete(set); await db.delete(set);
cache.del(set);
}; };
Thumbs.delete = async function (id, relativePath) { Thumbs.delete = async function (id, relativePath) {
@ -80,6 +97,7 @@ Thumbs.delete = async function (id, relativePath) {
if (associated) { if (associated) {
await db.sortedSetRemove(set, relativePath); await db.sortedSetRemove(set, relativePath);
cache.del(set);
if (existsOnDisk) { if (existsOnDisk) {
await file.delete(absolutePath); await file.delete(absolutePath);

Loading…
Cancel
Save