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.
504 505 506 507 508 509 510 511 512 513 |
# File 'lib/redis/client.rb', line 504 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
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 |
# File 'lib/redis/client.rb', line 515 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
532 533 534 535 536 537 538 539 540 541 542 543 |
# File 'lib/redis/client.rb', line 532 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
570 571 572 573 574 575 576 |
# File 'lib/redis/client.rb', line 570 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
578 579 580 581 582 583 584 585 586 |
# File 'lib/redis/client.rb', line 578 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
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 |
# File 'lib/redis/client.rb', line 545 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 |