DocArchiveManager.coffee 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. MongoManager = require "./MongoManager"
  2. MongoAWS = require "./MongoAWS"
  3. LockManager = require "./LockManager"
  4. DocstoreHandler = require "./DocstoreHandler"
  5. logger = require "logger-sharelatex"
  6. _ = require "underscore"
  7. async = require "async"
  8. settings = require("settings-sharelatex")
  9. # increase lock timeouts because archiving can be slow
  10. LockManager.LOCK_TEST_INTERVAL = 500 # 500ms between each test of the lock
  11. LockManager.MAX_LOCK_WAIT_TIME = 30000 # 30s maximum time to spend trying to get the lock
  12. LockManager.LOCK_TTL = 30 # seconds
  13. module.exports = DocArchiveManager =
  14. archiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  15. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  16. if error?
  17. return callback(error)
  18. else if !docs?
  19. return callback new Error("No docs for project #{project_id}")
  20. jobs = _.map docs, (doc) ->
  21. (cb)-> DocArchiveManager.archiveDocChangesWithLock project_id, doc._id, cb
  22. async.series jobs, callback
  23. archiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  24. job = (releaseLock) ->
  25. DocArchiveManager.archiveDocChanges project_id, doc_id, releaseLock
  26. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  27. archiveDocChanges: (project_id, doc_id, callback)->
  28. MongoManager.getDocChangesCount doc_id, (error, count) ->
  29. return callback(error) if error?
  30. if count == 0
  31. logger.log {project_id, doc_id}, "document history is empty, not archiving"
  32. return callback()
  33. else
  34. MongoManager.getArchivedDocChanges doc_id, (error, count) ->
  35. return callback(error) if error?
  36. if count != 0
  37. logger.log {project_id, doc_id}, "document history contains archived entries, not archiving"
  38. return callback()
  39. MongoManager.getLastCompressedUpdate doc_id, (error, update) ->
  40. return callback(error) if error?
  41. MongoManager.markDocHistoryAsArchiveInProgress doc_id, update, (error) ->
  42. return callback(error) if error?
  43. MongoAWS.archiveDocHistory project_id, doc_id, (error) ->
  44. if error?
  45. MongoManager.clearDocHistoryAsArchiveInProgress doc_id, update, (err) ->
  46. return callback(err) if err?
  47. callback(error)
  48. else
  49. logger.log doc_id:doc_id, project_id:project_id, "exported document to S3"
  50. MongoManager.markDocHistoryAsArchived doc_id, update, (error) ->
  51. return callback(error) if error?
  52. callback()
  53. unArchiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  54. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  55. if error?
  56. return callback(error)
  57. else if !docs?
  58. return callback new Error("No docs for project #{project_id}")
  59. jobs = _.map docs, (doc) ->
  60. (cb)-> DocArchiveManager.unArchiveDocChangesWithLock project_id, doc._id, cb
  61. async.parallelLimit jobs, 4, callback
  62. unArchiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  63. job = (releaseLock) ->
  64. DocArchiveManager.unArchiveDocChanges project_id, doc_id, releaseLock
  65. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  66. unArchiveDocChanges: (project_id, doc_id, callback)->
  67. MongoManager.getArchivedDocChanges doc_id, (error, count) ->
  68. return callback(error) if error?
  69. if count == 0
  70. return callback()
  71. else
  72. MongoAWS.unArchiveDocHistory project_id, doc_id, (error) ->
  73. return callback(error) if error?
  74. logger.log doc_id:doc_id, project_id:project_id, "imported document from S3"
  75. MongoManager.markDocHistoryAsUnarchived doc_id, (error) ->
  76. return callback(error) if error?
  77. callback()