Skip to content

Commit

Permalink
[fix] Attempt to listen again if EADDRINUSE in forever.Worker
Browse files Browse the repository at this point in the history
  • Loading branch information
indexzero committed Jan 6, 2012
1 parent d711ab8 commit a987826
Showing 1 changed file with 44 additions and 15 deletions.
59 changes: 44 additions & 15 deletions lib/forever/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,23 @@ var Worker = exports.Worker = function (options) {
utile.inherits(Worker, events.EventEmitter);

Worker.prototype.start = function (callback) {
var self = this;
var self = this,
err;

if (this._socket) throw new Error("Can't start already started worker");

self._socket = nssocket.createServer(function (socket) {
if (this._socket) {
err = new Error("Can't start already started worker");
if (callback) {
return callback(err);
}

throw err;
}

//
// Defines a simple `nssocket` protocol for communication
// with a parent process.
//
function workerProtocol(socket) {
socket.data(['ping'], function () {
socket.send(['pong']);
});
Expand All @@ -56,7 +68,7 @@ Worker.prototype.start = function (callback) {
return socket.send(['spawn', 'error'], { error: new Error('No script given') });
}

if (this.monitor) {
if (self.monitor) {
return socket.send(['spawn', 'error'], { error: new Error("Already running") });
}

Expand Down Expand Up @@ -84,23 +96,40 @@ Worker.prototype.start = function (callback) {

self.monitor.restart();
});
});
}

findSocket(self.sockPath, function (err, sock) {
if (err) {
return callback && callback(err);
}

self._sockFile = sock;
self._socket.listen(sock, function () {
function findAndStart() {
self._socket = nssocket.createServer(workerProtocol);
self._socket.on('listening', function () {
//
// `listening` listener doesn't take error as the first parameter
//
self.emit('start');
callback && callback(null, sock);
callback && callback(null, self._sockFile);
});
});

self._socket.on('error', function (err) {
if (err.code === 'EADDRINUSE') {
return findAndStart();
}

callback && callback(err);
});

findSocket(self.sockPath, function (err, sock) {
if (err) {
return callback && callback(err);
}

self._sockFile = sock;
self._socket.listen(sock);
});
}

//
// Attempt to start the server the first time
//
findAndStart();
return this;
};

0 comments on commit a987826

Please sign in to comment.