@@ -75,7 +75,8 @@ module.exports = (db, server, loggelf) => {
75
75
76
76
// 3) test redis PING
77
77
try {
78
- await db . redis . ping ( ) ;
78
+ // Redis might try to reconnect causing a situation where given ping() command might never return a value, add a fixed timeout
79
+ await promiseRaceTimeoutWrapper ( db . redis . ping ( ) , 10000 ) ;
79
80
} catch ( err ) {
80
81
loggelf ( {
81
82
short_message : '[HEALTH] Redis is down. PING to Redis failed.'
@@ -90,14 +91,15 @@ module.exports = (db, server, loggelf) => {
90
91
91
92
// 4) test if redis is writeable
92
93
try {
93
- await db . redis . hset ( 'health' , `${ currentTimestamp } ` , `${ currentTimestamp } ` ) ;
94
- const data = await db . redis . hget ( `health` , `${ currentTimestamp } ` ) ;
94
+ await promiseRaceTimeoutWrapper ( db . redis . hset ( 'health' , `${ currentTimestamp } ` , `${ currentTimestamp } ` ) , 10000 ) ;
95
+
96
+ const data = await promiseRaceTimeoutWrapper ( db . redis . hget ( `health` , `${ currentTimestamp } ` ) , 10000 ) ;
95
97
96
98
if ( data !== `${ currentTimestamp } ` ) {
97
99
throw Error ( 'Received data is not the same!' ) ;
98
100
}
99
101
100
- await db . redis . hdel ( 'health' , `${ currentTimestamp } ` ) ;
102
+ await promiseRaceTimeoutWrapper ( db . redis . hdel ( 'health' , `${ currentTimestamp } ` ) , 10000 ) ;
101
103
} catch ( err ) {
102
104
loggelf ( {
103
105
short_message :
@@ -116,3 +118,12 @@ module.exports = (db, server, loggelf) => {
116
118
} )
117
119
) ;
118
120
} ;
121
+
122
+ async function promiseRaceTimeoutWrapper ( promise , timeout ) {
123
+ return Promise . race ( [
124
+ promise ,
125
+ new Promise ( ( _resolve , reject ) => {
126
+ setTimeout ( ( ) => reject ( new Error ( 'Async call timed out!' ) ) , timeout ) ;
127
+ } )
128
+ ] ) ;
129
+ }
0 commit comments