overleaf/services/real-time/app/coffee/DrainManager.coffee

43 lines
1.3 KiB
CoffeeScript
Raw Normal View History

logger = require "logger-sharelatex"
module.exports = DrainManager =
startDrainTimeWindow: (io, minsToDrain)->
drainPerMin = io.sockets.clients().length / minsToDrain
2019-08-13 15:15:30 +00:00
DrainManager.startDrain(io, Math.max(drainPerMin / 60, 4)) # enforce minimum drain rate
startDrain: (io, rate) ->
# Clear out any old interval
clearInterval @interval
2019-08-15 13:41:22 +00:00
logger.log rate: rate, "starting drain"
if rate == 0
return
2019-05-24 14:23:01 +00:00
else if rate < 1
# allow lower drain rates
# e.g. rate=0.1 will drain one client every 10 seconds
pollingInterval = 1000 / rate
rate = 1
else
pollingInterval = 1000
@interval = setInterval () =>
@reconnectNClients(io, rate)
2019-05-24 14:23:01 +00:00
, pollingInterval
RECONNECTED_CLIENTS: {}
reconnectNClients: (io, N) ->
drainedCount = 0
for client in io.sockets.clients()
if !@RECONNECTED_CLIENTS[client.id]
@RECONNECTED_CLIENTS[client.id] = true
logger.log {client_id: client.id}, "Asking client to reconnect gracefully"
try
client.emit "reconnectGracefully"
catch err
logger.warn client_id: client.id, err: err, "error asking client to reconnect gracefully"
drainedCount++
haveDrainedNClients = (drainedCount == N)
if haveDrainedNClients
break
if drainedCount < N
logger.log "All clients have been told to reconnectGracefully"