From: antirez Date: Wed, 20 May 2009 15:52:47 +0000 (+0200) Subject: Automagically reconnection of RubyRedis X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/3f32f1f691b3ee60fe9f7e472bc605b1ccf2c404?ds=sidebyside;hp=ad0ea27c83f23819c515116117413a1a86555c36 Automagically reconnection of RubyRedis --- diff --git a/client-libraries/ruby_2/rubyredis.rb b/client-libraries/ruby_2/rubyredis.rb index 9be390e3..77b0e9d2 100644 --- a/client-libraries/ruby_2/rubyredis.rb +++ b/client-libraries/ruby_2/rubyredis.rb @@ -19,8 +19,7 @@ class RedisClient @host = opts[:host] @port = opts[:port] @db = opts[:db] - @sock = connect_to_server - call_command(["select",@db]) if @db != 0 + connect_to_server end def to_s @@ -28,7 +27,8 @@ class RedisClient end def connect_to_server - TCPSocket.new(@host, @port, 0) + @sock = TCPSocket.new(@host, @port, 0) + call_command(["select",@db]) if @db != 0 end def method_missing(*argv) @@ -36,6 +36,19 @@ class RedisClient end def call_command(argv) + # this wrapper to raw_call_command handle reconnection on socket + # error. We try to reconnect just one time, otherwise let the error + # araise. + begin + raw_call_command(argv) + rescue Errno::ECONNRESET + @sock.close + connect_to_server + raw_call_command(argv) + end + end + + def raw_call_command(argv) bulk = nil argv[0] = argv[0].to_s.downcase if BulkCommands[argv[0]] @@ -61,6 +74,7 @@ class RedisClient def read_reply line = @sock.gets + raise Errno::ECONNRESET,"Connection lost" if !line case line[0..0] when "-" raise line.strip