TpdsWorker.coffee 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. async = require('async')
  2. request = require('request')
  3. keys = require('./app/js/infrastructure/Keys')
  4. settings = require('settings-sharelatex')
  5. logger = require('logger-sharelatex')
  6. _ = require('underscore')
  7. childProcess = require("child_process")
  8. metrics = require("./app/js/infrastructure/Metrics")
  9. fiveMinutes = 5 * 60 * 1000
  10. processingFuncs =
  11. sendDoc : (options, callback)->
  12. if !options.docLines? || options.docLines.length == 0
  13. logger.err options:options, "doc lines not added to options for processing"
  14. return callback()
  15. docLines = options.docLines.reduce (singleLine, line)-> "#{singleLine}\n#{line}"
  16. post = request(options)
  17. post.on 'error', (err)->
  18. if err?
  19. callback(err)
  20. else
  21. callback()
  22. post.on 'end', callback
  23. post.write(docLines, 'utf-8')
  24. standardHttpRequest: (options, callback)->
  25. request options, (err, reponse, body)->
  26. if err?
  27. callback(err)
  28. else
  29. callback()
  30. pipeStreamFrom: (options, _callback)->
  31. callback = (args...) ->
  32. _callback(args...)
  33. _callback = () ->
  34. if options.filePath == "/droppy/main.tex"
  35. request options.streamOrigin, (err,res, body)->
  36. logger.log options:options, body:body
  37. origin = request(options.streamOrigin)
  38. cancelled = false
  39. gotResponse = false
  40. origin.on 'response', (res) ->
  41. return if cancelled
  42. gotResponse = true
  43. if 200 <= res.statusCode < 300
  44. dest = request(options)
  45. origin.pipe(dest)
  46. dest.on "error", (err)->
  47. logger.error err:err, options:options, "something went wrong in pipeStreamFrom dest"
  48. callback(err)
  49. dest.on 'end', callback
  50. else
  51. error = new Error("received non-success status code: #{res.statusCode}")
  52. logger.error err: error, options: options, "something went wrong connecting to origin"
  53. callback(error)
  54. origin.on 'error', (err)->
  55. return if cancelled
  56. gotResponse = true
  57. logger.error err:err, options:options, "something went wrong in pipeStreamFrom origin"
  58. callback(err)
  59. setTimeout () ->
  60. return if gotResponse
  61. cancelled = true
  62. error = new Error("timeout")
  63. logger.error err: error, options: options, "timeout"
  64. callback(error)
  65. , 2000
  66. workerRegistration = (groupKey, method, options, callback)->
  67. callback = _.once callback
  68. setTimeout callback, fiveMinutes
  69. metrics.inc "tpds-worker-processing"
  70. logger.log groupKey:groupKey, method:method, options:options, "processing http request from queue"
  71. processingFuncs[method] options, (err)->
  72. if err?
  73. logger.err err:err, user_id:groupKey, method:method, options:options, "something went wrong processing tpdsUpdateSender update"
  74. return callback("skip-after-retry")
  75. callback()
  76. setupWebToTpdsWorkers = (queueName)->
  77. logger.log worker_count:worker_count, queueName:queueName, "fairy workers"
  78. worker_count = 4
  79. while worker_count-- > 0
  80. workerQueueRef = require('fairy').connect(settings.redis.fairy).queue(queueName)
  81. workerQueueRef.polling_interval = 100
  82. workerQueueRef.regist workerRegistration
  83. cleanupPreviousQueues = (queueName, callback)->
  84. #cleanup queues then setup workers
  85. fairy = require('fairy').connect(settings.redis.fairy)
  86. queuePrefix = "FAIRY:QUEUED:#{queueName}:"
  87. fairy.redis.keys "#{queuePrefix}*", (err, keys)->
  88. logger.log "#{keys.length} fairy queues need cleanup"
  89. queueNames = keys.map (key)->
  90. key.replace queuePrefix, ""
  91. cleanupJobs = queueNames.map (projectQueueName)->
  92. return (cb)->
  93. cleanup = childProcess.fork(__dirname + '/cleanup.js', [queueName, projectQueueName])
  94. cleanup.on 'exit', cb
  95. async.series cleanupJobs, callback
  96. cleanupPreviousQueues keys.queue.web_to_tpds_http_requests, ->
  97. setupWebToTpdsWorkers keys.queue.web_to_tpds_http_requests
  98. cleanupPreviousQueues keys.queue.tpds_to_web_http_requests, ->
  99. setupWebToTpdsWorkers keys.queue.tpds_to_web_http_requests