expire_docops.coffee 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. Settings = require "settings-sharelatex"
  2. rclient = require("redis-sharelatex").createClient(Settings.redis.documentupdater)
  3. keys = Settings.redis.documentupdater.key_schema
  4. async = require "async"
  5. RedisManager = require "./app/js/RedisManager"
  6. getKeysFromNode = (node, pattern, callback) ->
  7. cursor = 0 # redis iterator
  8. keySet = {} # use hash to avoid duplicate results
  9. # scan over all keys looking for pattern
  10. doIteration = (cb) ->
  11. node.scan cursor, "MATCH", pattern, "COUNT", 1000, (error, reply) ->
  12. return callback(error) if error?
  13. [cursor, keys] = reply
  14. console.log "SCAN", keys.length
  15. for key in keys
  16. keySet[key] = true
  17. if cursor == '0' # note redis returns string result not numeric
  18. return callback(null, Object.keys(keySet))
  19. else
  20. doIteration()
  21. doIteration()
  22. getKeys = (pattern, callback) ->
  23. nodes = rclient.nodes?('master') || [ rclient ];
  24. console.log "GOT NODES", nodes.length
  25. doKeyLookupForNode = (node, cb) ->
  26. getKeysFromNode node, pattern, cb
  27. async.concatSeries nodes, doKeyLookupForNode, callback
  28. TTL = 60 * 60 # 1 hour
  29. expireDocOps = (callback) ->
  30. getKeys keys.docOps(doc_id: "*"), (error, keys) ->
  31. async.mapSeries keys,
  32. (key, cb) ->
  33. console.log "EXPIRE #{key} #{RedisManager.DOC_OPS_TTL}"
  34. rclient.expire key, RedisManager.DOC_OPS_TTL, cb
  35. callback
  36. setTimeout () -> # Give redis a chance to connect
  37. expireDocOps (error) ->
  38. throw error if error?
  39. process.exit()
  40. , 1000