pack.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. Settings = require "settings-sharelatex"
  2. fs = require("fs")
  3. {db, ObjectId} = require "./app/coffee/mongojs"
  4. async = require("async")
  5. BSON=db.bson.BSON
  6. util = require 'util'
  7. _ = require 'underscore'
  8. PackManager = require "./app/coffee/PackManager.coffee"
  9. lineReader = require "line-reader"
  10. cli = require "cli"
  11. options = cli.parse {
  12. 'dry-run': ['n', 'do not write to database'],
  13. 'fast': [false, 'no delays on writes']
  14. }
  15. DB_WRITE_DELAY = if options.fast then 0 else 2000
  16. DOCUMENT_PACK_DELAY = if options.fast then 0 else 1000
  17. packDocHistory = (doc_id, callback) ->
  18. util.log "starting pack operation for #{doc_id}"
  19. getDocHistory doc_id, (err, docs) ->
  20. return callback(err) if err?
  21. origDocs = docs.length
  22. PackManager.convertDocsToPacks docs, (err, packs) ->
  23. return callback(err) if err?
  24. util.log "docs #{origDocs} packs #{packs.length}"
  25. if packs.length
  26. if options['dry-run']
  27. util.log 'dry-run, skipping write packs'
  28. return callback()
  29. savePacks packs, (err) ->
  30. return callback(err) if err?
  31. # check the history again
  32. getDocHistory doc_id, callback
  33. else
  34. util.log "no packs to write"
  35. callback null, null
  36. # retrieve document ops/packs and check them
  37. getDocHistory = (doc_id, callback) ->
  38. db.docHistory.find({doc_id:ObjectId(doc_id)}).sort {v:1}, (err, docs) ->
  39. return callback(err) if err?
  40. # for safety, do a consistency check of the history
  41. util.log "checking history for #{doc_id}"
  42. PackManager.checkHistory docs, (err) ->
  43. return callback(err) if err?
  44. callback err, docs
  45. safeInsert = (packObj, callback) ->
  46. if shutdownRequested
  47. return callback('shutdown')
  48. PackManager.insertPack packObj, (err, result) ->
  49. setTimeout () ->
  50. callback(err,result)
  51. , DB_WRITE_DELAY
  52. savePacks = (packs, callback) ->
  53. async.eachSeries packs, safeInsert, (err, result) ->
  54. if err?
  55. util.log "error writing packs"
  56. callback err, result
  57. else
  58. util.log "done writing packs"
  59. callback()
  60. readFile = (file, callback) ->
  61. ids = []
  62. lineReader.eachLine file, (line) ->
  63. result = line.match(/[0-9a-f]{24}/)
  64. if result?
  65. ids.push result[0]
  66. .then () ->
  67. callback(null, ids)
  68. todoFile = cli.args[1]
  69. doneFile = cli.args[2]
  70. util.log "reading from #{todoFile}"
  71. util.log "logging progress to #{doneFile}"
  72. fs.appendFileSync doneFile, '# starting pack run at ' + new Date() + '\n'
  73. shutdownRequested = false
  74. process.on 'SIGINT', () ->
  75. util.log "Gracefully shutting down from SIGINT"
  76. shutdownRequested = true
  77. readFile todoFile, (err, todo) ->
  78. readFile doneFile, (err, done) ->
  79. pending = _.difference todo, done
  80. async.eachSeries pending, (doc_id, callback) ->
  81. packDocHistory doc_id, (err, result) ->
  82. if err?
  83. console.log "ERROR:", err, result
  84. return callback(err)
  85. else if not options['dry-run']
  86. fs.appendFileSync doneFile, doc_id + '\n'
  87. if shutdownRequested
  88. return callback('shutdown')
  89. setTimeout () ->
  90. callback(err, result)
  91. , DOCUMENT_PACK_DELAY
  92. , (err, results) ->
  93. if err?
  94. console.log 'error:', err
  95. util.log 'closing db'
  96. db.close()