Skip to content
This repository was archived by the owner on Feb 18, 2021. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 76 additions & 42 deletions test/lib/test-cluster.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ var console = require('console');
var process = require('process');
var fs = require('fs');

var collectParallel = require('collect-parallel/array');
var CountedReadySignal = require('ready-signal/counted');
var EventEmitter = require('events').EventEmitter;
var tape = require('tape');
Expand Down Expand Up @@ -121,7 +122,8 @@ function TestCluster(opts) {
self.dummies = [];
// The hostPorts for each member of the ring.
self.hostPortList = [];
self.ringpopHosts = [];
self.ringpopHosts = self.hostPortList;

// Bob and Steve
self.remotes = {};
// Names of additional remotes (from opts.namedRemotes)
Expand All @@ -146,50 +148,23 @@ inherits(TestCluster, EventEmitter);
TestCluster.prototype.bootstrap = function bootstrap(cb) {
var self = this;

var ready = CountedReadySignal(self.size + self.dummySize);

ready(onReady);

// bob and steve

var i = 0;
for (i = 0; i < self.size; i++) {
self.apps[i] = self.createApplication('127.0.0.1:0', ready.signal);
}
for (i = 0; i < self.dummySize; i++) {
self.dummies[i] = self.createDummy(ready.signal);
}

function onReady() {
var ringpopBootstrapped = CountedReadySignal(self.size);

ringpopBootstrapped(onRingpopBootstrapped);

for (i = 0; i < self.apps.length; i++) {
self.hostPortList[i] = self.apps[i].hostPort;
}

self.ringpopHosts = self.hostPortList;
self.grow(self.size, onRingpopReady);

for (i = 0; i < self.apps.length; i++) {
self.apps[i].clients.autobahnHostPortList = self.hostPortList;
self.apps[i].clients.setupRingpop(bootstrapDone);
function onRingpopReady(err) {
if (err) {
cb(err);
return;
}

function bootstrapDone(err) {
if (err) {
return cb(err);
}

ringpopBootstrapped.signal();
// bob and steve
var ready = CountedReadySignal(self.dummySize);
ready(onReady);
for (var i = 0; i < self.dummySize; i++) {
self.dummies[i] = self.createDummy(ready.signal);
}
}

function onRingpopBootstrapped() {
self.waitForRingpop(onConvergence);
}

function onConvergence() {
function onReady() {
self.remotes.tcollector = self.createRemote({
serviceName: 'tcollector',
trace: false
Expand Down Expand Up @@ -218,7 +193,7 @@ TestCluster.prototype.bootstrap = function bootstrap(cb) {
traceSample: 1
}, remotesDone.signal);

for (i = 0; i < self.namedRemotesConfig.length; i++) {
for (var i = 0; i < self.namedRemotesConfig.length; i++) {
var serviceName = self.namedRemotesConfig[i];
self.namedRemotes[i] = self.createRemote({
serviceName: serviceName,
Expand All @@ -235,6 +210,66 @@ TestCluster.prototype.bootstrap = function bootstrap(cb) {
}
};

TestCluster.prototype.grow =
function grow(n, callback) {
var self = this;

var newApps = createApps();

collectParallel(newApps, partialBootstrapEach, partialBootstrapsDone);

function createApps() {
var apps = [];
var i = self.apps.length;
var j = 0;
for (; j < n; i++, j++) {
var app = self.createApplication('127.0.0.1:0');
app.clusterAppsIndex = i;
self.apps[i] = app;
apps.push(app);
}
return apps;
}

function partialBootstrapEach(app, _, done) {
app.partialBootstrap(function bootstrapped(err) {
if (err) {
done(err);
return;
}
self.hostPortList[app.clusterAppsIndex] = app.hostPort;
done(null);
});
}

function partialBootstrapsDone(_, results) {
for (var i = 0; i < results.length; i++) {
var res = results[i];
if (res.err) {
callback(res.err);
return;
}
}
collectParallel(newApps, finishEachBootstrap, bootstrapFinished);
}

function finishEachBootstrap(app, _, done) {
app.clients.autobahnHostPortList = self.hostPortList;
app.clients.setupRingpop(done);
}

function bootstrapFinished(_, results) {
for (var i = 0; i < results.length; i++) {
var res = results[i];
if (res.err) {
callback(res.err);
return;
}
}
self.waitForRingpop(callback);
}
};

TestCluster.prototype.createRemote = function createRemote(opts, cb) {
var self = this;
var serverChannel;
Expand Down Expand Up @@ -430,7 +465,7 @@ TestCluster.prototype.close = function close(cb) {
};

TestCluster.prototype.createApplication =
function createApplication(hostPort, cb) {
function createApplication(hostPort) {
var self = this;
var parts = hostPort.split(':');
var host = parts[0];
Expand Down Expand Up @@ -477,7 +512,6 @@ function createApplication(hostPort, cb) {
// TODO add timeout to gaurd against this edge case
var app = TestApplication(localOpts);
app.remoteConfigFile = remoteConfigFile;
app.partialBootstrap(cb);
return app;
};

Expand Down