AutomaticSnapshotManager.coffee 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. Keys = require("./RedisKeys")
  2. Settings = require "settings-sharelatex"
  3. redis = require('redis')
  4. rclient = redis.createClient(Settings.redis.web.port, Settings.redis.web.host)
  5. rclient.auth(Settings.redis.web.password)
  6. VersioningApiHandler = require('../../Features/Versioning/VersioningApiHandler')
  7. async = require('async')
  8. metrics = require('../../infrastructure/Metrics')
  9. logger = require('logger-sharelatex')
  10. module.exports = AutomaticSnapshotManager =
  11. markProjectAsUpdated: (project_id, callback = (error) ->) ->
  12. rclient.set Keys.buildLastUpdatedKey(project_id), Date.now(), (error) ->
  13. return callback(error) if error?
  14. rclient.sadd Keys.projectsToSnapshotKey, project_id, (error) ->
  15. return callback(error) if error?
  16. callback()
  17. unmarkProjectAsUpdated: (project_id, callback = (err)->)->
  18. rclient.del Keys.buildLastUpdatedKey(project_id), Date.now(), (error) ->
  19. return callback(error) if error?
  20. rclient.srem Keys.projectsToSnapshotKey, project_id, (error) ->
  21. return callback(error) if error?
  22. callback()
  23. takeAutomaticSnapshots: (callback = (error) ->) ->
  24. rclient.smembers Keys.projectsToSnapshotKey, (error, project_ids) =>
  25. logger.log project_ids:project_ids, "taking automatic snapshots"
  26. metrics.gauge "versioning.projectsToSnapshot", project_ids.length
  27. return callback(error) if error?
  28. methods = []
  29. for project_id in project_ids
  30. do (project_id) =>
  31. methods.push((callback) => @takeSnapshotIfRequired(project_id, callback))
  32. async.series methods, callback
  33. takeSnapshotIfRequired: (project_id, callback = (error) ->) ->
  34. rclient.get Keys.buildLastUpdatedKey(project_id), (error, lastUpdated) ->
  35. return callback(error) if error?
  36. if lastUpdated? and lastUpdated < Date.now() - Settings.automaticSnapshots.waitTimeAfterLastEdit
  37. VersioningApiHandler.takeSnapshot(project_id, "Automatic snapshot", callback)
  38. else
  39. rclient.get Keys.buildLastSnapshotKey(project_id), (error, lastSnapshot) ->
  40. return callback(error) if error?
  41. if !lastSnapshot? or lastSnapshot < Date.now() - Settings.automaticSnapshots.maxTimeBetweenSnapshots
  42. VersioningApiHandler.takeSnapshot(project_id, "Automatic snapshot", callback)
  43. else
  44. callback()