PackWorker.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. async = require "async"
  2. _ = require "underscore"
  3. {db, ObjectId} = require "./mongojs"
  4. BSON=db.bson.BSON
  5. logger = require "logger-sharelatex"
  6. logger.initialize("track-changes-packworker")
  7. LockManager = require "./LockManager"
  8. PackManager = require "./PackManager"
  9. # this worker script is forked by the main process to look for
  10. # document histories which can be packed
  11. LIMIT = Number(process.argv[2]) || 1000
  12. DOCUMENT_PACK_DELAY = Number(process.argv[3]) || 1000
  13. TIMEOUT = Number(process.argv[4]) || 30*60*1000
  14. shutDownRequested = false
  15. setTimeout () ->
  16. logger.log "pack timed out, requesting shutdown"
  17. # start the shutdown on the next pack
  18. shutDownRequested = true
  19. # do a hard shutdown after a further 5 minutes
  20. setTimeout () ->
  21. logger.error "HARD TIMEOUT in pack worker"
  22. process.exit()
  23. , 5*60*1000
  24. , TIMEOUT
  25. logger.log "checking for updates, limit=#{LIMIT}, delay=#{DOCUMENT_PACK_DELAY}, timeout=#{TIMEOUT}"
  26. finish = () ->
  27. logger.log 'closing db'
  28. db.close () ->
  29. logger.log 'exiting from pack worker'
  30. process.exit()
  31. processUpdates = (pending) ->
  32. async.eachSeries pending, (doc_id, callback) ->
  33. PackManager.packDocHistory doc_id, (err, result) ->
  34. if err?
  35. logger.error {err, result}, "error in pack worker"
  36. return callback(err)
  37. if shutDownRequested
  38. logger.error "shutting down pack worker"
  39. return callback(new Error("shutdown"))
  40. setTimeout () ->
  41. callback(err, result)
  42. , DOCUMENT_PACK_DELAY
  43. , (err, results) ->
  44. if err? and err.message != "shutdown"
  45. logger.error {err}, 'error in pack worker processUpdates'
  46. finish()
  47. # find the documents which can be packed, by checking the number of
  48. # unpacked updates in the docHistoryStats collection
  49. db.docHistoryStats.find({
  50. update_count: {$gt : PackManager.MIN_COUNT}
  51. }).sort({
  52. update_count:-1
  53. }).limit LIMIT, (err, results) ->
  54. if err?
  55. logger.log {err}, 'error checking for updates'
  56. finish()
  57. return
  58. results = _.filter results, (doc) ->
  59. if doc.last_checked? and doc.last_checked > doc.last_update
  60. # skip documents which don't have any updates since last check
  61. return false
  62. else if doc.last_packed? and doc.last_packed > doc.last_update
  63. # skip documents which don't have any updates since last pack
  64. return false
  65. else
  66. return true
  67. pending = _.pluck results, 'doc_id'
  68. logger.log "found #{pending.length} documents to pack"
  69. processUpdates pending