ProjectPersistenceManager.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. UrlCache = require "./UrlCache"
  2. CompileManager = require "./CompileManager"
  3. db = require "./db"
  4. dbQueue = require "./DbQueue"
  5. async = require "async"
  6. logger = require "logger-sharelatex"
  7. oneDay = 24 * 60 * 60 * 1000
  8. Settings = require "settings-sharelatex"
  9. module.exports = ProjectPersistenceManager =
  10. EXPIRY_TIMEOUT: Settings.project_cache_length_ms || oneDay * 2.5
  11. markProjectAsJustAccessed: (project_id, callback = (error) ->) ->
  12. job = (cb)->
  13. db.Project.findOrCreate(where: {project_id: project_id})
  14. .spread(
  15. (project, created) ->
  16. project.updateAttributes(lastAccessed: new Date())
  17. .then(() -> cb())
  18. .error cb
  19. )
  20. .error cb
  21. dbQueue.queue.push(job, callback)
  22. clearExpiredProjects: (callback = (error) ->) ->
  23. ProjectPersistenceManager._findExpiredProjectIds (error, project_ids) ->
  24. return callback(error) if error?
  25. logger.log project_ids: project_ids, "clearing expired projects"
  26. jobs = for project_id in (project_ids or [])
  27. do (project_id) ->
  28. (callback) ->
  29. ProjectPersistenceManager.clearProjectFromCache project_id, (err) ->
  30. if err?
  31. logger.error err: err, project_id: project_id, "error clearing project"
  32. callback()
  33. async.series jobs, (error) ->
  34. return callback(error) if error?
  35. CompileManager.clearExpiredProjects ProjectPersistenceManager.EXPIRY_TIMEOUT, (error) ->
  36. callback() # ignore any errors from deleting directories
  37. clearProject: (project_id, user_id, callback = (error) ->) ->
  38. logger.log project_id: project_id, user_id:user_id, "clearing project for user"
  39. CompileManager.clearProject project_id, user_id, (error) ->
  40. return callback(error) if error?
  41. ProjectPersistenceManager.clearProjectFromCache project_id, (error) ->
  42. return callback(error) if error?
  43. callback()
  44. clearProjectFromCache: (project_id, callback = (error) ->) ->
  45. logger.log project_id: project_id, "clearing project from cache"
  46. UrlCache.clearProject project_id, (error) ->
  47. if error?
  48. logger.err error:error, project_id: project_id, "error clearing project from cache"
  49. return callback(error)
  50. ProjectPersistenceManager._clearProjectFromDatabase project_id, (error) ->
  51. if error?
  52. logger.err error:error, project_id:project_id, "error clearing project from database"
  53. callback(error)
  54. _clearProjectFromDatabase: (project_id, callback = (error) ->) ->
  55. logger.log project_id:project_id, "clearing project from database"
  56. job = (cb)->
  57. db.Project.destroy(where: {project_id: project_id})
  58. .then(() -> cb())
  59. .error cb
  60. dbQueue.queue.push(job, callback)
  61. _findExpiredProjectIds: (callback = (error, project_ids) ->) ->
  62. job = (cb)->
  63. keepProjectsFrom = new Date(Date.now() - ProjectPersistenceManager.EXPIRY_TIMEOUT)
  64. q = {}
  65. q[db.op.lt] = keepProjectsFrom
  66. db.Project.findAll(where:{lastAccessed:q})
  67. .then((projects) ->
  68. cb null, projects.map((project) -> project.project_id)
  69. ).error cb
  70. dbQueue.queue.push(job, callback)
  71. logger.log {EXPIRY_TIMEOUT: ProjectPersistenceManager.EXPIRY_TIMEOUT}, "project assets kept timeout"