diff --git a/lib/gossip/damper.js b/lib/gossip/damper.js index c080e264..fd6391c1 100644 --- a/lib/gossip/damper.js +++ b/lib/gossip/damper.js @@ -53,13 +53,14 @@ function Damper(opts) { // removes them. this.dampedMembers = {}; // indexed by address - this.isDampTimerEnabled = false; // This damp timer runs only when there are flappy members // add to the flappers collection above. + this.isDampTimerEnabled = false; this.dampTimer = null; // The expiration timer runs only when there are damped members // in the dampedMembers collection above. + this.isExpirationTimerEnabled = false; this.expirationTimer = null; } @@ -161,7 +162,6 @@ Damper.prototype.addFlapper = function addFlapper(flapper) { }; Damper.prototype.dampMember = function dampMember(addr) { - var self = this; var member = this.ringpop.membership.findMemberByAddress(addr); if (!member) { @@ -187,22 +187,11 @@ Damper.prototype.dampMember = function dampMember(addr) { this.removeFlapper(member.address); this.addDampedMember(member.address); - if (!this.expirationTimer) { - scheduleExpiration(); - this.logger.info('ringpop started damped member expiration timer', { - local: this.ringpop.whoami() - }); + if (!this.isExpirationTimerEnabled) { + this._startExpirationTimer(); } return true; - - function scheduleExpiration() { - self.expirationTimer = - self.timers.setTimeout(function onTimeout() { - self.expireDampedMembers(); - scheduleExpiration(); - }, self.ringpop.config.get('dampedMemberExpirationInterval')); - } }; Damper.prototype.expireDampedMembers = function expireDampedMembers() { @@ -480,6 +469,31 @@ Damper.prototype._startDampTimer = function _startDampTimer() { } }; +Damper.prototype._startExpirationTimer = function _startExpirationTimer() { + var self = this; + + if (this.isExpirationTimerEnabled) { + this.logger.debug('ringpop damper expiration timer already started', { + local: this.ringpop.whoami() + }); + return; + } + + this.isExpirationTimerEnabled = true; + schedule(); + this.logger.debug('ringpop damper expiration timer started', { + local: this.ringpop.whoami() + }); + + function schedule() { + self.expirationTimer = + self.timers.setTimeout(function onTimeout() { + self.expireDampedMembers(); + if (self.isExpirationTimerEnabled) schedule(); + }, self.ringpop.config.get('dampedMemberExpirationInterval')); + } +}; + Damper.prototype._stopDampTimer = function _stopDampTimer() { if (!this.isDampTimerEnabled) { this.logger.debug('ringpop damper already stopped damp timer', { @@ -497,7 +511,7 @@ Damper.prototype._stopDampTimer = function _stopDampTimer() { }; Damper.prototype._stopExpirationTimer = function _stopExpirationTimer() { - if (!this.expirationTimer) { + if (!this.isExpirationTimerEnabled) { this.logger.debug('ringpop damper expiration timer already stopped', { local: this.ringpop.whoami() }); @@ -506,6 +520,7 @@ Damper.prototype._stopExpirationTimer = function _stopExpirationTimer() { this.timers.clearTimeout(this.expirationTimer); this.expirationTimer = null; + this.isExpirationTimerEnabled = false; this.logger.info('ringpop damper stopped expiration timer', { local: this.ringpop.whoami() });