From 61dc13a6e1ddb39878322fe2a6946213dff2f476 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Fri, 18 Dec 2015 09:38:34 -0800 Subject: [PATCH] Cache query in progress to reduce redundant GeoIP2 queries. --- cluster-geo/cluster-geo/cluster-geo.js | 43 ++++++++++++++++---------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/cluster-geo/cluster-geo/cluster-geo.js b/cluster-geo/cluster-geo/cluster-geo.js index bbb78e1f3..1338b00bb 100644 --- a/cluster-geo/cluster-geo/cluster-geo.js +++ b/cluster-geo/cluster-geo/cluster-geo.js @@ -19,8 +19,8 @@ if (!config.maxmind) { console.error('FATAL: only MaxMind GeoIP2 is currently supported and is not configured in config.js'); process.exit(1); } -var geo = require('geoip2ws')(config.maxmind); +var geo = require('geoip2ws')(config.maxmind); var cache = require('levelup')(__dirname + '/cache.leveldb'); function lookup(ip,callback) @@ -32,29 +32,40 @@ function lookup(ip,callback) if (cachedEntry) { let ts = cachedEntry.ts; let r = cachedEntry.r; - if (ts) { - if ((Date.now() - ts) < CACHE_TTL) - return callback(null,r); + if ((ts)&&((Date.now() - ts) < CACHE_TTL)) { + //console.error(ip+': cached!'); + return callback(null,(r) ? r : null); } } } catch (e) {} } - geo(ip,function(err,result) { - if (err) - return callback(err,null); - if (!result) - result = null; + cache.put(ip,JSON.stringify({ + ts: Date.now() - (CACHE_TTL - 30000), // set ts to expire in 30 seconds while the query is in progress + r: null + }),function(err) { - cache.put(ip,JSON.stringify({ - ts: Date.now(), - r: result - }),function(err) { - if (err) - console.error('Error saving to cache: '+err); - return callback(null,result); + geo(ip,function(err,result) { + if (err) { + //console.error(err); + return callback(err,null); + } + + if (!result) + result = null; + + cache.put(ip,JSON.stringify({ + ts: Date.now(), + r: result + }),function(err) { + if (err) + console.error('Error saving to cache: '+err); + return callback(null,result); + }); }); + }); + }); };