From d4f94f3091230bed0e7651d86dc795e54e60f96a Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 8 Dec 2020 16:34:28 +0530 Subject: [PATCH 1/4] 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; From 6bc103be5f0150b97045d7fc97d20f2363bba509 Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 8 Dec 2020 16:43:50 +0530 Subject: [PATCH 2/4] delay cache eviction each time the metadata is requested --- lib/commands/metadata.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/commands/metadata.js b/lib/commands/metadata.js index b189d73be..d21b7103c 100644 --- a/lib/commands/metadata.js +++ b/lib/commands/metadata.js @@ -13,6 +13,7 @@ Data.getMetadataRaw = function (Env, channel /* channelName */, _cb) { var cached = Env.metadata_cache[channel]; if (HK.isMetadataMessage(cached)) { + Env.checkCache(channel); return void cb(void 0, cached); } From 4495d99e492c8ee240d946efee66997b2699692b Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 8 Dec 2020 16:45:57 +0530 Subject: [PATCH 3/4] use the standard method of checking whether metadata is valid --- lib/commands/metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/metadata.js b/lib/commands/metadata.js index d21b7103c..896c89f31 100644 --- a/lib/commands/metadata.js +++ b/lib/commands/metadata.js @@ -19,7 +19,7 @@ Data.getMetadataRaw = function (Env, channel /* channelName */, _cb) { Env.batchMetadata(channel, cb, function (done) { Env.computeMetadata(channel, function (err, meta) { - if (!err && meta && meta.channel) { + if (!err && HK.isMetadataMessage(meta)) { Env.metadata_cache[channel] = meta; // clear metadata after a delay if nobody has joined the channel within 30s Env.checkCache(channel); From e6a4c68863044f5e1c617d9eb8a8ae6f90c2a88c Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 8 Dec 2020 16:50:37 +0530 Subject: [PATCH 4/4] always delete the throttled cleanup functions once they have run --- lib/env.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/env.js b/lib/env.js index 066fcd115..322f629c6 100644 --- a/lib/env.js +++ b/lib/env.js @@ -121,9 +121,9 @@ module.exports.create = function (config) { Env.checkCache = function (channel) { var f = Env.cache_checks[channel] || Util.throttle(function () { + delete Env.cache_checks[channel]; if (Env.channel_cache[channel]) { return; } delete Env.metadata_cache[channel]; - delete Env.cache_checks[channel]; }, 30000); f(); };