@@ -6,8 +6,14 @@ var RedisSingleClient = require("./index");
6
6
7
7
exports . debug_mode = true ;
8
8
9
+ var states = {
10
+ NOT_INITIALIZED : 1 ,
11
+ HEALTHY : 2 ,
12
+ UNHEALTHY : 3
13
+ } ;
14
+
9
15
function RedisMetaClient ( masterName , startingSentinels ) {
10
- this . healthy = false ;
16
+ this . state = states . NOT_INITIALIZED ;
11
17
this . master = {
12
18
host : null ,
13
19
port : null
@@ -34,15 +40,20 @@ function RedisMetaClient(masterName, startingSentinels) {
34
40
35
41
this . getSentinels ( startingSentinels , function ( error , sentinelsConfig ) {
36
42
if ( error ) {
43
+ self . emit ( 'stateChange' , states . UNHEALTHY ) ;
37
44
console . log ( error ) ;
38
45
return ;
39
46
}
40
47
41
48
self . initSentinelsConnection ( sentinelsConfig ) ;
42
49
} ) ;
43
50
44
- this . on ( 'healthyChange' , function ( newState ) {
45
- this . healthy = newState ;
51
+ this . on ( 'stateChange' , function ( newState ) {
52
+ console . log ( "stateChange: " + newState ) ;
53
+ this . state = newState ;
54
+ if ( this . state === states . UNHEALTHY ) {
55
+ self . masterUnavailable ( ) ;
56
+ }
46
57
} ) ;
47
58
48
59
this . on ( 'masterAvailable' , function ( availableMaster ) {
@@ -213,13 +224,13 @@ RedisMetaClient.prototype.initSentinelConnection = function(sentinelConfig) {
213
224
214
225
case '+odown' :
215
226
if ( parts [ 0 ] === 'master' ) {
216
- self . emit ( 'healthyChange ' , false ) ;
227
+ self . emit ( 'stateChange ' , states . UNHEALTHY ) ;
217
228
}
218
229
break ;
219
230
220
231
case '-odown' :
221
232
if ( parts [ 0 ] === 'master' ) {
222
- self . emit ( 'healthyChange ' , true ) ;
233
+ self . emit ( 'stateChange ' , states . HEALTHY ) ;
223
234
}
224
235
break ;
225
236
@@ -228,7 +239,7 @@ RedisMetaClient.prototype.initSentinelConnection = function(sentinelConfig) {
228
239
229
240
case '+failover-triggered' :
230
241
if ( parts [ 0 ] === 'master' ) {
231
- self . emit ( 'healthyChange ' , false ) ;
242
+ self . emit ( 'stateChange ' , states . UNHEALTHY ) ;
232
243
}
233
244
break ;
234
245
@@ -326,6 +337,9 @@ RedisMetaClient.prototype.quit = function(){
326
337
} ;
327
338
328
339
RedisMetaClient . prototype . sentinelsConfigured = function ( ) {
340
+ if ( exports . debug_mode ) {
341
+ console . log ( "sentinelsConfigured" ) ;
342
+ }
329
343
this . setupMasterConnection ( ) ;
330
344
} ;
331
345
@@ -366,6 +380,9 @@ RedisMetaClient.prototype.setupMasterConnection = function() {
366
380
if ( selectedMaster ) {
367
381
self . emit ( 'masterAvailable' , selectedMaster ) ;
368
382
}
383
+ else {
384
+ self . emit ( 'stateChange' , states . UNHEALTHY ) ;
385
+ }
369
386
} ;
370
387
371
388
var onResultFromSentinel = function ( error , result ) {
@@ -443,9 +460,18 @@ RedisMetaClient.prototype.masterAvailable = function(availableMaster) {
443
460
masterClient . client . forceReconnectionAttempt ( ) ;
444
461
} ) ;
445
462
446
- this . emit ( 'healthyChange ' , true ) ;
463
+ this . emit ( 'stateChange ' , states . HEALTHY ) ;
447
464
} ;
448
465
466
+ RedisMetaClient . prototype . masterUnavailable = function ( ) {
467
+ console . log ( "masterUnavailable" ) ;
468
+ this . masterClients . forEach ( function ( masterClient ) {
469
+ masterClient . client . flush_and_error ( "Master not available" ) ;
470
+ masterClient . client . enable_offline_queue = false ;
471
+ } ) ;
472
+ } ;
473
+
474
+
449
475
// Return a RedisSingleCLient pointing to the master (or to nothing if there is no master yet)
450
476
RedisMetaClient . prototype . createMasterClient = function ( options ) {
451
477
options = options || { } ;
0 commit comments