diff --git a/src/database/mongo.js b/src/database/mongo.js index be6789389b..fa8e881707 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -264,7 +264,9 @@ function getCollectionStats(db, callback) { mongoModule.close = function (callback) { callback = callback || function () {}; - db.close(callback); + db.close(function (err) { + callback(err); + }); }; mongoModule.socketAdapter = function () { diff --git a/src/database/redis.js b/src/database/redis.js index d5b03ec967..4bbd6ed0da 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -146,7 +146,9 @@ redisModule.checkCompatibilityVersion = function (version, callback) { redisModule.close = function (callback) { callback = callback || function () {}; - redisClient.quit(callback); + redisClient.quit(function (err) { + callback(err); + }); }; redisModule.info = function (cxn, callback) { diff --git a/src/start.js b/src/start.js index b7084dabde..c8b0905b32 100644 --- a/src/start.js +++ b/src/start.js @@ -153,11 +153,21 @@ function restart() { function shutdown(code) { winston.info('[app] Shutdown (SIGTERM/SIGINT) Initialised.'); - require('./database').close(); - winston.info('[app] Database connection closed.'); - require('./webserver').server.close(); - winston.info('[app] Web server closed to connections.'); - - winston.info('[app] Shutdown complete.'); - process.exit(code || 0); + async.waterfall([ + function (next) { + require('./webserver').destroy(next); + }, + function (next) { + winston.info('[app] Web server closed to connections.'); + require('./database').close(next); + }, + ], function (err) { + if (err) { + winston.error(err); + return process.exit(code || 0); + } + winston.info('[app] Database connection closed.'); + winston.info('[app] Shutdown complete.'); + process.exit(code || 0); + }); } diff --git a/src/webserver.js b/src/webserver.js index 23c3315f3d..89e710c9c2 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -55,6 +55,25 @@ server.on('error', function (err) { throw err; }); +// see https://github.com/isaacs/server-destroy/blob/master/index.js +var connections = {}; +server.on('connection', function (conn) { + var key = conn.remoteAddress + ':' + conn.remotePort; + connections[key] = conn; + conn.on('close', function () { + delete connections[key]; + }); +}); + +module.exports.destroy = function (callback) { + server.close(callback); + for (var key in connections) { + if (connections.hasOwnProperty(key)) { + connections[key].destroy(); + } + } +}; + module.exports.listen = function (callback) { callback = callback || function () { }; emailer.registerApp(app); @@ -250,7 +269,7 @@ function setupAutoLocale(app, callback) { function listen(callback) { callback = callback || function () { }; var port = nconf.get('port'); - var isSocket = isNaN(port); + var isSocket = isNaN(port) && !Array.isArray(port); var socketPath = isSocket ? nconf.get('port') : ''; if (Array.isArray(port)) {