Skip to content
Snippets Groups Projects
Commit 61b002bc authored by Andy Trevorah's avatar Andy Trevorah
Browse files

added support for overriding redis config

parent f69ac4af
No related branches found
No related tags found
1 merge request!4added support for overriding redis config
Loading
Loading
@@ -52,7 +52,7 @@ Once you've got your `env` instance, here are some things you can do with it
`env.redis` will provide you with a singleton instance of a redis client or a new instance. It will use Redis Sentinel it it's configured.
 
* `env.redis.getClient()` - returns the main singleton Redis client.
* `env.redis.createClient()` - returns a new Redis client.
* `env.redis.createClient([options])` - returns a new Redis client. Uses `redis` config by default.
* `env.redis.quitClient()` - closes a Redis client (don't do this with the main singleton client)
 
## Statistics
Loading
Loading
Loading
Loading
@@ -60,13 +60,16 @@ exports.create = function(configDirectory) {
getClient: function() {
if(mainRedisClient) return mainRedisClient;
 
mainRedisClient = redisClient.create({ config: config, logger: logger });
// no options override for singleton
var options = config.get('redis');
mainRedisClient = redisClient.create(options, logger);
 
return mainRedisClient;
},
 
createClient: function() {
return redisClient.create({ config: config, logger: logger });
createClient: function(options) {
options = options || config.get('redis');
return redisClient.create(options, logger);
},
 
/**
Loading
Loading
@@ -74,7 +77,10 @@ exports.create = function(configDirectory) {
*/
createTransientClient: function(callback) {
var mainClient = this.getClient();
return redisClient.createTransientClient(mainClient, { config: config, logger: logger }, callback);
// no options override for singleton
var options = config.get('redis');
return redisClient.createTransientClient(mainClient, options, logger, callback);
},
 
quitClient: function(client) {
Loading
Loading
Loading
Loading
@@ -9,9 +9,7 @@ var async = require('async');
/**
* Switches redis database
*/
function switchDatabase(client, nconf, logger) {
var redisDb = nconf.get("redis:redisDb");
function switchDatabase(client, redisDb, logger) {
if(redisDb) {
client.select(redisDb, function(err) {
if(err) {
Loading
Loading
@@ -26,8 +24,8 @@ function switchDatabase(client, nconf, logger) {
/**
* Creates a sentinel client
*/
function createSentinelClientInstance(nconf, logger) {
var sentinels = nconf.get("redis:sentinel:hosts").map(function(f) {
function createSentinelClientInstance(sentinelOpts, logger) {
var sentinels = sentinelOpts.hosts.map(function(f) {
var a = f.split(':');
return [a[0], parseInt(a[1], 10)];
});
Loading
Loading
@@ -36,7 +34,7 @@ function createSentinelClientInstance(nconf, logger) {
 
var sentinelClient = RedisSentinel.createClient({
sentinels: sentinels,
masterName: nconf.get("redis:sentinel:master-name")
masterName: sentinelOpts["master-name"]
});
 
['sentinel connect', 'sentinel connected', 'sentinel disconnected',
Loading
Loading
@@ -49,17 +47,17 @@ function createSentinelClientInstance(nconf, logger) {
return sentinelClient;
}
 
function createInstance(nconf, logger) {
function createInstance(options, logger) {
var client;
if(nconf.get('redis:sentinel')) {
client = createSentinelClientInstance(nconf, logger);
if(options.sentinel) {
client = createSentinelClientInstance(options.sentinel, logger);
} else {
var host = nconf.get("redis:host");
var port = nconf.get("redis:port");
var host = options.host;
var port = options.port;
 
client = redis.createClient(port, host);
}
switchDatabase(client, nconf, logger);
switchDatabase(client, options.redisDb, logger);
 
return client;
}
Loading
Loading
@@ -68,13 +66,10 @@ function registerClient(client) {
clients.push(client);
}
 
function setupTransientClient(port, host, options) {
var nconf = options.config;
var logger = options.logger;
function setupTransientClient(port, host, redisDb, logger) {
var client = redis.createClient(port, host);
 
switchDatabase(client, nconf, logger);
switchDatabase(client, redisDb, logger);
 
/*
* Add some logging if the transient client is not closed
Loading
Loading
@@ -91,17 +86,16 @@ function setupTransientClient(port, host, options) {
return client;
}
 
exports.createTransientClient = function(mainClient, options, callback) {
var nconf = options.config;
exports.createTransientClient = function(mainClient, options, logger, callback) {
var host, port;
 
if(nconf.get('redis:sentinel')) {
if(options.sentinel) {
var master = mainClient.activeMasterClient;
 
/* No master yet? Wait... */
if(!master) {
mainClient.on('reconnected', function() {
var client = setupTransientClient(mainClient.activeMasterClient.port, mainClient.activeMasterClient.host, options);
var client = setupTransientClient(mainClient.activeMasterClient.port, mainClient.activeMasterClient.host, options.redisDb, logger);
callback(null, client);
});
 
Loading
Loading
@@ -111,11 +105,11 @@ exports.createTransientClient = function(mainClient, options, callback) {
host = master.host;
port = master.port;
} else {
host = nconf.get("redis:host");
port = nconf.get("redis:port");
host = options.host;
port = options.port;
}
 
var client = setupTransientClient(port, host, options);
var client = setupTransientClient(port, host, options.redisDb, logger);
 
/* Callback in a second */
setImmediate(function() {
Loading
Loading
@@ -141,11 +135,8 @@ shutdown.addHandler('redis', 1, function(callback) {
 
});
 
exports.create = function(options) {
var nconf = options.config;
var logger = options.logger;
var client = createInstance(nconf, logger);
exports.create = function(options, logger) {
var client = createInstance(options, logger);
registerClient(client);
 
return client;
Loading
Loading
@@ -169,4 +160,4 @@ exports.testOnly = {
getClients: function() {
return clients;
}
}
};
Loading
Loading
@@ -33,20 +33,18 @@ function startSentinel() {
}
 
describe('gitter-redis', function() {
var redis1, redis2, sentinel, config, logger;
var redis1, redis2, sentinel, options, logger;
 
before(function(done) {
config = mockConfig({
redis: {
redisDb: 1,
sentinel: {
"master-name": "test-master",
hosts: ["localhost:46379"]
}
options = {
redisDb: 1,
sentinel: {
"master-name": "test-master",
hosts: ["localhost:46379"]
}
});
};
 
logger = require('../lib/logger').create({ config: config });
logger = require('../lib/logger').create({ config: mockConfig({}) });
 
redis1 = startRedisPrimary();
redis2 = startRedisSecondary();
Loading
Loading
@@ -63,7 +61,7 @@ describe('gitter-redis', function() {
 
it('should obtain a connection and release it', function(done) {
 
var mainRedisClient = redisClient.create({ config: config, logger: logger });
var mainRedisClient = redisClient.create(options, logger);
assert.strictEqual(redisClient.testOnly.getClients().length, 1);
assert(mainRedisClient);
 
Loading
Loading
@@ -81,9 +79,9 @@ describe('gitter-redis', function() {
});
 
it('should obtain a transient connection and release it', function(done) {
var mainRedisClient = redisClient.create({ config: config, logger: logger });
var mainRedisClient = redisClient.create(options, logger);
 
redisClient.createTransientClient(mainRedisClient, { config: config, logger: logger }, function(err, temporaryClient) {
redisClient.createTransientClient(mainRedisClient, options, logger, function(err, temporaryClient) {
assert.strictEqual(redisClient.testOnly.getClients().length, 2);
 
assert(temporaryClient);
Loading
Loading
@@ -107,7 +105,7 @@ describe('gitter-redis', function() {
 
it('should obtain a handle failover correctly', function(done) {
this.timeout(15000);
var mainRedisClient = redisClient.create({ config: config, logger: logger });
var mainRedisClient = redisClient.create(options, logger);
mainRedisClient.on('reconnected', function() {
mainRedisClient.set('moo', 'cow', function(err) {
if(err) return done(err);
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment