pack.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. #PackManager.deleteExpiredPackOps docs, (err) ->
  46. # return callback(err) if err?
  47. # callback err, docs
  48. safeInsert = (packObj, callback) ->
  49. if shutdownRequested
  50. return callback('shutdown')
  51. PackManager.insertPack packObj, (err, result) ->
  52. setTimeout () ->
  53. callback(err,result)
  54. , DB_WRITE_DELAY
  55. savePacks = (packs, callback) ->
  56. async.eachSeries packs, safeInsert, (err, result) ->
  57. if err?
  58. util.log "error writing packs"
  59. callback err, result
  60. else
  61. util.log "done writing packs"
  62. callback()
  63. readFile = (file, callback) ->
  64. ids = []
  65. lineReader.eachLine file, (line) ->
  66. result = line.match(/[0-9a-f]{24}/)
  67. if result?
  68. ids.push result[0]
  69. .then () ->
  70. callback(null, ids)
  71. todoFile = cli.args[1]
  72. doneFile = cli.args[2]
  73. util.log "reading from #{todoFile}"
  74. util.log "logging progress to #{doneFile}"
  75. fs.appendFileSync doneFile, '# starting pack run at ' + new Date() + '\n'
  76. shutdownRequested = false
  77. process.on 'SIGINT', () ->
  78. util.log "Gracefully shutting down from SIGINT"
  79. shutdownRequested = true
  80. readFile todoFile, (err, todo) ->
  81. readFile doneFile, (err, done) ->
  82. pending = _.difference todo, done
  83. async.eachSeries pending, (doc_id, callback) ->
  84. packDocHistory doc_id, (err, result) ->
  85. if err?
  86. console.log "ERROR:", err, result
  87. return callback(err)
  88. else if not options['dry-run']
  89. fs.appendFileSync doneFile, doc_id + '\n'
  90. if shutdownRequested
  91. return callback('shutdown')
  92. setTimeout () ->
  93. callback(err, result)
  94. , DOCUMENT_PACK_DELAY
  95. , (err, results) ->
  96. if err?
  97. console.log 'error:', err
  98. util.log 'closing db'
  99. db.close()