DispatchManager.coffee 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. Settings = require('settings-sharelatex')
  2. logger = require('logger-sharelatex')
  3. Keys = require('./UpdateKeys')
  4. redis = require("redis-sharelatex")
  5. UpdateManager = require('./UpdateManager')
  6. Metrics = require('./Metrics')
  7. RateLimitManager = require('./RateLimitManager')
  8. module.exports = DispatchManager =
  9. createDispatcher: (RateLimiter) ->
  10. client = redis.createClient(Settings.redis.realtime)
  11. worker = {
  12. client: client
  13. _waitForUpdateThenDispatchWorker: (callback = (error) ->) ->
  14. timer = new Metrics.Timer "worker.waiting"
  15. worker.client.blpop "pending-updates-list", 0, (error, result) ->
  16. timer.done()
  17. return callback(error) if error?
  18. return callback() if !result?
  19. [list_name, doc_key] = result
  20. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  21. # Dispatch this in the background
  22. backgroundTask = (cb) ->
  23. UpdateManager.processOutstandingUpdatesWithLock project_id, doc_id, (error) ->
  24. logger.error err: error, project_id: project_id, doc_id: doc_id, "error processing update" if error?
  25. cb()
  26. RateLimiter.run backgroundTask, callback
  27. run: () ->
  28. return if Settings.shuttingDown
  29. worker._waitForUpdateThenDispatchWorker (error) =>
  30. if error?
  31. logger.error err: error, "Error in worker process"
  32. throw error
  33. else
  34. worker.run()
  35. }
  36. return worker
  37. createAndStartDispatchers: (number) ->
  38. RateLimiter = new RateLimitManager(number)
  39. for i in [1..number]
  40. worker = DispatchManager.createDispatcher(RateLimiter)
  41. worker.run()