From 24cea1011d8fef8d9d0ab032cf879ba41942daa3 Mon Sep 17 00:00:00 2001 From: Jeff Wolski Date: Sun, 21 Jun 2015 12:30:28 -0700 Subject: [PATCH] Have dissemination component subscribe to ringChanged to reduce times piggyback count adjustment is evaluated --- lib/dissemination.js | 23 ++++++++++++++--- lib/membership.js | 1 - test/{index_test.js => index-test.js} | 37 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-) rename test/{index_test.js => index-test.js} (91%) diff --git a/lib/dissemination.js b/lib/dissemination.js index 3b9b9b26..3202960b 100644 --- a/lib/dissemination.js +++ b/lib/dissemination.js @@ -17,20 +17,24 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. - 'use strict'; +var EventEmitter = require('events').EventEmitter; +var util = require('util'); + var LOG_10 = Math.log(10); function Dissemination(ringpop) { this.ringpop = ringpop; - this.ringpop.on('changed', this.onRingChanged.bind(this)); + this.ringpop.on('ringChanged', this.onRingChanged.bind(this)); this.changes = {}; - this.maxPiggybackCount = 1; - this.piggybackFactor = 15; // A lower piggyback factor leads to more full-syncs + this.maxPiggybackCount = Dissemination.Defaults.maxPiggybackCount; + this.piggybackFactor = Dissemination.Defaults.piggybackFactor; } +util.inherits(Dissemination, EventEmitter); + Dissemination.prototype.adjustMaxPiggybackCount = function adjustMaxPiggybackCount() { var serverCount = this.ringpop.ring.getServerCount(); var prevPiggybackCount = this.maxPiggybackCount; @@ -45,6 +49,8 @@ Dissemination.prototype.adjustMaxPiggybackCount = function adjustMaxPiggybackCou piggybackFactor: this.piggybackFactor, serverCount: serverCount }); + + this.emit('maxPiggybackCountAdjusted'); } }; @@ -126,4 +132,13 @@ Dissemination.prototype.recordChange = function recordChange(change) { this.changes[change.address] = change; }; +Dissemination.prototype.resetMaxPiggybackCount = function resetMaxPiggybackCount() { + this.maxPiggybackCount = Dissemination.Defaults.maxPiggybackCount; +}; + +Dissemination.Defaults = { + maxPiggybackCount: 1, + piggybackFactor: 15 // A lower piggyback factor leads to more full-syncs +}; + module.exports = Dissemination; diff --git a/lib/membership.js b/lib/membership.js index 7ef821c5..5333dcee 100644 --- a/lib/membership.js +++ b/lib/membership.js @@ -17,7 +17,6 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. - 'use strict'; var _ = require('underscore'); diff --git a/test/index_test.js b/test/index-test.js similarity index 91% rename from test/index_test.js rename to test/index-test.js index be19d5e5..a91d3a6e 100644 --- a/test/index_test.js +++ b/test/index-test.js @@ -24,6 +24,7 @@ var recvAdminLeave = require('../lib/admin-leave-recvr.js'); var recvJoin = require('../lib/swim/join-recvr.js'); var Ringpop = require('../index.js'); var test = require('tape'); +var testRingpop = require('./lib/test-ringpop.js'); function createRingpop(opts) { return new Ringpop(_.extend({ @@ -406,6 +407,42 @@ test('emits ring changed event', function t(assert) { assert.end(); }); +testRingpop('max piggyback not adjusted on membership update', function t(deps, assert) { + assert.plan(0); + + var dissemination = deps.dissemination; + var membership = deps.membership; + + dissemination.on('maxPiggybackCountAdjusted', function onAdjusted() { + assert.fail('max piggyback count was adjusted'); + }); + + // Reset count to prove that it goes unmodified. + dissemination.resetMaxPiggybackCount(); + + var address = '127.0.0.1:3002'; + var incarnationNumber = Date.now(); + membership.makeSuspect(address, incarnationNumber); +}); + +testRingpop('max piggyback adjusted on new members', function t(deps, assert) { + assert.plan(1); + + var dissemination = deps.dissemination; + var membership = deps.membership; + + dissemination.on('maxPiggybackCountAdjusted', function onAdjusted() { + assert.pass('max piggyback count was adjusted'); + }); + + // Reset count to prove that it is modified. + dissemination.resetMaxPiggybackCount(); + + var address = '127.0.0.1:3002'; + var incarnationNumber = Date.now(); + membership.makeAlive(address, incarnationNumber); +}); + test('first time member, not alive', function t(assert) { var ringpop = createRingpop(); ringpop.membership.makeAlive(ringpop.whoami(), Date.now());