DocArchiveManager.coffee 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. module.exports = DocArchiveManager =
  10. archiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  11. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  12. if error?
  13. return callback(error)
  14. else if !docs?
  15. return callback new Error("No docs for project #{project_id}")
  16. jobs = _.map docs, (doc) ->
  17. (cb)-> DocArchiveManager.archiveDocChangesWithLock project_id, doc._id, cb
  18. async.series jobs, callback
  19. archiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  20. job = (releaseLock) ->
  21. DocArchiveManager.archiveDocChanges project_id, doc_id, releaseLock
  22. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  23. archiveDocChanges: (project_id, doc_id, callback)->
  24. MongoManager.getArchivedDocStatus doc_id, (error, result) ->
  25. return callback(error) if error?
  26. if result?.inS3 is true
  27. logger.log {project_id, doc_id}, "document history is already archived"
  28. return callback()
  29. if result?.inS3?
  30. logger.log {project_id, doc_id}, "document history archive is already in progress"
  31. return callback()
  32. MongoManager.getDocChangesCount doc_id, (error, count) ->
  33. return callback(error) if error?
  34. if count == 0
  35. logger.log {project_id, doc_id}, "document history is empty, not archiving"
  36. return callback()
  37. MongoManager.peekLastCompressedUpdate doc_id, (error, update, lastVersion) ->
  38. return callback(error) if error?
  39. logger.log {doc_id, project_id}, "archiving got last compressed update"
  40. MongoManager.markDocHistoryAsArchiveInProgress doc_id, lastVersion, (error) ->
  41. return callback(error) if error?
  42. logger.log {doc_id, project_id}, "marked doc history as archive in progress"
  43. MongoAWS.archiveDocHistory project_id, doc_id, update, (error) ->
  44. if error?
  45. logger.log {doc_id, project_id, error}, "error exporting document to S3"
  46. MongoManager.clearDocHistoryAsArchiveInProgress doc_id, update, (err) ->
  47. return callback(err) if err?
  48. logger.log {doc_id, project_id}, "cleared archive in progress flag"
  49. callback(error)
  50. else
  51. logger.log doc_id:doc_id, project_id:project_id, "exported document to S3"
  52. MongoManager.markDocHistoryAsArchived doc_id, lastVersion, (error) ->
  53. return callback(error) if error?
  54. logger.log {doc_id, project_id}, "marked doc history as archived"
  55. callback()
  56. unArchiveAllDocsChanges: (project_id, callback = (error, docs) ->) ->
  57. DocstoreHandler.getAllDocs project_id, (error, docs) ->
  58. if error?
  59. return callback(error)
  60. else if !docs?
  61. return callback new Error("No docs for project #{project_id}")
  62. jobs = _.map docs, (doc) ->
  63. (cb)-> DocArchiveManager.unArchiveDocChangesWithLock project_id, doc._id, cb
  64. async.parallelLimit jobs, 4, callback
  65. unArchiveDocChangesWithLock: (project_id, doc_id, callback = (error) ->) ->
  66. job = (releaseLock) ->
  67. DocArchiveManager.unArchiveDocChanges project_id, doc_id, releaseLock
  68. LockManager.runWithLock("HistoryLock:#{doc_id}", job, callback)
  69. unArchiveDocChanges: (project_id, doc_id, callback)->
  70. MongoManager.getArchivedDocStatus doc_id, (error, result) ->
  71. return callback(error) if error?
  72. if result?.inS3 isnt true
  73. logger.log {project_id, doc_id}, "no changes marked as in s3, not unarchiving"
  74. return callback()
  75. else
  76. MongoAWS.unArchiveDocHistory project_id, doc_id, (error) ->
  77. return callback(error) if error?
  78. logger.log doc_id:doc_id, project_id:project_id, "imported document from S3"
  79. MongoManager.markDocHistoryAsUnarchived doc_id, (error) ->
  80. return callback(error) if error?
  81. callback()