From 3deb423c55b355e7f413a235064567a374f88a67 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 10 Dec 2014 19:44:27 -0500 Subject: [PATCH] testing socket availability before attempting to bind --- loader.js | 8 ++++++-- src/webserver.js | 52 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/loader.js b/loader.js index 4345624e4f..7ec647bd22 100644 --- a/loader.js +++ b/loader.js @@ -220,11 +220,15 @@ function killWorkers() { }); } -Loader.notifyWorkers = function (msg, worker_pid) { +Loader.notifyWorkers = function(msg, worker_pid) { worker_pid = parseInt(worker_pid, 10); workers.forEach(function(worker) { if (parseInt(worker.pid, 10) !== worker_pid) { - worker.send(msg); + try { + worker.send(msg); + } catch (e) { + console.log('[cluster/notifyWorkers] Failed to reach pid ' + worker_pid); + } } }); }; diff --git a/src/webserver.js b/src/webserver.js index fd7cc5e473..8d905b99b6 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -18,7 +18,8 @@ var path = require('path'), routes = require('./routes'), emitter = require('./emitter'), - helpers = require('./../public/src/helpers')(); + helpers = require('./../public/src/helpers')(), + net; if(nconf.get('ssl')) { server = require('https').createServer({ @@ -104,14 +105,9 @@ if(nconf.get('ssl')) { bind_address = ((nconf.get('bind_address') === "0.0.0.0" || !nconf.get('bind_address')) ? '0.0.0.0' : nconf.get('bind_address')) + ':' + port, oldUmask; - // Alter umask if necessary - if (isSocket) { - oldUmask = process.umask('0000'); - } - args.push(function(err) { if (err) { - winston.info('NodeBB was unable to listen on: ' + bind_address); + winston.info('[startup] NodeBB was unable to listen on: ' + bind_address); return callback(err); } @@ -123,7 +119,47 @@ if(nconf.get('ssl')) { callback(); }); - server.listen.apply(server, args); + // Alter umask if necessary + if (isSocket) { + oldUmask = process.umask('0000'); + net = require('net'); + module.exports.testSocket(port, function(err) { + if (!err) { + server.listen.apply(server, args); + } else { + winston.error('[startup] NodeBB was unable to secure domain socket access (' + port + ')'); + winston.error('[startup] ' + err.message); + process.exit(); + } + }); + } else { + server.listen.apply(server, args); + } + }; + + module.exports.testSocket = function(socketPath, callback) { + async.series([ + function(next) { + fs.exists(socketPath, function(exists) { + if (exists) { + next(); + } else { + callback(); + } + }); + }, + function(next) { + var testSocket = new net.Socket(); + testSocket.on('error', function(err) { + next(err.code !== 'ECONNREFUSED' ? err : null); + }); + testSocket.connect({ path: socketPath }, function() { + // Something's listening here, abort + callback(new Error('port-in-use')); + }); + }, + async.apply(fs.unlink, socketPath), // The socket was stale, kick it out of the way + ], callback); }; }(WebServer));