@@ -129,6 +129,9 @@ def redis_params
129
129
return connectionParams . merge ( baseParams )
130
130
end
131
131
132
+ TIMEOUT = 5 # Redis only supports Integer values
133
+ private_constant :TIMEOUT
134
+
132
135
def new_redis_instance
133
136
::Redis . new ( redis_params )
134
137
end
@@ -238,7 +241,7 @@ def list_batch_listener(redis, output_queue)
238
241
end
239
242
240
243
def list_single_listener ( redis , output_queue )
241
- item = redis . blpop ( @key , 0 , :timeout => 1 )
244
+ item = redis . blpop ( @key , 0 , :timeout => TIMEOUT )
242
245
return unless item # from timeout or other conditions
243
246
244
247
# blpop returns the 'key' read from as well as the item result
@@ -268,62 +271,67 @@ def redis_runner
268
271
begin
269
272
@redis ||= connect
270
273
yield
274
+ rescue ::Redis ::TimeoutError
275
+ @logger . debug ( "Redis timeout, retrying" )
276
+ retry unless stop?
277
+ rescue ::Redis ::BaseConnectionError , ::Redis ::ProtocolError => e
278
+ @logger . warn ( "Redis connection error" , message : e . message , exception : e . class )
279
+ reset_and_sleep
280
+ retry unless stop?
271
281
rescue ::Redis ::BaseError => e
272
- @logger . warn ( "Redis connection problem" , :exception => e )
273
- # Reset the redis variable to trigger reconnect
274
- @redis = nil
275
- Stud . stoppable_sleep ( 1 ) { stop? }
276
- retry if !stop?
282
+ @logger . warn ( "Redis error" , message : e . message , exception : e . class , backtrace : e . backtrace )
283
+ reset_and_sleep
284
+ retry unless stop?
277
285
end
278
286
end
279
287
288
+ def reset_and_sleep
289
+ # Reset the redis variable to trigger reconnect
290
+ @redis = nil
291
+ Stud . stoppable_sleep ( 1 ) { stop? }
292
+ end
293
+
280
294
# private
281
295
def channel_runner ( output_queue )
282
- redis_runner do
283
- channel_listener ( output_queue )
284
- end
296
+ redis_runner { channel_listener ( output_queue ) }
285
297
end
286
298
287
299
# private
288
300
def channel_listener ( output_queue )
289
- @redis . subscribe ( @key ) do |on |
301
+ @redis . subscribe_with_timeout ( TIMEOUT , @key ) do |on |
290
302
on . subscribe do |channel , count |
291
- @logger . info ( "Subscribed" , :channel => channel , :count => count )
303
+ @logger . debug ( "Subscribed" , :channel => channel , :count => count )
292
304
end
293
305
294
306
on . message do |channel , message |
295
307
queue_event ( message , output_queue , channel )
296
308
end
297
309
298
310
on . unsubscribe do |channel , count |
299
- @logger . info ( "Unsubscribed" , :channel => channel , :count => count )
311
+ @logger . debug ( "Unsubscribed" , :channel => channel , :count => count )
300
312
end
301
313
end
302
314
end
303
315
304
316
def pattern_channel_runner ( output_queue )
305
- redis_runner do
306
- pattern_channel_listener ( output_queue )
307
- end
317
+ redis_runner { pattern_channel_listener ( output_queue ) }
308
318
end
309
319
310
320
# private
311
321
def pattern_channel_listener ( output_queue )
312
- @redis . psubscribe @key do |on |
322
+ @redis . psubscribe_with_timeout ( TIMEOUT , @key ) do |on |
313
323
on . psubscribe do |channel , count |
314
- @logger . info ( "Subscribed" , :channel => channel , :count => count )
324
+ @logger . debug ( "Subscribed" , :channel => channel , :count => count )
315
325
end
316
326
317
327
on . pmessage do |pattern , channel , message |
318
328
queue_event ( message , output_queue , channel )
319
329
end
320
330
321
331
on . punsubscribe do |channel , count |
322
- @logger . info ( "Unsubscribed" , :channel => channel , :count => count )
332
+ @logger . debug ( "Unsubscribed" , :channel => channel , :count => count )
323
333
end
324
334
end
325
335
end
326
336
327
- # end
328
-
329
337
end end end # Redis Inputs LogStash
0 commit comments