X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=www%2Fserve-analysis.js;h=171ce82ac6b56d7ead0d6405ec07b41e580a4c64;hp=cc1d2dd4303bdf6e0eb9428ec5072ea81c962c42;hb=b76cf35e0e41f59faa3547652c060711ac6cf9fd;hpb=70bc196b94f2959ea9726f62019e5f0caa696eab diff --git a/www/serve-analysis.js b/www/serve-analysis.js index cc1d2dd..171ce82 100644 --- a/www/serve-analysis.js +++ b/www/serve-analysis.js @@ -11,13 +11,17 @@ var zlib = require('zlib'); var delta = require('./js/json_delta.js'); // Constants. -var json_filename = '/srv/analysis.sesse.net/www/analysis.json'; +var JSON_FILENAME = '/srv/analysis.sesse.net/www/analysis.json'; +var HISTORY_TO_KEEP = 5; + +// If set to 1, we are already processing a JSON update and should not +// start a new one. If set to 2, we are _also_ having one in the queue. +var json_lock = 0; // The current contents of the file to hand out, and its last modified time. var json = undefined; // The last five timestamps, and diffs from them to the latest version. -var history_to_keep = 5; var historic_json = []; var diff_json = {}; @@ -50,7 +54,7 @@ var replace_json = function(new_json_contents, mtime) { } if (!json.invalid_base) { historic_json.push(json); - if (historic_json.length > history_to_keep) { + if (historic_json.length > HISTORY_TO_KEEP) { historic_json.shift(); } } @@ -69,6 +73,7 @@ var replace_json = function(new_json_contents, mtime) { new_json.gzip = buffer; json = new_json; diff_json = new_diff_json; + json_lock = 0; // Finally, wake up any sleeping clients. possibly_wakeup_clients(); @@ -98,11 +103,22 @@ var create_json_historic_diff = function(new_json, history_left, new_diff_json, } var reread_file = function(event, filename) { - if (filename != path.basename(json_filename)) { + if (filename != path.basename(JSON_FILENAME)) { + return; + } + if (json_lock >= 2) { return; } - console.log("Rereading " + json_filename); - fs.open(json_filename, 'r+', function(err, fd) { + if (json_lock == 1) { + // Already processing; wait a bit. + json_lock = 2; + setTimeout(function() { json_lock = 1; reread_file(event, filename); }, 100); + return; + } + json_lock = 1; + + console.log("Rereading " + JSON_FILENAME); + fs.open(JSON_FILENAME, 'r+', function(err, fd) { if (err) throw err; fs.fstat(fd, function(err, st) { if (err) throw err; @@ -123,7 +139,7 @@ var reread_file = function(event, filename) { touch_timer = setTimeout(function() { console.log("Touching analysis.json due to no other activity"); var now = Date.now() / 1000; - fs.utimes(json_filename, now, now); + fs.utimes(JSON_FILENAME, now, now); }, 30000); } var possibly_wakeup_clients = function() { @@ -217,8 +233,8 @@ var count_viewers = function() { // Set up a watcher to catch changes to the file, then do an initial read // to make sure we have a copy. -fs.watch(path.dirname(json_filename), reread_file); -reread_file(null, path.basename(json_filename)); +fs.watch(path.dirname(JSON_FILENAME), reread_file); +reread_file(null, path.basename(JSON_FILENAME)); var server = http.createServer(); server.on('request', function(request, response) {