From cdf54a4a252b8c2f2071316981573e1a8c7bb53d Mon Sep 17 00:00:00 2001 From: Ben Fonarov <ben.fonarov@gmail.com> Date: Wed, 1 Oct 2014 17:31:09 -0400 Subject: [PATCH 1/4] Catch redis errors and return a 500 while it's down instead of letting sails crash --- lib/hooks/http/initialize.js | 9 +++++++ lib/hooks/sockets/lib/loadSocketIO.js | 37 ++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/hooks/http/initialize.js b/lib/hooks/http/initialize.js index 0573237ab3..d2f0253ae3 100644 --- a/lib/hooks/http/initialize.js +++ b/lib/hooks/http/initialize.js @@ -96,6 +96,15 @@ module.exports = function(sails) { }); + // in case Redis session store fails, return 500 immediately + app.use(function (req, res, next) { + if (!sails.config.session.state) { + sails.log.error('Session store fail'); + return res.send(500); // handle error + } + return next(); + }); + // When Sails is ready, start the express server sails.on('ready', startServer); diff --git a/lib/hooks/sockets/lib/loadSocketIO.js b/lib/hooks/sockets/lib/loadSocketIO.js index 68f9fac355..a73b922b46 100644 --- a/lib/hooks/sockets/lib/loadSocketIO.js +++ b/lib/hooks/sockets/lib/loadSocketIO.js @@ -4,11 +4,11 @@ module.exports = function (sails) { * Module dependencies. */ - var util = require( 'sails-util'), + var util = require( 'sails-util'), SocketServer = require('socket.io'), RedisStore = require('socket.io/lib/stores/redis'), - Redis = require('socket.io/node_modules/redis'), - Socket = { + Redis = require('socket.io/node_modules/redis'), + Socket = { authorization : require('./authorization')(sails), connection : require('./connection')(sails) }; @@ -66,9 +66,9 @@ module.exports = function (sails) { var host = socketConfig.host || '127.0.0.1'; var port = socketConfig.port || 6379; - var pub = createRedisConnection(port, host); - var sub = createRedisConnection(port, host); - var client = createRedisConnection(port, host); + var pub = createRedisConnection(port, host, 'pub'); + var sub = createRedisConnection(port, host, 'sub'); + var client = createRedisConnection(port, host, 'client'); var storeConfig = { redisPub: pub, @@ -136,7 +136,7 @@ module.exports = function (sails) { * `pass` is declared in the socketConfig file. */ - function createRedisConnection(port, host) { + function createRedisConnection(port, host, id) { var socketConfig = sails.config.sockets; @@ -155,6 +155,29 @@ module.exports = function (sails) { client.select(socketConfig.db); } + // If Redis connection ends, catch the error and retry + // until it comes back + + client.on('ready', function() { + sails.log.debug('[OK] Redis ' + id + ' is up. Connections: ', client.connections); + sails.config.session.state = client.connected; + }); + + client.on('end', function() { + sails.log.debug('Redis ' + id + ' has closed.'); + sails.log.debug(id + ' Redis Client State:', client.connected); + sails.log.error('Redis offline'); + sails.config.session.state = client.connected; + }); + + client.on('error', function (err) { + if (/ECONNREFUSED/g.test(err)) { + sails.log.error('Waiting for ' + id + ' redis. Connections:', client.connections); + } else { + sails.log.error('Redis ' + id + ' error event - ' + client.host + ":" + client.port + " - " + err); + } + }); + return client; } From 63b4fb2a5f6759995a90d97b05d8dbea1f649cee Mon Sep 17 00:00:00 2001 From: Ben Fonarov <ben.fonarov@gmail.com> Date: Wed, 1 Oct 2014 17:43:05 -0400 Subject: [PATCH 2/4] sometimes when running the tests we will fail because we haven't set the session state yet, this fixes that --- lib/hooks/http/initialize.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/hooks/http/initialize.js b/lib/hooks/http/initialize.js index d2f0253ae3..26af094f6f 100644 --- a/lib/hooks/http/initialize.js +++ b/lib/hooks/http/initialize.js @@ -97,12 +97,13 @@ module.exports = function(sails) { }); // in case Redis session store fails, return 500 immediately + // if session isn't already set, assume it's ok app.use(function (req, res, next) { - if (!sails.config.session.state) { - sails.log.error('Session store fail'); - return res.send(500); // handle error - } - return next(); + if (sails.config.session.state === false) { + sails.log.error('Session store fail'); + return res.send(500); // handle error + } + return next(); }); // When Sails is ready, start the express server From 18dc873f74e960babb78ec93b32d07b49387716b Mon Sep 17 00:00:00 2001 From: Ben Fonarov <ben.fonarov@gmail.com> Date: Thu, 2 Oct 2014 16:21:54 -0400 Subject: [PATCH 3/4] removed 500 error catch for redis down event, also cleaned up error/debug messages a bit --- lib/hooks/http/initialize.js | 10 ---------- lib/hooks/sockets/lib/loadSocketIO.js | 7 ++----- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/lib/hooks/http/initialize.js b/lib/hooks/http/initialize.js index 26af094f6f..0573237ab3 100644 --- a/lib/hooks/http/initialize.js +++ b/lib/hooks/http/initialize.js @@ -96,16 +96,6 @@ module.exports = function(sails) { }); - // in case Redis session store fails, return 500 immediately - // if session isn't already set, assume it's ok - app.use(function (req, res, next) { - if (sails.config.session.state === false) { - sails.log.error('Session store fail'); - return res.send(500); // handle error - } - return next(); - }); - // When Sails is ready, start the express server sails.on('ready', startServer); diff --git a/lib/hooks/sockets/lib/loadSocketIO.js b/lib/hooks/sockets/lib/loadSocketIO.js index a73b922b46..d7775f7b14 100644 --- a/lib/hooks/sockets/lib/loadSocketIO.js +++ b/lib/hooks/sockets/lib/loadSocketIO.js @@ -160,17 +160,14 @@ module.exports = function (sails) { client.on('ready', function() { sails.log.debug('[OK] Redis ' + id + ' is up. Connections: ', client.connections); - sails.config.session.state = client.connected; }); client.on('end', function() { - sails.log.debug('Redis ' + id + ' has closed.'); - sails.log.debug(id + ' Redis Client State:', client.connected); - sails.log.error('Redis offline'); - sails.config.session.state = client.connected; + sails.log.debug(id + ' Redis Client Connected:', client.connected); }); client.on('error', function (err) { + sails.log.error('Redis client error'); if (/ECONNREFUSED/g.test(err)) { sails.log.error('Waiting for ' + id + ' redis. Connections:', client.connections); } else { From c2e80d487dbc6f1a0592ba942286c007dd1d225b Mon Sep 17 00:00:00 2001 From: Ben Fonarov <ben.fonarov@gmail.com> Date: Thu, 2 Oct 2014 16:33:02 -0400 Subject: [PATCH 4/4] another quick touch up to the error messaging --- lib/hooks/sockets/lib/loadSocketIO.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/hooks/sockets/lib/loadSocketIO.js b/lib/hooks/sockets/lib/loadSocketIO.js index d7775f7b14..d3efe418f8 100644 --- a/lib/hooks/sockets/lib/loadSocketIO.js +++ b/lib/hooks/sockets/lib/loadSocketIO.js @@ -159,19 +159,17 @@ module.exports = function (sails) { // until it comes back client.on('ready', function() { - sails.log.debug('[OK] Redis ' + id + ' is up. Connections: ', client.connections); + sails.log.debug('RedisClient::Events[ready]: [OK] Redis "' + id + '" is up. Connections: ', client.connections); }); client.on('end', function() { - sails.log.debug(id + ' Redis Client Connected:', client.connected); + sails.log.debug('RedisClient::Events[end]: "' + id + '" , Connected:', client.connected); }); client.on('error', function (err) { - sails.log.error('Redis client error'); + sails.log.error('RedisClient::Events[error]: "' + id + '" , ' + err); if (/ECONNREFUSED/g.test(err)) { - sails.log.error('Waiting for ' + id + ' redis. Connections:', client.connections); - } else { - sails.log.error('Redis ' + id + ' error event - ' + client.host + ":" + client.port + " - " + err); + sails.log.error('Waiting for "' + id + '" redis client to come back online. Connections:', client.connections); } });