diff --git a/app.js b/app.js index 39230f7..561796e 100644 --- a/app.js +++ b/app.js @@ -185,6 +185,21 @@ var latencyTimeout = setInterval( function () client.write({ action: 'client-ping' }); }, 5000); + +// Cleanup old inactive nodes +var nodeCleanupTimeout = setInterval( function () +{ + client.write({ + action: 'init', + data: Nodes.all() + }); + + client.write({ + action: 'charts', + data: Nodes.getCharts() + }); +}, 1000*60*60); + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); diff --git a/models/collection.js b/models/collection.js index 180f73f..e667bff 100644 --- a/models/collection.js +++ b/models/collection.js @@ -115,9 +115,34 @@ Collection.prototype.getNodeOrNew = function(search, data) Collection.prototype.all = function() { + this.removeOldNodes(); + return this._items; } +Collection.prototype.removeOldNodes = function() +{ + var deleteList = [] + + for(var i = this._items.length - 1; i >= 0; i--) + { + var node = this._items[i]; + + if( node.isInactiveAndOld() ) + { + deleteList.push(i); + } + } + + if(deleteList.length > 0) + { + for(var i = 0; i < deleteList.length; i++) + { + this._items.splice(deleteList[i], 1); + } + } +} + Collection.prototype.blockPropagationChart = function() { return this._blockchain.getBlockPropagation(); diff --git a/models/node.js b/models/node.js index 1de6db9..96a9ae1 100644 --- a/models/node.js +++ b/models/node.js @@ -2,6 +2,7 @@ var geoip = require('geoip-lite'); var _ = require('lodash'); var MAX_HISTORY = 40; +var MAX_INACTIVE_TIME = 1000*60*60*4; var Node = function Node(data) { @@ -180,4 +181,20 @@ Node.prototype.canUpdate = function() return this.info.canUpdateHistory || false; } +Node.prototype.isInactiveAndOld = function() +{ + if(this.stats.active) + return false; + + var lastState = this.uptime.history[this.uptime.history.length -1]; + + if( !_.isUndefined(lastState) && !_.isUndefined(lastState.status) && !_.isUndefined(lastState.time) ) + { + if( lastState.status === 'down' && (_.now() - lastState.time) > MAX_INACTIVE_TIME ) + return true; + } + + return false; +} + module.exports = Node;