expire_docops.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const Settings = require('@overleaf/settings')
  2. const rclient = require('@overleaf/redis-wrapper').createClient(
  3. Settings.redis.documentupdater
  4. )
  5. let keys = Settings.redis.documentupdater.key_schema
  6. const async = require('async')
  7. const RedisManager = require('./app/js/RedisManager')
  8. const getKeysFromNode = function (node, pattern, callback) {
  9. let cursor = 0 // redis iterator
  10. const keySet = {} // use hash to avoid duplicate results
  11. // scan over all keys looking for pattern
  12. const doIteration = () =>
  13. node.scan(cursor, 'MATCH', pattern, 'COUNT', 1000, function (error, reply) {
  14. if (error) {
  15. return callback(error)
  16. }
  17. ;[cursor, keys] = reply
  18. console.log('SCAN', keys.length)
  19. for (const key of keys) {
  20. keySet[key] = true
  21. }
  22. if (cursor === '0') {
  23. // note redis returns string result not numeric
  24. return callback(null, Object.keys(keySet))
  25. } else {
  26. return doIteration()
  27. }
  28. })
  29. return doIteration()
  30. }
  31. const getKeys = function (pattern, callback) {
  32. const nodes = (typeof rclient.nodes === 'function'
  33. ? rclient.nodes('master')
  34. : undefined) || [rclient]
  35. console.log('GOT NODES', nodes.length)
  36. const doKeyLookupForNode = (node, cb) => getKeysFromNode(node, pattern, cb)
  37. return async.concatSeries(nodes, doKeyLookupForNode, callback)
  38. }
  39. const expireDocOps = callback =>
  40. // eslint-disable-next-line handle-callback-err
  41. getKeys(keys.docOps({ doc_id: '*' }), (error, keys) =>
  42. async.mapSeries(
  43. keys,
  44. function (key, cb) {
  45. console.log(`EXPIRE ${key} ${RedisManager.DOC_OPS_TTL}`)
  46. return rclient.expire(key, RedisManager.DOC_OPS_TTL, cb)
  47. },
  48. callback
  49. )
  50. )
  51. setTimeout(
  52. () =>
  53. // Give redis a chance to connect
  54. expireDocOps(function (error) {
  55. if (error) {
  56. throw error
  57. }
  58. return process.exit()
  59. }),
  60. 1000
  61. )