diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 7b53730ce6..8b3486dc0a 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -113,8 +113,8 @@ shutdownCleanly = (signal) -> forceDrain = -> logger.log {delay_ms:Settings.forceDrainMsDelay}, "starting force drain after timeout" setTimeout ()-> - logger.log "starting drain" - DrainManager.startDrain(io, 4) + logger.log "starting drain over #{Settings.shutdownDrainTimeWindow} mins" + DrainManager.startDrainTimeWindow(io, Settings.shutdownDrainTimeWindow) , Settings.forceDrainMsDelay shutDownInProgress = false diff --git a/services/real-time/app/coffee/DrainManager.coffee b/services/real-time/app/coffee/DrainManager.coffee index da6b331e23..a71ffa8ed9 100644 --- a/services/real-time/app/coffee/DrainManager.coffee +++ b/services/real-time/app/coffee/DrainManager.coffee @@ -1,6 +1,11 @@ logger = require "logger-sharelatex" -module.exports = +module.exports = DrainManager = + + startDrainTimeWindow: (io, minsToDrain)-> + drainPerMin = io.sockets.clients().length / minsToDrain + DrainManager.startDrain(io, drainPerMin / 60) + startDrain: (io, rate) -> # Clear out any old interval clearInterval @interval diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index a3128e84d1..b48de98981 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -50,6 +50,8 @@ settings = forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false + shutdownDrainTimeWindow: process.env['SHUTDOWN_DRAIN_TIME_WINDOW'] or 9 + continualPubsubTraffic: process.env['CONTINUAL_PUBSUB_TRAFFIC'] or false checkEventOrder: process.env['CHECK_EVENT_ORDER'] or false diff --git a/services/real-time/test/unit/coffee/DrainManagerTests.coffee b/services/real-time/test/unit/coffee/DrainManagerTests.coffee index b3cdaf1ca0..cd34aea4c4 100644 --- a/services/real-time/test/unit/coffee/DrainManagerTests.coffee +++ b/services/real-time/test/unit/coffee/DrainManagerTests.coffee @@ -12,6 +12,24 @@ describe "DrainManager", -> sockets: clients: sinon.stub() + describe "startDrainTimeWindow", -> + beforeEach -> + @clients = [] + for i in [0..1619] + @clients[i] = { + id: i + emit: sinon.stub() + } + @io.sockets.clients.returns @clients + @DrainManager.startDrain = sinon.stub() + + it "should set a drain rate fast enough", (done)-> + @DrainManager.startDrainTimeWindow(@io, 9) + console.log(@DrainManager.startDrain.args[0]) + @DrainManager.startDrain.calledWith(@io, 3).should.equal true + done() + + describe "reconnectNClients", -> beforeEach -> @clients = []