DispatchManager.coffee 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. module.exports = DispatchManager =
  8. createDispatcher: () ->
  9. client = redis.createClient(Settings.redis.web)
  10. worker = {
  11. client: client
  12. _waitForUpdateThenDispatchWorker: (callback = (error) ->) ->
  13. timer = new Metrics.Timer "worker.waiting"
  14. worker.client.blpop "pending-updates-list", 0, (error, result) ->
  15. timer.done()
  16. return callback(error) if error?
  17. return callback() if !result?
  18. [list_name, doc_key] = result
  19. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  20. # Dispatch this in the background
  21. UpdateManager.processOutstandingUpdatesWithLock project_id, doc_id, (error) ->
  22. logger.error err: error, project_id: project_id, doc_id: doc_id, "error processing update" if error?
  23. callback()
  24. run: () ->
  25. return if Settings.shuttingDown
  26. worker._waitForUpdateThenDispatchWorker (error) =>
  27. if error?
  28. logger.error err: error, "Error in worker process"
  29. throw error
  30. else
  31. worker.run()
  32. }
  33. return worker
  34. createAndStartDispatchers: (number) ->
  35. for i in [1..number]
  36. worker = DispatchManager.createDispatcher()
  37. worker.run()