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);
 		    }
 		});