|
@@ -20,13 +20,21 @@ const logger = require('logger-sharelatex')
|
|
|
const Keys = require('./UpdateKeys')
|
|
const Keys = require('./UpdateKeys')
|
|
|
const redis = require('@overleaf/redis-wrapper')
|
|
const redis = require('@overleaf/redis-wrapper')
|
|
|
const Errors = require('./Errors')
|
|
const Errors = require('./Errors')
|
|
|
|
|
+const _ = require('lodash')
|
|
|
|
|
|
|
|
const UpdateManager = require('./UpdateManager')
|
|
const UpdateManager = require('./UpdateManager')
|
|
|
const Metrics = require('./Metrics')
|
|
const Metrics = require('./Metrics')
|
|
|
const RateLimitManager = require('./RateLimitManager')
|
|
const RateLimitManager = require('./RateLimitManager')
|
|
|
|
|
|
|
|
module.exports = DispatchManager = {
|
|
module.exports = DispatchManager = {
|
|
|
- createDispatcher(RateLimiter) {
|
|
|
|
|
|
|
+ createDispatcher(RateLimiter, queueShardNumber) {
|
|
|
|
|
+ let pendingListKey
|
|
|
|
|
+ if (queueShardNumber === 0) {
|
|
|
|
|
+ pendingListKey = 'pending-updates-list'
|
|
|
|
|
+ } else {
|
|
|
|
|
+ pendingListKey = `pending-updates-list-${queueShardNumber}`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const client = redis.createClient(Settings.redis.documentupdater)
|
|
const client = redis.createClient(Settings.redis.documentupdater)
|
|
|
var worker = {
|
|
var worker = {
|
|
|
client,
|
|
client,
|
|
@@ -35,11 +43,8 @@ module.exports = DispatchManager = {
|
|
|
callback = function (error) {}
|
|
callback = function (error) {}
|
|
|
}
|
|
}
|
|
|
const timer = new Metrics.Timer('worker.waiting')
|
|
const timer = new Metrics.Timer('worker.waiting')
|
|
|
- return worker.client.blpop('pending-updates-list', 0, function (
|
|
|
|
|
- error,
|
|
|
|
|
- result
|
|
|
|
|
- ) {
|
|
|
|
|
- logger.log('getting pending-updates-list', error, result)
|
|
|
|
|
|
|
+ return worker.client.blpop(pendingListKey, 0, function (error, result) {
|
|
|
|
|
+ logger.log(`getting ${queueShardNumber}`, error, result)
|
|
|
timer.done()
|
|
timer.done()
|
|
|
if (error != null) {
|
|
if (error != null) {
|
|
|
return callback(error)
|
|
return callback(error)
|
|
@@ -103,15 +108,9 @@ module.exports = DispatchManager = {
|
|
|
createAndStartDispatchers(number) {
|
|
createAndStartDispatchers(number) {
|
|
|
const RateLimiter = new RateLimitManager(number)
|
|
const RateLimiter = new RateLimitManager(number)
|
|
|
return (() => {
|
|
return (() => {
|
|
|
- const result = []
|
|
|
|
|
- for (
|
|
|
|
|
- let i = 1, end = number, asc = end >= 1;
|
|
|
|
|
- asc ? i <= end : i >= end;
|
|
|
|
|
- asc ? i++ : i--
|
|
|
|
|
- ) {
|
|
|
|
|
- const worker = DispatchManager.createDispatcher(RateLimiter)
|
|
|
|
|
- result.push(worker.run())
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const result = _.times(number, function (shardNumber) {
|
|
|
|
|
+ return DispatchManager.createDispatcher(RateLimiter, shardNumber).run()
|
|
|
|
|
+ })
|
|
|
return result
|
|
return result
|
|
|
})()
|
|
})()
|
|
|
}
|
|
}
|