From d4f94f3091230bed0e7651d86dc795e54e60f96a Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 8 Dec 2020 16:34:28 +0530 Subject: [PATCH] briefly cache server metadata in-memory to avoid repeated reads --- lib/commands/metadata.js | 9 ++++++++- lib/env.js | 12 ++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/commands/metadata.js b/lib/commands/metadata.js index 3d20f36e6..b189d73be 100644 --- a/lib/commands/metadata.js +++ b/lib/commands/metadata.js @@ -17,7 +17,14 @@ Data.getMetadataRaw = function (Env, channel /* channelName */, _cb) { } Env.batchMetadata(channel, cb, function (done) { - Env.computeMetadata(channel, done); + Env.computeMetadata(channel, function (err, meta) { + if (!err && meta && meta.channel) { + Env.metadata_cache[channel] = meta; + // clear metadata after a delay if nobody has joined the channel within 30s + Env.checkCache(channel); + } + done(err, meta); + }); }); }; diff --git a/lib/env.js b/lib/env.js index 3a876f1f7..066fcd115 100644 --- a/lib/env.js +++ b/lib/env.js @@ -42,6 +42,8 @@ module.exports.create = function (config) { metadata_cache: {}, channel_cache: {}, + cache_checks: {}, + queueStorage: WriteQueue(), queueDeletes: WriteQueue(), queueValidation: WriteQueue(), @@ -117,8 +119,14 @@ module.exports.create = function (config) { } }()); - - + Env.checkCache = function (channel) { + var f = Env.cache_checks[channel] || Util.throttle(function () { + if (Env.channel_cache[channel]) { return; } + delete Env.metadata_cache[channel]; + delete Env.cache_checks[channel]; + }, 30000); + f(); + }; (function () { var custom = config.customLimits;