mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
54 lines
2.1 KiB
JavaScript
54 lines
2.1 KiB
JavaScript
/*
|
|
* decaffeinate suggestions:
|
|
* DS101: Remove unnecessary use of Array.from
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS207: Consider shorter variations of null checks
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
*/
|
|
const Settings = require("settings-sharelatex");
|
|
const rclient = require("@overleaf/redis-wrapper").createClient(Settings.redis.documentupdater);
|
|
let keys = Settings.redis.documentupdater.key_schema;
|
|
const async = require("async");
|
|
const RedisManager = require("./app/js/RedisManager");
|
|
|
|
const getKeysFromNode = function(node, pattern, callback) {
|
|
let cursor = 0; // redis iterator
|
|
const keySet = {}; // use hash to avoid duplicate results
|
|
// scan over all keys looking for pattern
|
|
var doIteration = cb => node.scan(cursor, "MATCH", pattern, "COUNT", 1000, function(error, reply) {
|
|
if (error != null) { return callback(error); }
|
|
[cursor, keys] = Array.from(reply);
|
|
console.log("SCAN", keys.length);
|
|
for (let key of Array.from(keys)) {
|
|
keySet[key] = true;
|
|
}
|
|
if (cursor === '0') { // note redis returns string result not numeric
|
|
return callback(null, Object.keys(keySet));
|
|
} else {
|
|
return doIteration();
|
|
}
|
|
});
|
|
return doIteration();
|
|
};
|
|
|
|
const getKeys = function(pattern, callback) {
|
|
const nodes = (typeof rclient.nodes === 'function' ? rclient.nodes('master') : undefined) || [ rclient ];
|
|
console.log("GOT NODES", nodes.length);
|
|
const doKeyLookupForNode = (node, cb) => getKeysFromNode(node, pattern, cb);
|
|
return async.concatSeries(nodes, doKeyLookupForNode, callback);
|
|
};
|
|
|
|
const TTL = 60 * 60; // 1 hour
|
|
const expireDocOps = callback => getKeys(keys.docOps({doc_id: "*"}), (error, keys) => async.mapSeries(keys,
|
|
function(key, cb) {
|
|
console.log(`EXPIRE ${key} ${RedisManager.DOC_OPS_TTL}`);
|
|
return rclient.expire(key, RedisManager.DOC_OPS_TTL, cb);
|
|
},
|
|
callback));
|
|
|
|
setTimeout(() => // Give redis a chance to connect
|
|
expireDocOps(function(error) {
|
|
if (error != null) { throw error; }
|
|
return process.exit();
|
|
})
|
|
, 1000);
|