From d608cd806b72c1626692836280fde1a06ab62b95 Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Mon, 16 Jan 2012 18:49:50 -0500 Subject: [PATCH] destroy old games, and max out at 50 concurrent --- server.coffee | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/server.coffee b/server.coffee index 211ac7d..3c370e7 100644 --- a/server.coffee +++ b/server.coffee @@ -25,10 +25,43 @@ coffee = require 'coffee-script' model = require './common.coffee' games = {} +max_concurrent_games = 50 +max_game_idle = 2 * 60 * 60 * 1000 # two hours (in miliseconds) # timeout function with args in convenient order timeout = (ms, func) -> setTimeout func, ms +now_s = -> + d = new Date() + return d.getTime() + +expire_old_games = -> + count = 0 + for slug, g of games + count += 1 + oldest_slug = slug + oldest_seen = g.last_seen + + return unless count > 0 + + # check all the games + # track oldest + # delete old ones + too_old = now_s() - max_game_idle + kills = [] + for slug, g of games + if g.last_seen < oldest_seen + oldest_seen = g.last_seen + oldest_slug = slug + if g.last_seen < too_old + kills.push slug + if count > max_concurrent_games and kills.length is 0 + console.log "hit max_concurrent_games, destroying oldest" + kills.push oldest_slug + for slug in kills + console.log "killing game #{slug}" + delete games[slug] + css_handler = (args, out, request, url_parts) -> fs.readFile 'style.less', 'utf8', (err, data) -> if err @@ -153,6 +186,9 @@ set_handler = (args, out, request, url_parts) -> out.end '{"status":6,"text_status":"Game already exists"}' return game = games[slug] = new_game slug, 'server' + game.last_seen = now_s() + console.log "new game: #{slug}" + expire_old_games() unless games[args.game]? out.writeHead 404, "Content-Type": 'text/plain' @@ -161,6 +197,8 @@ set_handler = (args, out, request, url_parts) -> game = games[args.game] + game.last_seen = now_s() + game.process_messages messages out.writeHead 200, "Content-Type": 'text/plain' @@ -263,5 +301,7 @@ http_server = http.createServer (req, res) -> return html_handler url_parts.query, res, req, url_parts +setInterval expire_old_games, 2 * 60 * 1000 # check every 2 minutes for expired games + http_server.listen listen_port, "127.0.0.1" console.log "Server running at http://127.0.0.1:#{listen_port}/" -- 1.7.10.4