Class: Redis::Client::Connector::Sentinel
- Inherits:
-
Redis::Client::Connector
- Object
- Redis::Client::Connector
- Redis::Client::Connector::Sentinel
- Defined in:
- lib/redis/client.rb
Instance Method Summary collapse
- #check(client) ⇒ Object
-
#initialize(options) ⇒ Sentinel
constructor
A new instance of Sentinel.
- #resolve ⇒ Object
- #resolve_master ⇒ Object
- #resolve_slave ⇒ Object
- #sentinel_detect ⇒ Object
Constructor Details
#initialize(options) ⇒ Sentinel
Returns a new instance of Sentinel.
489 490 491 492 493 494 495 496 497 498 |
# File 'lib/redis/client.rb', line 489 def initialize() super() @options[:password] = DEFAULTS.fetch(:password) @options[:db] = DEFAULTS.fetch(:db) @sentinels = @options.delete(:sentinels).dup @role = @options.fetch(:role, "master").to_s @master = @options[:host] end |
Instance Method Details
#check(client) ⇒ Object
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 |
# File 'lib/redis/client.rb', line 500 def check(client) # Check the instance is really of the role we are looking for. # We can't assume the command is supported since it was introduced # recently and this client should work with old stuff. begin role = client.call([:role])[0] rescue Redis::CommandError # Assume the test is passed if we can't get a reply from ROLE... role = @role end if role != @role client.disconnect raise ConnectionError, "Instance role mismatch. Expected #{@role}, got #{role}." end end |
#resolve ⇒ Object
517 518 519 520 521 522 523 524 525 526 527 528 |
# File 'lib/redis/client.rb', line 517 def resolve result = case @role when "master" resolve_master when "slave" resolve_slave else raise ArgumentError, "Unknown instance role #{@role}" end result || (raise ConnectionError, "Unable to fetch #{@role} via Sentinel.") end |
#resolve_master ⇒ Object
555 556 557 558 559 560 561 |
# File 'lib/redis/client.rb', line 555 def resolve_master sentinel_detect do |client| if reply = client.call(["sentinel", "get-master-addr-by-name", @master]) {:host => reply[0], :port => reply[1]} end end end |
#resolve_slave ⇒ Object
563 564 565 566 567 568 569 570 571 |
# File 'lib/redis/client.rb', line 563 def resolve_slave sentinel_detect do |client| if reply = client.call(["sentinel", "slaves", @master]) slave = Hash[*reply.sample] {:host => slave.fetch("ip"), :port => slave.fetch("port")} end end end |
#sentinel_detect ⇒ Object
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 |
# File 'lib/redis/client.rb', line 530 def sentinel_detect @sentinels.each do |sentinel| client = Client.new(@options.merge({ :host => sentinel[:host], :port => sentinel[:port], :reconnect_attempts => 0, })) begin if result = yield(client) # This sentinel responded. Make sure we ask it first next time. @sentinels.delete(sentinel) @sentinels.unshift(sentinel) return result end rescue BaseConnectionError ensure client.disconnect end end raise CannotConnectError, "No sentinels available." end |