Skip to content

Commit

Permalink
Exchange checksums in join response for higher performance join respo…
Browse files Browse the repository at this point in the history
…nse merging
  • Loading branch information
jwolski committed Jul 1, 2015
1 parent 00e6533 commit d4f2a21
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
18 changes: 14 additions & 4 deletions benchmarks/join-response-merge.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ function reportPerformance(event) {
console.log(event.target.toString());
}

function benchMerge() {
function benchMerge(title, checksum) {
var responses = [];

var suite = new Suite();
suite.add('merge 3 responses of 1000 members', benchThis);
suite.add(title, benchThis);
suite.on('start', init);
suite.on('cycle', reportPerformance);
suite.run();
Expand All @@ -45,10 +45,20 @@ function benchMerge() {

for (var i = 0; i < 3; i++) {
responses.push({
members: members1k
members: members1k,
checksum: checksum
});
}
}
}

benchMerge();
function benchMergeNoChecksum() {
benchMerge('merge 3 responses of 1000 members with no checksum');
}

function benchMergeSameChecksum() {
benchMerge('merge 3 responses of 1000 members with same checksum', 123456789);
}

benchMergeNoChecksum();
benchMergeSameChecksum();
3 changes: 2 additions & 1 deletion lib/swim/join-recvr.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ module.exports = function recvJoin(opts, callback) {
callback(null, {
app: ringpop.app,
coordinator: ringpop.whoami(),
membership: ringpop.dissemination.fullSync()
membership: ringpop.dissemination.fullSync(),
membershipChecksum: ringpop.membership.checksum
});
};
20 changes: 20 additions & 0 deletions lib/swim/join-response-merge.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,31 @@
// THE SOFTWARE.
'use strict';

function hasSameChecksums(joinResponses) {
var lastChecksum = -1;

for (var i = 0; i < joinResponses.length; i++) {
var response = joinResponses[i];

if (!response.checksum || (lastChecksum !== -1 && lastChecksum !== response.checksum)) {
return false;
}

lastChecksum = response.checksum;
}

return true;
}

function mergeJoinResponses(joinResponses) {
if (!Array.isArray(joinResponses) || joinResponses.length === 0) {
return [];
}

if (hasSameChecksums(joinResponses)) {
return joinResponses[0].members;
}

var mergeIndex = {};

for (var i = 0; i < joinResponses.length; i++) {
Expand Down

0 comments on commit d4f2a21

Please sign in to comment.