Skip to content

Commit

Permalink
launcher.connect now correctly raised only once when running multiple…
Browse files Browse the repository at this point in the history
… campaigns in parallel

In previous versions of attester, when starting multiple campaigns in
parallel, attester would start attester-launcher multiple times (once for
each campaign) or it would start more instances of phantomjs than the
configured number (it would be multiplied by the number of campaigns).
This commit fixes this issue by checking that only one launcher.connect
event is raised (after waiting for all configured campaigns to be
fully initialized).
  • Loading branch information
divdavem committed Sep 15, 2016
1 parent 3a019dc commit 7d5ba19
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 24 deletions.
33 changes: 18 additions & 15 deletions lib/attester/launcher.js
Expand Up @@ -48,7 +48,8 @@ var childProcesses = require("../util/child-processes.js");
* is always raised after server.attached and it always contains the slave URL
*/
var urlInfo = null;
var raiseOnAttached = false;
var connectRaised = false;
var expectedCampaigns = 0;

// Raise the connect event

Expand All @@ -58,25 +59,26 @@ function raiseConnect() {
});
}

function onServerAttached(event) {
urlInfo = event;
if (raiseOnAttached) {
function checkAndRaiseConnect() {
if (!connectRaised && expectedCampaigns === 0) {
connectRaised = true;
process.nextTick(raiseConnect);
}
}

function onTasksList(event) {
if (!urlInfo) {
// The server is not attached yet
raiseOnAttached = true;
} else {
process.nextTick(raiseConnect);
}
function onCampaignCreate() {
expectedCampaigns++;
}

function onServerAttached(event) {
urlInfo = event;
expectedCampaigns--;
checkAndRaiseConnect();
}

exports.__init__ = function () {
attester.event.once("attester.server.attached", onServerAttached);
attester.event.on("attester.campaign.tasksList", onTasksList);
attester.event.on("attester.server.attached", onServerAttached);
attester.event.on("campaign.create", onCampaignCreate);
phantomLauncher.__init__();
browserLauncher.__init__();
robotBrowserLauncher.__init__();
Expand All @@ -85,14 +87,15 @@ exports.__init__ = function () {

exports.__reset__ = function () {
urlInfo = null;
raiseOnAttached = false;
connectRaised = false;
expectedCampaigns = 0;

browserLauncher.__reset__();
phantomLauncher.__reset__();
robotBrowserLauncher.__reset__();
attesterLauncher.__reset__();
attester.event.off("attester.server.attached", onServerAttached);
attester.event.off("attester.campaign.tasksList", onTasksList);
attester.event.off("campaign.create", onCampaignCreate);

var initialProcesses = childProcesses.number();
if (initialProcesses > 0) {
Expand Down
55 changes: 46 additions & 9 deletions spec/launcher/eventOrder.spec.js
Expand Up @@ -18,25 +18,29 @@ var event = attester.event;

describe("order of events", function () {
var received;

var storeEvent = function (data) {
received.push([this.event, data.slaveURL || data]);
};

beforeEach(function () {
received = [];

var storeEvent = function (data) {
received.push([this.event, data.slaveURL || data]);
};

event.once("attester.server.attached", storeEvent);
event.once("launcher.connect", storeEvent);
event.on("attester.server.attached", storeEvent);
event.on("launcher.connect", storeEvent);
});

afterEach(function (done) {
event.off("attester.server.attached", storeEvent);
event.off("launcher.connect", storeEvent);

// Restore the launcher to the initial state
attester.launcher.__reset__().then(function () {
attester.launcher.__init__();
}).then(done);
attester.__reset__().then(done);
});

it("should respect ordered events", function (done) {
attester.config.set({});
attester.campaign.create({}, {}, 1);
event.emit("attester.server.attached", {
slaveURL: "abc"
});
Expand All @@ -54,6 +58,37 @@ describe("order of events", function () {
});

it("should invert the events", function (done) {
attester.config.set({});
attester.campaign.create({}, {}, 1);
event.emit("attester.campaign.tasksList");
process.nextTick(function () {
event.emit("attester.server.attached", {
slaveURL: "abc"
});

process.nextTick(function () {
expect(received).toEqual([
["attester.server.attached", "abc"],
["launcher.connect", "abc"]
]);
done();
});
});
});

it("should wait for all campaigns to be ready", function (done) {
attester.config.set({});
attester.campaign.create({}, {}, 1);
attester.campaign.create({}, {}, 2);
attester.campaign.create({}, {}, 3);
event.emit("attester.campaign.tasksList");
event.emit("attester.server.attached", {
slaveURL: "abc"
});
event.emit("attester.campaign.tasksList");
event.emit("attester.server.attached", {
slaveURL: "abc"
});
event.emit("attester.campaign.tasksList");
process.nextTick(function () {
event.emit("attester.server.attached", {
Expand All @@ -62,6 +97,8 @@ describe("order of events", function () {

process.nextTick(function () {
expect(received).toEqual([
["attester.server.attached", "abc"],
["attester.server.attached", "abc"],
["attester.server.attached", "abc"],
["launcher.connect", "abc"]
]);
Expand Down

0 comments on commit 7d5ba19

Please sign in to comment.